branchmap: check node against changelog instead of repo
authorDurham Goode <durham@fb.com>
Mon, 07 Mar 2016 17:26:47 -0800
changeset 28364 f1460af18c50
parent 28363 1f94ef2bd88d
child 28365 cd599bc179fb
branchmap: check node against changelog instead of repo Testing 'node in repo' requires constructing a changectx, which is a little expensive. Testing 'repo.changelog.hasnode(node)' is notably faster. This saves 10-20ms off of every command, when testing a few thousand nodes from the branch cache. I considered changing the implementation of localrepository.__contains__ so every place would benefit from the change, but since localrepository.__contains__ uses changectx to check if the commit exists, it means it supports a wider range of possible inputs (like revs, hashes, '.', etc), so it seemed unnecessarily risky.
mercurial/branchmap.py
--- a/mercurial/branchmap.py	Mon Feb 29 09:26:43 2016 -0800
+++ b/mercurial/branchmap.py	Mon Mar 07 17:26:47 2016 -0800
@@ -55,6 +55,7 @@
         if not partial.validfor(repo):
             # invalidate the cache
             raise ValueError('tip differs')
+        cl = repo.changelog
         for l in lines:
             if not l:
                 continue
@@ -62,9 +63,9 @@
             if state not in 'oc':
                 raise ValueError('invalid branch state')
             label = encoding.tolocal(label.strip())
-            if not node in repo:
-                raise ValueError('node %s does not exist' % node)
             node = bin(node)
+            if not cl.hasnode(node):
+                raise ValueError('node %s does not exist' % hex(node))
             partial.setdefault(label, []).append(node)
             if state == 'c':
                 partial._closednodes.add(node)