destutil: use cached branch information instead of query for efficiency
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 24 Feb 2016 23:00:33 +0900
changeset 28236 e333cea74741
parent 28235 c2f0a47069ef
child 28237 a3d73e069f8d
destutil: use cached branch information instead of query for efficiency Before this patch, calculation of "the tipmost branch head on current branch" uses revset query "max(.::(head() and branch(BRANCH)))", but this isn't efficiency, because: - head() predicate lists up heads on all branches, but - branch() predicate eliminates heads on other branches In addition to it, without "literal:" prefix for branch name, branch(BRANCH) tries to (1) look up BRANCH in "repo.branchmap()" and (2) look up BRANCH as symbol name again, if there is no branch matching against BRANCH. The latter looking up is obviously redundant. This patch uses repo.branchheads(closed=True) to get all branch heads on specified branch instead of "head() and branch(BRANCH)" revset query part. This patch also makes catching RepoLookupError meaningless, because it is only raised by revset predicate "branch()". But "currentbranch in repo.branchmap()" can detect whether currentbranch actually exists or not. Therefore, this patch replaces try/except for RepoLookupError by if/else for "currentbranch in repo.branchmap()".
mercurial/destutil.py
--- a/mercurial/destutil.py	Wed Feb 24 23:00:33 2016 +0900
+++ b/mercurial/destutil.py	Wed Feb 24 23:00:33 2016 +0900
@@ -92,12 +92,13 @@
     wc = repo[None]
     movemark = node = None
     currentbranch = wc.branch()
-    try:
-        node = repo.revs('max(.::(head() and branch(%s)))'
-                         , currentbranch).first()
+    if currentbranch in repo.branchmap():
+        heads = repo.branchheads(currentbranch, closed=True)
+        if heads:
+            node = repo.revs('max(.::(%ln))', heads).first()
         if bookmarks.isactivewdirparent(repo):
             movemark = repo['.'].node()
-    except error.RepoLookupError:
+    else:
         if currentbranch == 'default': # no default branch!
             node = repo.lookup('tip') # update to tip
         else: