delta-find: adjust the moment when we mark something as "tested"
authorPierre-Yves David <pierre-yves.david@octobus.net>
Sun, 06 Nov 2022 15:03:31 -0500
changeset 49615 4956942c0416
parent 49614 01ccb45b7393
child 49623 da636e7a6d63
delta-find: adjust the moment when we mark something as "tested" In a coming change, not all elements of `group` might get tested. So we need to have more control about when a revision is actually added to the `tested` set. So we move to a more verbose (and more fragile) version.
mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py	Sun Nov 06 12:53:57 2022 -0500
+++ b/mercurial/revlogutils/deltas.py	Sun Nov 06 15:03:31 2022 -0500
@@ -707,21 +707,25 @@
             # filter out revision we tested already
             if rev in tested:
                 continue
-            tested.add(rev)
             # an higher authority deamed the base unworthy (e.g. censored)
             if excluded_bases is not None and rev in excluded_bases:
+                tested.add(rev)
                 continue
             # We are in some recomputation cases and that rev is too high in
             # the revlog
             if target_rev is not None and rev >= target_rev:
+                tested.add(rev)
                 continue
             # filter out delta base that will never produce good delta
             if deltas_limit < revlog.length(rev):
+                tested.add(rev)
                 continue
             if sparse and revlog.rawsize(rev) < (textlen // LIMIT_BASE2TEXT):
+                tested.add(rev)
                 continue
             # no delta for rawtext-changing revs (see "candelta" for why)
             if revlog.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS:
+                tested.add(rev)
                 continue
 
             # If we reach here, we are about to build and test a delta.
@@ -731,9 +735,11 @@
             chainlen, chainsize = revlog._chaininfo(rev)
             # if chain will be too long, skip base
             if revlog._maxchainlen and chainlen >= revlog._maxchainlen:
+                tested.add(rev)
                 continue
             # if chain already have too much data, skip base
             if deltas_limit < chainsize:
+                tested.add(rev)
                 continue
             if sparse and revlog.upperboundcomp is not None:
                 maxcomp = revlog.upperboundcomp
@@ -752,12 +758,14 @@
                     snapshotlimit = textlen >> snapshotdepth
                     if snapshotlimit < lowestrealisticdeltalen:
                         # delta lower bound is larger than accepted upper bound
+                        tested.add(rev)
                         continue
 
                     # check the relative constraint on the delta size
                     revlength = revlog.length(rev)
                     if revlength < lowestrealisticdeltalen:
                         # delta probable lower bound is larger than target base
+                        tested.add(rev)
                         continue
 
             group.append(rev)
@@ -765,6 +773,7 @@
             # XXX: in the sparse revlog case, group can become large,
             #      impacting performances. Some bounding or slicing mecanism
             #      would help to reduce this impact.
+            tested.update(group)
             good = yield tuple(group)
     yield None