Switch to side-by-side view

--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -7,6 +7,7 @@
 import tg
 
 from ming.base import Object
+from ming.orm import mapper, session
 
 from allura.lib import utils
 from allura.lib import helpers as h
@@ -65,7 +66,7 @@
 
     # Compute diffs
     cache = {}
-    for i, oid in enumerate(commit_ids):
+    for i, oid in enumerate(reversed(commit_ids)):
         ci = CommitDoc.m.find(dict(_id=oid), validate=False).next()
         compute_diffs(repo._id, cache, ci)
         if (i+1) % 100 == 0:
@@ -289,16 +290,30 @@
     else:
         lhs_tree = tree_index[lhs_ci.tree_id]
     differences = []
+    commit_info = _get_commit_info(rhs_ci)
     for name, lhs_id, rhs_id in _diff_trees(lhs_tree, rhs_tree, tree_index):
         differences.append(
             dict(name=name, lhs_id=lhs_id, rhs_id=rhs_id))
         # Set last commit info
         if rhs_id is not None:
-            _set_last_commit(repo_id, rhs_id, rhs_ci)
+            _set_last_commit(repo_id, rhs_id, commit_info)
         rhs_tree = tree_index.get(rhs_id, None)
         if rhs_tree is not None:
             for oid in _walk_tree(rhs_tree, tree_index):
-                _set_last_commit(repo_id, oid, rhs_ci)
+                _set_last_commit(repo_id, oid, commit_info)
+    # Set last commit data for trees without it in the RHS
+    if True:
+        last_commit_collection = LastCommitDoc.m.session.db[
+            LastCommitDoc.m.collection_name]
+        last_commits = set(
+            d['object_id']
+            for d in last_commit_collection.find(
+                dict(repo_id=repo_id, object_id={'$in': rhs_tree_ids}),
+                { 'object_id': 1, '_id': 0 }))
+        for tree_id in rhs_tree_ids:
+            if tree_id not in last_commits:
+                _set_last_commit(repo_id, tree_id, commit_info)
+   # Build the diffinfo
     di = DiffInfoDoc(dict(
             _id=rhs_ci._id,
             differences=differences))
@@ -397,20 +412,25 @@
     for name, id in rhs_blob_ids.items():
         yield (_fq(name), None, id)
 
-def _set_last_commit(repo_id, oid, commit):
+def _get_commit_info(commit_doc):
+    commit = mapper(Commit).create(commit_doc, dict(instrument=False))
+    session(commit).expunge(commit)
+    return dict(
+        id=commit._id,
+        author=commit.authored.name,
+        author_email=commit.authored.email,
+        date=commit.authored.date,
+        author_url=commit.author_url,
+        href=commit.url(),
+        shortlink=commit.shorthand_id(),
+        summary=commit.summary
+        )
+
+def _set_last_commit(repo_id, oid, commit_info):
     lc = LastCommitDoc(dict(
             _id='%s:%s' % (repo_id, oid),
             repo_id=repo_id,
             object_id=oid,
-            commit_info=dict(
-                id=commit._id,
-                author=commit.authored.name,
-                author_email=commit.authored.email,
-                date=commit.authored.date,
-                # author_url=commit.author_url,
-                # href=commit.url(),
-                # shortlink=commit.shorthand_id(),
-                # summary=commit.summary
-                )))
+            commit_info=commit_info))
     lc.m.save(safe=False)
     return lc