[PATCH 4 of 4] verify: also check full manifest validity during verify runs
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Apr 16 19:38:42 EDT 2019
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at octobus.net>
# Date 1551881213 -3600
# Wed Mar 06 15:06:53 2019 +0100
# Node ID ed796867a06764cd78a57b2ed0249353f5809319
# Parent 9bec7491e9b4cabdfa4d264e5213b1f416ec2607
# EXP-Topic verify
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r ed796867a067
verify: also check full manifest validity during verify runs
Before this changes, `hg verify` only checked if a manifest revision existed and
referenced the proper files. However it never checked the manifest revision
content itself.
Mercurial is expecting manifest entries to be sorted and will crash otherwise.
Since `hg verify` did not attempted a full restoration of manifest entry, it
could ignore this kind of corruption.
This new check significantly increases the cost of a `hg verify` run. This
especially affects large repository not using `sparse-revlog`. For now, this is
hidden behind the `--full` experimental flag.
diff --git a/mercurial/verify.py b/mercurial/verify.py
--- a/mercurial/verify.py
+++ b/mercurial/verify.py
@@ -337,6 +337,16 @@ class verifier(object):
filenodes.setdefault(fullpath, {}).setdefault(fn, lr)
except Exception as inst:
self._exc(lr, _("reading delta %s") % short(n), inst, label)
+ if not dir and self._level >= VERIFY_FULL:
+ try:
+ # Manifest not in sorted order are invalid and will crash
+ # Mercurial. We restore each entry to make sure they are
+ # ordered.
+ mfdelta = mfl.get(dir, n).read()
+ except Exception as inst:
+ self._exc(lr, _("reading full manifest %s") % short(n),
+ inst, label)
+
if not dir:
progress.complete()
More information about the Mercurial-devel
mailing list