# HG changeset patch # User Boris Feld # Date 2018-10-31 10:02:08 # Node ID bafa1c4bb7a8d397f62e0cd75b8064ef1375b753 # Parent 588f1e9a4d1665b8dc02ab409312f59d06414d02 sparse-revlog: only refine delta candidates in the sparse case (issue6006) Starting with 5aef5afa8654, a valid delta parent might be "refined". This allows repository using sparse-revlog to produce better delta chain by using better intermediate snapshot base. However, this refining step was performed in all cases, including for repository not using sparse-revlog. This could produce a strange chain in the general delta case and corrupted repository in the non-general delta case. We now skip this step unless sparse-revlog is in use. In issue 6006, Yuya Nishihara provided a test case using an external repository, so we did not include it. Finding "laboratory" condition to reproduce this case and implementing an efficient test reproducing it is a bit tricky. We do not foresee to have the time to provide one by the release date. Differential Revision: https://phab.mercurial-scm.org/D5197 diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -646,6 +646,11 @@ def _refinedgroups(revlog, p1, p2, cache if good is not None: break + # If sparse revlog is enabled, we can try to refine the available deltas + if not revlog._sparserevlog: + yield None + return + # 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