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