changeset 39502:e4d4361d0bcd

snapshot: try to refine new snapshot base down the chain There are cases where doing a diff against a snapshot's parent will be shorter than against the snapshot itself. Reusing snapshot not directly related to the revision we are trying to store increase this odd. So once we found a possible candidate, we check the snapshots lower in the chain. This will involve extra processing, but this extra processing will only happen when we are doing building a snapshot, a rare situation.
author Boris Feld <boris.feld@octobus.net>
date Fri, 07 Sep 2018 11:17:35 -0400
parents 993d7e2c8b79
children 5aef5afa8654
files mercurial/revlogutils/deltas.py
diffstat 1 files changed, 11 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlogutils/deltas.py	Fri Sep 07 11:17:34 2018 -0400
+++ b/mercurial/revlogutils/deltas.py	Fri Sep 07 11:17:35 2018 -0400
@@ -647,6 +647,17 @@
         good = yield candidates
         if good is not None:
             break
+
+    # if we have a refinable value, try to refine it
+    if good is not None and good not in (p1, p2) and revlog.issnapshot(good):
+        # refine snapshot down
+        previous = None
+        while previous != good:
+            previous = good
+            base = revlog.deltaparent(good)
+            if base == nullrev:
+                break
+            good = yield (base,)
     # we have found nothing
     yield None