Patchwork revlog: for a delta, when a parent was refused, suggest other parent (issue5481)

login
register
mail settings
Submitter Paul Morelle
Date May 14, 2018, 12:01 p.m.
Message ID <7f059b2d62b30e1fd7ca.1526299300@belenos.localdomain>
Download mbox | patch
Permalink /patch/31587/
State New
Headers show

Comments

Paul Morelle - May 14, 2018, 12:01 p.m.
# HG changeset patch
# User Paul Morelle <paul.morelle@octobus.net>
# Date 1526295914 -7200
#      Mon May 14 13:05:14 2018 +0200
# Node ID 7f059b2d62b30e1fd7ca86d00819395178c6a50b
# Parent  8ba0344f9fb145f5b9b909f1211defc9e0793f68
# EXP-Topic fallback-to-other-parent
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 7f059b2d62b3
revlog: for a delta, when a parent was refused, suggest other parent (issue5481)

Without aggressivemergedeltas, ensure that when we decline the closest parent
(by revision number), the other parent is examined too.

Patch

diff -r 8ba0344f9fb1 -r 7f059b2d62b3 mercurial/revlog.py
--- a/mercurial/revlog.py	Fri May 11 22:07:43 2018 -0400
+++ b/mercurial/revlog.py	Mon May 14 13:05:14 2018 +0200
@@ -326,12 +326,19 @@ 
                 # exclude already lazy tested base if any
                 parents = [p for p in (p1r, p2r)
                            if p != nullrev and p not in tested]
-                if parents and not revlog._aggressivemergedeltas:
-                    # Pick whichever parent is closer to us (to minimize the
-                    # chance of having to build a fulltext).
-                    parents = [max(parents)]
-                tested.update(parents)
-                yield parents
+
+                if not revlog._aggressivemergedeltas and len(parents) == 2:
+                    parents.sort()
+                    # To minimize the chance of having to build a fulltext,
+                    # pick first whichever parent is closest to us (max rev)
+                    yield (parents[1],)
+                    # then the other one (min rev) if the first did not fit
+                    yield (parents[0],)
+                    tested.update(parents)
+                elif len(parents) > 0:
+                    # Test all parents (1 or 2), and keep the best candidate
+                    yield parents
+                    tested.update(parents)
 
             if prev not in tested:
                 # other approach failed try against prev to hopefully save us a