changeset 4444:52e8c4da4768

hg: optimize get_ref_revision Avoid expensive branch(x) iterating over whole repo just to take max.
author Mads Kiilerich <madski@unity3d.com>
date Tue, 12 Aug 2014 13:08:23 +0200
parents 38a4035426ac
children f9bc28c44f30
files kallithea/lib/vcs/backends/hg/repository.py
diffstat 1 files changed, 4 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/vcs/backends/hg/repository.py	Tue Aug 12 13:08:23 2014 +0200
+++ b/kallithea/lib/vcs/backends/hg/repository.py	Tue Aug 12 13:08:23 2014 +0200
@@ -451,6 +451,7 @@
         """
         Returns revision number for the given reference.
         """
+        ref_name = safe_str(ref_name)
         # lookup up the exact node id
         _revset_predicates = {
                 'branch': 'branch',
@@ -458,9 +459,10 @@
                 'tag': 'tag',
                 'rev': 'id',
             }
-        rev_spec = "max(%s(%%s))" % _revset_predicates[ref_type]
+        # avoid expensive branch(x) iteration over whole repo
+        rev_spec = "%%s & %s(%%s)" % _revset_predicates[ref_type]
         try:
-            revs = self._repo.revs(rev_spec, safe_str(ref_name))
+            revs = self._repo.revs(rev_spec, ref_name, ref_name)
         except (LookupError, ):
             msg = ("Ambiguous identifier %s:%s for %s" % (ref_type, ref_name, self.name))
             raise ChangesetDoesNotExistError(msg)