changeset 20225:d2704c48f417

discovery: stop using nodemap for membership testing Nodemap is not aware of filtering so we need to ask the changelog itself if a node is known. This is probably a bit slower but such check does not dominated discovery time. This is necessary if we want to run discovery on filtered repo.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Fri, 15 Nov 2013 23:28:43 -0500
parents 34d4a037dced
children 76d9364119fc
files mercurial/discovery.py mercurial/treediscovery.py
diffstat 2 files changed, 14 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/discovery.py	Fri Nov 15 23:27:39 2013 -0500
+++ b/mercurial/discovery.py	Fri Nov 15 23:28:43 2013 -0500
@@ -34,9 +34,9 @@
 
     if heads:
         allknown = True
-        nm = repo.changelog.nodemap
+        knownnode = repo.changelog.hasnode # no nodemap until it is filtered
         for h in heads:
-            if nm.get(h) is None:
+            if not knownnode(h):
                 allknown = False
                 break
         if allknown:
@@ -172,8 +172,9 @@
         remotebranches.add(branch)
         known = []
         unsynced = []
+        knownnode = cl.hasnode # do not use nodemap until it is filtered
         for h in heads:
-            if h in cl.nodemap:
+            if knownnode(h):
                 known.append(h)
             else:
                 unsynced.append(h)
@@ -204,11 +205,11 @@
 def _oldheadssummary(repo, remoteheads, outgoing, inc=False):
     """Compute branchmapsummary for repo without branchmap support"""
 
-    cl = repo.changelog
     # 1-4b. old servers: Check for new topological heads.
     # Construct {old,new}map with branch = None (topological branch).
     # (code based on update)
-    oldheads = set(h for h in remoteheads if h in cl.nodemap)
+    knownnode = repo.changelog.hasnode # no nodemap until it is filtered
+    oldheads = set(h for h in remoteheads if knownnode(h))
     # all nodes in outgoing.missing are children of either:
     # - an element of oldheads
     # - another element of outgoing.missing
--- a/mercurial/treediscovery.py	Fri Nov 15 23:27:39 2013 -0500
+++ b/mercurial/treediscovery.py	Fri Nov 15 23:28:43 2013 -0500
@@ -19,7 +19,7 @@
     "heads" is either the supplied heads, or else the remote's heads.
     """
 
-    m = repo.changelog.nodemap
+    knownnode = repo.changelog.hasnode
     search = []
     fetch = set()
     seen = set()
@@ -41,7 +41,7 @@
 
     unknown = []
     for h in heads:
-        if h not in m:
+        if not knownnode(h):
             unknown.append(h)
         else:
             base.add(h)
@@ -71,23 +71,23 @@
             elif n in seenbranch:
                 repo.ui.debug("branch already found\n")
                 continue
-            elif n[1] and n[1] in m: # do we know the base?
+            elif n[1] and knownnode(n[1]): # do we know the base?
                 repo.ui.debug("found incomplete branch %s:%s\n"
                               % (short(n[0]), short(n[1])))
                 search.append(n[0:2]) # schedule branch range for scanning
                 seenbranch.add(n)
             else:
                 if n[1] not in seen and n[1] not in fetch:
-                    if n[2] in m and n[3] in m:
+                    if knownnode(n[2]) and knownnode(n[3]):
                         repo.ui.debug("found new changeset %s\n" %
                                       short(n[1]))
                         fetch.add(n[1]) # earliest unknown
                     for p in n[2:4]:
-                        if p in m:
+                        if knownnode(p):
                             base.add(p) # latest known
 
                 for p in n[2:4]:
-                    if p not in req and p not in m:
+                    if p not in req and not knownnode(p):
                         r.append(p)
                         req.add(p)
             seen.add(n[0])
@@ -114,7 +114,7 @@
             f = 1
             for i in l:
                 repo.ui.debug("narrowing %d:%d %s\n" % (f, len(l), short(i)))
-                if i in m:
+                if knownnode(i):
                     if f <= 2:
                         repo.ui.debug("found new branch changeset %s\n" %
                                           short(p))
@@ -130,7 +130,7 @@
 
     # sanity check our fetch list
     for f in fetch:
-        if f in m:
+        if knownnode(f):
             raise error.RepoError(_("already have changeset ")
                                   + short(f[:4]))