--- 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