# HG changeset patch # User Jun Wu # Date 1494779886 25200 # Node ID a2ab9ebcd85b09e33d3036ceccb2dff6f6353e79 # Parent df3cf9422e1bb0287f281fd169fb0a8673bd547b verify: add a config option to skip certain flag processors Previously, "hg verify" verifies everything, which could be undesirable when there are expensive flag processor contents. This patch adds a "verify.skipflags" developer config. A flag processor will be skipped if (flag & verify.skipflags) == 0. In the LFS usecase, that means "hg verify --config verify.skipflags=8192" will not download all LFS blobs, which could be too large to be stored locally. Note: "renamed" is also skipped since its default implementation may call filelog.data() which will trigger the flag processor. diff -r df3cf9422e1b -r a2ab9ebcd85b mercurial/verify.py --- a/mercurial/verify.py Mon May 15 09:35:27 2017 -0700 +++ b/mercurial/verify.py Sun May 14 09:38:06 2017 -0700 @@ -49,6 +49,8 @@ self.lrugetctx = util.lrucachefunc(repo.changectx) self.refersmf = False self.fncachewarned = False + # developer config: verify.skipflags + self.skipflags = repo.ui.configint('verify', 'skipflags') def warn(self, msg): self.ui.warn(msg + "\n") @@ -427,8 +429,12 @@ # 2. hash check: depending on flag processor, we may need to # use either "text" (external), or "rawtext" (in revlog). try: - fl.read(n) # side effect: read content and do checkhash - rp = fl.renamed(n) + skipflags = self.skipflags + if skipflags: + skipflags &= fl.flags(i) + if not skipflags: + fl.read(n) # side effect: read content and do checkhash + rp = fl.renamed(n) # the "L1 == L2" check l1 = fl.rawsize(i) l2 = len(fl.revision(n, raw=True)) diff -r df3cf9422e1b -r a2ab9ebcd85b tests/test-verify.t --- a/tests/test-verify.t Mon May 15 09:35:27 2017 -0700 +++ b/tests/test-verify.t Sun May 14 09:38:06 2017 -0700 @@ -317,3 +317,47 @@ checking files 1 files, 1 changesets, 1 total revisions $ cd .. + +test flag processor and skipflags + + $ hg init skipflags + $ cd skipflags + $ cat >> .hg/hgrc < [extensions] + > flagprocesor=$RUNTESTDIR/flagprocessorext.py + > EOF + $ echo '[BASE64]content' > base64 + $ hg commit -Aqm 'flag processor content' base64 + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 1 files, 1 changesets, 1 total revisions + + $ cat >> $TESTTMP/break-base64.py < from __future__ import absolute_import + > import base64 + > base64.b64decode=lambda x: x + > EOF + $ cat >> .hg/hgrc < breakbase64=$TESTTMP/break-base64.py + > EOF + + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + base64@0: unpacking 794cee7777cb: integrity check failed on data/base64.i:0 + 1 files, 1 changesets, 1 total revisions + 1 integrity errors encountered! + (first damaged changeset appears to be 0) + [1] + $ hg verify --config verify.skipflags=2147483647 + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 1 files, 1 changesets, 1 total revisions +