--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -63,22 +63,14 @@
'''
raise NotImplementedError, 'new_commits'
- def commit_parents(self, commit):
+ def commit_parents(self, commit): # pragma no cover
'''Return a list of native commits for the parents of the given (native)
commit'''
raise NotImplementedError, 'commit_parents'
- def commit_context(self, object_id): # pragma no cover
- '''Returns {'prev':Commit, 'next':Commit}'''
- raise NotImplementedError, 'context'
-
def refresh_heads(self): # pragma no cover
'''Sets repository metadata such as heads, tags, and branches'''
raise NotImplementedError, 'refresh_heads'
-
- def refresh_commit(self, ci, seen_object_ids=None, lazy=True): # pragma no cover
- '''Refresh the data in the commit object 'ci' with data from the repo'''
- raise NotImplementedError, 'refresh_commit'
def refresh_commit_info(self, oid, lazy=True): # pragma no cover
'''Refresh the data in the commit with id oid'''
@@ -96,11 +88,7 @@
exhausted).'''
raise NotImplementedError, 'log'
- def compute_tree(self, commit, path='/'):
- '''Used in hg and svn to compute a git-like-tree lazily'''
- raise NotImplementedError, 'compute_tree'
-
- def compute_tree_new(self, commit, path='/'):
+ def compute_tree_new(self, commit, path='/'): # pragma no cover
'''Used in hg and svn to compute a git-like-tree lazily with the new models'''
raise NotImplementedError, 'compute_tree'
@@ -120,8 +108,8 @@
'''Return symbolic branch and tag names for a commit.
Default generic implementation is provided, subclasses
may override if they have more efficient means.'''
- branches = [b.name for b in self._repo.branches if b.object_id == commit.object_id]
- tags = [t.name for t in self._repo.repo_tags if t.object_id == commit.object_id]
+ branches = [b.name for b in self._repo.branches if b.object_id == commit._id]
+ tags = [t.name for t in self._repo.repo_tags if t.object_id == commit._id]
return branches, tags
def url_for_commit(self, commit):
@@ -129,7 +117,7 @@
if isinstance(commit, basestring):
object_id = commit
else:
- object_id = commit.object_id
+ object_id = commit._id
return '%sci/%s/' % (self._repo.url(), object_id)
def _setup_paths(self, create_repo_dir=True):
@@ -204,8 +192,6 @@
return self._impl.all_commit_ids()
def refresh_commit_info(self, oid, seen, lazy=True):
return self._impl.refresh_commit_info(oid, seen, lazy)
- def commit_context(self, commit):
- return self._impl.commit_context(commit)
def open_blob(self, blob):
return self._impl.open_blob(blob)
def blob_size(self, blob):
@@ -216,8 +202,6 @@
return self._impl.symbolics_for_commit(commit)
def url_for_commit(self, commit):
return self._impl.url_for_commit(commit)
- def compute_tree(self, commit, path='/'):
- return self._impl.compute_tree(commit, path)
def compute_tree_new(self, commit, path='/'):
return self._impl.compute_tree_new(commit, path)
@@ -328,113 +312,12 @@
if asbool(tg.config.get('scm.new_refresh')):
refresh_repo(self, all_commits, notify)
notify = False # don't double notify
-
- self.status = 'analyzing'
- session(self).flush()
- sess = session(Commit)
- log.info('Refreshing repository %s', self)
- commit_ids = self._impl.new_commits(all_commits)
- log.info('... %d new commits', len(commit_ids))
- # Refresh history
- seen_object_ids = set()
- commit_msgs = []
- base_url = tg.config.get('base_url', 'sourceforge.net')
- i=0
- for i, oid in enumerate(commit_ids):
- if len(seen_object_ids) > 10000: # pragma no cover
- log.info('... flushing seen object cache')
- seen_object_ids = set()
- ci, isnew = Commit.upsert(oid)
- if not isnew and not all_commits:
- sess.expunge(ci)
- continue
- ci.set_context(self)
- self._impl.refresh_commit(ci, seen_object_ids, lazy=not all_commits)
- if (i+1) % self.BATCH_SIZE == 0:
- log.info('...... flushing %d commits (%d total)',
- self.BATCH_SIZE, (i+1))
- sess.flush()
- sess.clear()
- if notify:
- Feed.post(
- self,
- title='New commit',
- description='%s<br><a href="%s%s">View Changes</a>' % (
- h.really_unicode(ci.summary),config.common_prefix,ci.url()),
- author_link = ci.author_url,
- author_name = ci.authored.name,
- )
- branches = ci.symbolic_ids[0]
- commit_msgs.append('%s: %s by %s %s%s' % (
- ",".join(b for b in branches),
- h.really_unicode(ci.summary), h.really_unicode(ci.committed.name), base_url, ci.url()))
- if commit_msgs:
- if len(commit_msgs) > 1:
- subject = '%d new commits to %s %s' % (
- len(commit_msgs), self.app.project.name, self.app.config.options.mount_label)
- text='\n\n'.join(commit_msgs)
- else:
- subject = '%s committed to %s %s: %s' % (
- h.really_unicode(ci.committed.name),
- self.app.project.name,
- self.app.config.options.mount_label,
- h.really_unicode(ci.summary))
- ci.set_context(self)
- branches = ci.symbolic_ids[0]
- message = "%s: %s %s%s" % (",".join(b for b in branches),
- ci.message,
- base_url, ci.url())
- text = h.really_unicode(message)
- Notification.post(
- artifact=self,
- topic='metadata',
- subject=subject,
- text=text)
- log.info('...... flushing %d commits (%d total)',
- (i+1) % self.BATCH_SIZE, i+1)
- sess.flush()
- sess.clear()
- # Mark all commits in this repo as being in this repo
- all_commit_ids = self._impl.new_commits(True)
- Commit.query.update(
- dict(
- object_id={'$in':all_commit_ids},
- repositories={'$ne':self._id}),
- {'$push':dict(repositories=self._id)},
- upsert=False, multi=True)
- if all_commits:
- LastCommitFor.query.remove(dict(repo_id=self._id))
- self.compute_diffs()
- log.info('... refreshed repository %s. Found %d new commits',
- self, len(commit_ids))
self.status = 'ready'
for head in self.heads + self.branches + self.repo_tags:
ci = self.commit(head.object_id)
if ci is not None:
head.count = ci.count_revisions()
session(self).flush()
- return len(commit_ids)
-
- def compute_diffs(self):
- commit_ids = self._impl.new_commits(all_commits=True)
- sess = session(Commit)
- # Compute diffs on all commits
- log.info('... computing diffs')
- i=0
- for i, oid in enumerate(commit_ids):
- ci = self._impl.commit(oid)
- ci.tree.set_last_commit(ci, self)
- if not ci.diffs_computed:
- ci.compute_diffs()
- if (i+1) % self.BATCH_SIZE == 0:
- log.info('...... flushing %d commits (%d total)',
- self.BATCH_SIZE, (i+1))
- sess.flush()
- sess.clear()
- log.info('...... flushing %d commits (%d total)',
- (i+1) % self.BATCH_SIZE, i+1)
- sess.flush()
- sess.clear()
def push_upstream_context(self):
project, rest=h.find_project(self.upstream_repo.name)
@@ -451,8 +334,9 @@
return MergeRequest.query.find(q).count()
def get_last_commit(self, obj):
- lc = LastCommitFor.query.get(
- repo_id=self._id, object_id=obj.object_id)
+ from .repo import LastCommitDoc
+ lc = LastCommitDoc.m.get(
+ repo_id=self._id, object_id=obj._id)
if lc is None:
return dict(
author=None,
@@ -460,10 +344,9 @@
author_url=None,
date=None,
id=None,
- href=None,
shortlink=None,
summary=None)
- return lc.last_commit
+ return lc.commit_info
@property
def forks(self):
@@ -522,12 +405,13 @@
return self._commits()
def _commits(self):
+ from .repo import Commit
result = []
next = [ self.downstream.commit_id ]
while next:
oid = next.pop(0)
- ci = Commit.query.get(object_id=oid)
- if self.app.repo._id in ci.repositories:
+ ci = Commit.query.get(_id=oid)
+ if self.app.repo._id in ci.repo_ids:
continue
result.append(ci)
next += ci.parent_ids
@@ -1152,6 +1036,7 @@
else:
return '<change %s>' % (self.a_path)
+
class GitLikeTree(object):
'''
A tree node similar to that which is used in git