# HG changeset patch # User Pierre-Yves David # Date 1579099737 -3600 # Node ID 20e125cdd71973a40edad3eda6e384911ebebcaa # Parent 78721bbdb2ab1f9fe7b994ed31d8dacb6f54e892 nodemap: add basic checking of the on disk nodemap content The simplest check it so verify we have all the revision we needs, and nothing more. Differential Revision: https://phab.mercurial-scm.org/D7845 diff -r 78721bbdb2ab -r 20e125cdd719 mercurial/debugcommands.py --- a/mercurial/debugcommands.py Wed Jan 15 15:48:47 2020 +0100 +++ b/mercurial/debugcommands.py Wed Jan 15 15:48:57 2020 +0100 @@ -2094,6 +2094,12 @@ _(b'write a (new) persistent binary nodemap on stdin'), ), (b'', b'dump-disk', False, _(b'dump on-disk data on stdin')), + ( + b'', + b'check', + False, + _(b'check that the data on disk data are correct.'), + ), ], ) def debugnodemap(ui, repo, **opts): @@ -2109,6 +2115,11 @@ cl = unfi.changelog data = nodemap.persisted_data(cl) ui.write(data) + elif opts['check']: + unfi = repo.unfiltered() + cl = unfi.changelog + data = nodemap.persisted_data(cl) + return nodemap.check_data(ui, cl.index, data) @command( diff -r 78721bbdb2ab -r 20e125cdd719 mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py Wed Jan 15 15:48:47 2020 +0100 +++ b/mercurial/revlogutils/nodemap.py Wed Jan 15 15:48:57 2020 +0100 @@ -337,3 +337,37 @@ else: b[idx] = _transform_rev(v) return block + + +# debug utility + + +def check_data(ui, index, data): + """verify that the provided nodemap data are valid for the given idex""" + ret = 0 + ui.status((b"revision in index: %d\n") % len(index)) + root = parse_data(data) + all_revs = set(_all_revisions(root)) + ui.status((b"revision in nodemap: %d\n") % len(all_revs)) + for r in range(len(index)): + if r not in all_revs: + msg = b" revision missing from nodemap: %d\n" % r + ui.write_err(msg) + ret = 1 + else: + all_revs.remove(r) + if all_revs: + for r in sorted(all_revs): + msg = b" extra revision in nodemap: %d\n" % r + ui.write_err(msg) + ret = 1 + return ret + + +def _all_revisions(root): + """return all revisions stored in a Trie""" + for block in _walk_trie(root): + for v in block: + if v is None or isinstance(v, Block): + continue + yield v diff -r 78721bbdb2ab -r 20e125cdd719 tests/test-completion.t --- a/tests/test-completion.t Wed Jan 15 15:48:47 2020 +0100 +++ b/tests/test-completion.t Wed Jan 15 15:48:57 2020 +0100 @@ -291,7 +291,7 @@ debugmanifestfulltextcache: clear, add debugmergestate: debugnamecomplete: - debugnodemap: dump-new, dump-disk + debugnodemap: dump-new, dump-disk, check debugobsolete: flags, record-parents, rev, exclusive, index, delete, date, user, template debugp1copies: rev debugp2copies: rev diff -r 78721bbdb2ab -r 20e125cdd719 tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t Wed Jan 15 15:48:47 2020 +0100 +++ b/tests/test-persistent-nodemap.t Wed Jan 15 15:48:57 2020 +0100 @@ -36,6 +36,9 @@ 00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| + $ hg debugnodemap --check + revision in index: 5001 + revision in nodemap: 5001 add a new commit @@ -48,3 +51,6 @@ .hg/store/00changelog.n: size=18 $ f --sha256 .hg/store/00changelog-*.nd --size .hg/store/00changelog-????????????????.nd: size=122880, sha256=bfafebd751c4f6d116a76a37a1dee2a251747affe7efbcc4f4842ccc746d4db9 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002