diff --git a/hgext3rd/fastverify.py b/hgext3rd/fastverify.py new file mode 100644 --- /dev/null +++ b/hgext3rd/fastverify.py @@ -0,0 +1,57 @@ +# fastverify.py +# +# Copyright 2017 Facebook, Inc. +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +""" +disables parts of hg verify + +Manifest verification can be extremely slow on large repos, so this extension +disables it if ``verify.skipmanifests`` is True.:: + + [verify] + skipmanifests = true +""" + +from __future__ import absolute_import + +from mercurial import ( + extensions, + verify +) +from mercurial.i18n import _ + +testedwith = 'ships-with-fb-hgext' + +class fastverifier(verify.verifier): + def __init__(self, *args, **kwargs): + super(fastverifier, self).__init__(*args, **kwargs) + + def _verifymanifest(self, *args, **kwargs): + if self.ui.configbool("verify", "skipmanifests"): + self.ui.warn(_("verify.skipmanifests is enabled; skipping " + "verification of manifests\n")) + return [] + + return super(fastverifier, self)._verifymanifest(*args, **kwargs) + + def _crosscheckfiles(self, *args, **kwargs): + if self.ui.configbool("verify", "skipmanifests"): + return + + return super(fastverifier, self)._crosscheckfiles(*args, **kwargs) + + def _verifyfiles(self, *args, **kwargs): + if self.ui.configbool("verify", "skipmanifests"): + return 0, 0 + + return super(fastverifier, self)._verifyfiles(*args, **kwargs) + +def extsetup(ui): + extensions.wrapfunction(verify, 'verify', _verify) + +def _verify(orig, repo): + with repo.lock(): + return fastverifier(repo).verify() diff --git a/tests/test-fastverify.t b/tests/test-fastverify.t new file mode 100644 --- /dev/null +++ b/tests/test-fastverify.t @@ -0,0 +1,25 @@ + $ cat >> $HGRCPATH << EOF + > [extensions] + > drawdag=$RUNTESTDIR/drawdag.py + > fastverify=$TESTDIR/../hgext3rd/fastverify.py + > EOF + +Turn manifest verification on and off: + $ hg init repo1 + $ cd repo1 + $ hg debugdrawdag <<'EOS' + > b c + > |/ + > a + > EOS + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 3 files, 3 changesets, 3 total revisions + $ echo "[verify]" >> $HGRCPATH + $ echo "skipmanifests=1" >> $HGRCPATH + $ hg verify + [verify] disable is set in config; skipping deep verification of repo + [1]