# HG changeset patch # User Pierre-Yves David # Date 2019-03-06 14:06:53 # Node ID 7755b89cadaf94a4214f989e333ef51afdc12cfc # Parent 496ac8a02380abfe77bad93a9722456ed5e86a6a 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 self._level >= VERIFY_FULL: + try: + # Various issues can affect manifest. So we read each full + # text from storage. This triggers the checks from the core + # code (eg: hash verification, filename are ordered, etc.) + 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()