# HG changeset patch # User Pierre-Yves David # Date 2023-04-19 16:16:19 # Node ID 0232571255d3a9331136bd3c53b1964e82c79586 # Parent ca1522fe4ec8afcf10873de1da118489e86d2f2d delta-find: never do anything fancy when general delta is off Without general delta, the only option is to do a delta against the previous revision in the revlog, or to do a full snapshot. So no need to dive into the more complicated logic. This prevent Mercurial to misbehave when applying remote deltas when `pulled-delta-reuse-policy` was set to "try-base" or "forced" and would produce and store invalid deltas. We add an associated tests to make sure this scenario is covered by tests. There are more code to cleanup after this, but I what to keep the fixing patch simple. diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -687,6 +687,12 @@ def _candidategroups( if target_rev is None: target_rev = len(revlog) + if not revlog._generaldelta: + # before general delta, there is only one possible delta base + yield (target_rev - 1,) + yield None + return + if ( cachedelta is not None and nullrev == cachedelta[0] diff --git a/tests/test-pullling-to-general-delta.t b/tests/test-pullling-to-general-delta.t new file mode 100644 --- /dev/null +++ b/tests/test-pullling-to-general-delta.t @@ -0,0 +1,196 @@ +============================================================================ +Pulling from modern to a non-general delta target (and other related checks) +============================================================================ + +There is various issue that can arise when we update the code with modern +storage in mind while working on delta processing. So this file is meant for +various scenario that might break in the future or have break in the past. + +Setup +===== + +Create a modern server with an older clone + + $ cat << EOF >> $HGRCPATH + > [command-templates] + > log = "{desc} {tags}\n" + > EOF + + $ hg init server + + $ hg clone --quiet --pull server client --config format.usegeneraldelta=no + $ hg debugformat -R client | grep generaldelta + generaldelta: no + +Create some complexe history + + $ cd server + $ hg debugbuilddag -n '.+3:a$.+5:b/a:k$.+7:c/b:l$.+6:d/a:m