[PATCH 09 of 10 V3] discovery: add a simple `addinfo` method

Boris Feld boris.feld at octobus.net
Fri Jan 4 17:45:28 EST 2019


# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1545965978 -3600
#      Fri Dec 28 03:59:38 2018 +0100
# Node ID af7fc1d08b16a56c3c0f7ab3abd9a926e79d5749
# Parent  0665d9a3f120a37f5c8755f465eae7d8d51ead15
# EXP-Topic discovery-refactor
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r af7fc1d08b16
discovery: add a simple `addinfo` method

The method can directly process a sample result. This makes the main code
simpler to follow.

diff --git a/mercurial/setdiscovery.py b/mercurial/setdiscovery.py
--- a/mercurial/setdiscovery.py
+++ b/mercurial/setdiscovery.py
@@ -195,6 +195,20 @@ class partialdiscovery(object):
 
         self.undecided.difference_update(self.missing)
 
+    def addinfo(self, sample):
+        """consume an iterable of (rev, known) tuples"""
+        common = set()
+        missing = set()
+        for rev, known in sample:
+            if known:
+                common.add(rev)
+            else:
+                missing.add(rev)
+        if common:
+            self.addcommons(common)
+        if missing:
+            self.addmissings(missing)
+
     def hasinfo(self):
         """return True is we have any clue about the remote state"""
         return self._common.hasbases()
@@ -285,21 +299,12 @@ def findcommonheads(ui, local, remote,
     # treat remote heads (and maybe own heads) as a first implicit sample
     # response
     disco.addcommons(srvheads)
-    commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
-    disco.addcommons(commoninsample)
+    disco.addinfo(zip(sample, yesno))
 
     full = False
     progress = ui.makeprogress(_('searching'), unit=_('queries'))
     while not disco.iscomplete():
 
-        if sample:
-            missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
-            disco.addmissings(missinginsample)
-
-
-        if disco.iscomplete():
-            break
-
         if full or disco.hasinfo():
             if full:
                 ui.note(_("sampling from both directions\n"))
@@ -328,9 +333,7 @@ def findcommonheads(ui, local, remote,
 
         full = True
 
-        if sample:
-            commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
-            disco.addcommons(commoninsample)
+        disco.addinfo(zip(sample, yesno))
 
     # heads(common) == heads(common.bases) since common represents common.bases
     # and all its ancestors


More information about the Mercurial-devel mailing list