mercurial/revlogutils/deltas.py
changeset 39498 04b75f3a3f2a
parent 39497 5b308a4e6d03
child 39499 51cec7fb672e
--- a/mercurial/revlogutils/deltas.py	Fri Sep 07 11:17:32 2018 -0400
+++ b/mercurial/revlogutils/deltas.py	Fri Sep 07 11:17:33 2018 -0400
@@ -582,6 +582,7 @@
 
     deltalength = revlog.length
     deltaparent = revlog.deltaparent
+    good = None
 
     deltas_limit = textlen * LIMIT_DELTA2TEXT
 
@@ -612,7 +613,9 @@
             # XXX: in the sparse revlog case, group can become large,
             #      impacting performances. Some bounding or slicing mecanism
             #      would help to reduce this impact.
-            yield tuple(group)
+            good = yield tuple(group)
+        if good is not None:
+            break
     yield None
 
 def _findsnapshots(revlog, cache, start_rev):
@@ -847,14 +850,20 @@
         candidaterevs = next(groups)
         while candidaterevs is not None:
             nominateddeltas = []
+            if deltainfo is not None:
+                # if we already found a good delta,
+                # challenge it against refined candidates
+                nominateddeltas.append(deltainfo)
             for candidaterev in candidaterevs:
                 candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh)
                 if isgooddeltainfo(self.revlog, candidatedelta, revinfo):
                     nominateddeltas.append(candidatedelta)
             if nominateddeltas:
                 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
-                break
-            candidaterevs = next(groups)
+            if deltainfo is not None:
+                candidaterevs = groups.send(deltainfo.base)
+            else:
+                candidaterevs = next(groups)
 
         if deltainfo is None:
             deltainfo = self._fullsnapshotinfo(fh, revinfo)