--- 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)