revlog: make sure we never use sparserevlog without general delta (
issue6056)
We are getting user report where the delta code tries to use `sparse-revlog`
logic on repository where `generaldelta` is disabled. This can't work so we
ensure the two booleans have a consistent value.
Creating this kind of repository is not expected to be possible the current bug
report point at a clonebundle related bug that is still to be properly isolated
(Yuya Nishihara seems to a have done it).
Corrupting a repository to reproduce the issue is possible. A test using this
method is included in this fix.
--- a/mercurial/revlog.py Wed Jan 30 18:15:38 2019 +0100
+++ b/mercurial/revlog.py Thu Jan 24 18:22:47 2019 -0500
@@ -497,6 +497,9 @@
else:
raise error.RevlogError(_('unknown version (%d) in revlog %s') %
(fmt, self.indexfile))
+ # sparse-revlog can't be on without general-delta (issue6056)
+ if not self._generaldelta:
+ self._sparserevlog = False
self._storedeltachains = True
--- a/mercurial/revlogutils/deltas.py Wed Jan 30 18:15:38 2019 +0100
+++ b/mercurial/revlogutils/deltas.py Thu Jan 24 18:22:47 2019 -0500
@@ -755,7 +755,8 @@
The group order aims at providing fast or small candidates first.
"""
gdelta = revlog._generaldelta
- sparse = revlog._sparserevlog
+ # gate sparse behind general-delta because of issue6056
+ sparse = gdelta and revlog._sparserevlog
curr = len(revlog)
prev = curr - 1
deltachain = lambda rev: revlog._deltachain(rev)[0]
--- a/tests/test-init.t Wed Jan 30 18:15:38 2019 +0100
+++ b/tests/test-init.t Thu Jan 24 18:22:47 2019 -0500
@@ -268,3 +268,25 @@
exporting bookmark test
$ hg -R remote-bookmarks bookmarks
test 0:08b9e9f63b32
+
+Check format constraint
+-----------------------
+
+ $ hg init issue6056 --config format.usegeneraldelta=0 --config format.sparse-revlog=0
+ $ cd issue6056
+ $ echo foo > 1
+ $ echo foo > 2
+ $ echo foo > 3
+ $ echo foo > 4
+ $ echo foo > 5
+ $ hg add *
+
+Build a bogus repository (sparserevlog without general delta)
+
+ $ hg commit -m 'initial changesets'
+ $ echo 'sparserevlog' >> .hg/requires
+ $ for x in `$TESTDIR/seq.py 100`; do
+ > echo $x >> `expr $x % 5 + 1`
+ > hg commit -m $x
+ > done
+ $ cd ..