diff --git a/hgext/lfs/__init__.py b/hgext/lfs/__init__.py --- a/hgext/lfs/__init__.py +++ b/hgext/lfs/__init__.py @@ -405,7 +405,8 @@ @eh.wrapcommand( - b'verify', opts=[(b'', b'no-lfs', None, _(b'skip all lfs blob content'))] + b'verify', + opts=[(b'', b'no-lfs', None, _(b'skip missing lfs blob content'))], ) def verify(orig, ui, repo, **opts): skipflags = repo.ui.configint(b'verify', b'skipflags') diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py --- a/hgext/lfs/wrapper.py +++ b/hgext/lfs/wrapper.py @@ -225,6 +225,21 @@ return orig(self, rev) +@eh.wrapfunction(revlog, b'_verify_revision') +def _verify_revision(orig, rl, skipflags, state, node): + if _islfs(rl, node=node): + rawtext = rl.rawdata(node) + metadata = pointer.deserialize(rawtext) + + # Don't skip blobs that are stored locally, as local verification is + # relatively cheap and there's no other way to verify the raw data in + # the revlog. + if rl.opener.lfslocalblobstore.has(metadata.oid()): + skipflags &= ~revlog.REVIDX_EXTSTORED + + orig(rl, skipflags, state, node) + + @eh.wrapfunction(context.basefilectx, b'cmp') def filectxcmp(orig, self, fctx): """returns True if text is different than fctx""" diff --git a/tests/test-lfs.t b/tests/test-lfs.t --- a/tests/test-lfs.t +++ b/tests/test-lfs.t @@ -804,6 +804,7 @@ checking manifests crosschecking files in changesets and manifests checking files + lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store checked 5 changesets with 10 changes to 4 files Verify will not try to download lfs blobs, if told not to by the config option @@ -815,6 +816,7 @@ checking manifests crosschecking files in changesets and manifests checking files + lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store checked 5 changesets with 10 changes to 4 files Verify will copy/link all lfs objects into the local store that aren't already