Improve pruning of branches in outstanding changeset algorithm
authormpm@selenic.com
Tue, 24 May 2005 23:13:25 -0800
changeset 148 c32286d0a665
parent 147 b6d8ed7aeba0
child 149 8cd45e152c83
Improve pruning of branches in outstanding changeset algorithm These changes make the client keep track of what it's seen more carefully to avoid some redundant requests.
mercurial/hg.py
--- a/mercurial/hg.py	Tue May 24 23:11:44 2005 -0800
+++ b/mercurial/hg.py	Tue May 24 23:13:25 2005 -0800
@@ -509,6 +509,8 @@
         unknown = [tip]
         search = []
         fetch = []
+        seen = {}
+        seenbranch = {}
 
         if tip[0] in m:
             self.ui.note("nothing to do!\n")
@@ -516,10 +518,18 @@
 
         while unknown:
             n = unknown.pop(0)
+            seen[n[0]] = 1
+            
+            self.ui.debug("examining %s:%s\n" % (short(n[0]), short(n[1])))
             if n == nullid: break
+            if n in seenbranch:
+                self.ui.debug("branch already found\n")
+                continue
             if n[1] and n[1] in m: # do we know the base?
-                self.ui.debug("found incomplete branch %s\n" % short(n[1]))
+                self.ui.debug("found incomplete branch %s:%s\n"
+                              % (short(n[0]), short(n[1])))
                 search.append(n) # schedule branch range for scanning
+                seenbranch[n] = 1
             else:
                 if n[2] in m and n[3] in m:
                     if n[1] not in fetch:
@@ -527,9 +537,19 @@
                                       short(n[1]))
                         fetch.append(n[1]) # earliest unknown
                         continue
-                for b in remote.branches([n[2], n[3]]):
-                    if b[0] not in m:
-                        unknown.append(b)
+
+                r = []
+                for a in n[2:4]:
+                    if a not in seen: r.append(a)
+                    
+                if r:
+                    self.ui.debug("requesting %s\n" %
+                                " ".join(map(short, r)))
+                    for b in remote.branches(r):
+                        self.ui.debug("received %s:%s\n" %
+                                      (short(b[0]), short(b[1])))
+                        if b[0] not in m and b[0] not in seen:
+                            unknown.append(b)
   
         while search:
             n = search.pop(0)
@@ -783,7 +803,7 @@
     def branches(self, nodes):
         n = " ".join(map(hex, nodes))
         d = self.do_cmd("branches", nodes=n).read()
-        br = [ map(bin, b.split(" ")) for b in d.splitlines() ]
+        br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
         return br
 
     def between(self, pairs):