D7845: nodemap: add basic checking of the on disk nodemap content
Closed by commit rHG20e125cdd719: nodemap: add basic checking of the on disk nodemap content (authored by marmoute). This revision was automatically updated to reflect the committed changes. This revision was not accepted when it landed; it landed in state "Needs Review". REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19893&id=20113 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute added a comment. marmoute updated this revision to Diff 19893. rebase to latest default REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19834&id=19893 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2093,6 +2093,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): @@ -2108,6 +2114,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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute added a comment. marmoute updated this revision to Diff 19834. small doc update on .#s[1] REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19790&id=19834 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -340,3 +340,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2093,6 +2093,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): @@ -2108,6 +2114,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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute updated this revision to Diff 19790. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19761&id=19790 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -339,3 +339,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2093,6 +2093,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): @@ -2108,6 +2114,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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute updated this revision to Diff 19761. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19429&id=19761 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -338,3 +338,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2093,6 +2093,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): @@ -2108,6 +2114,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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute updated this revision to Diff 19429. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19299&id=19429 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -341,3 +341,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2087,6 +2087,12 @@ _(b'write a (binary) serialised (new) nodemap on stdin'), ), ('', b'dump-disk', False, _(b'dump on-disk data on stdin')), +( +'', +b'check', +False, +_(b'check that the data on disk data are correct.'), +), ], ) def debugnodemap(ui, repo, **opts): @@ -2102,6 +2108,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( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute updated this revision to Diff 19299. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7845?vs=19182&id=19299 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7845/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -341,3 +341,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2087,6 +2087,12 @@ _(b'write a (binary) serialised (new) nodemap on stdin'), ), ('', b'dump-disk', False, _(b'dump on-disk data on stdin')), +( +'', +b'check', +False, +_(b'check that the data on disk data are correct.'), +), ], ) def debugnodemap(ui, repo, **args): @@ -2102,6 +2108,11 @@ cl = unfi.changelog data = nodemap.persisted_data(cl) ui.write(data) +elif args['check']: +unfi = repo.unfiltered() +cl = unfi.changelog +data = nodemap.persisted_data(cl) +return nodemap.check_data(ui, cl.index, data) @command( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D7845: nodemap: add basic checking of the on disk nodemap content
marmoute created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY The simplest check it so verify we have all the revision we needs, and nothing more. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D7845 AFFECTED FILES mercurial/debugcommands.py mercurial/revlogutils/nodemap.py tests/test-completion.t tests/test-persistent-nodemap.t CHANGE DETAILS diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -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=245760, sha256=e6ee5d59afaab2cb1afae1077715be280578d29df508bd3dd9d74a994bc555e7 (glob) + $ hg debugnodemap --check + revision in index: 5002 + revision in nodemap: 5002 diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -290,7 +290,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 --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -340,3 +340,37 @@ else: block[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 --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2087,6 +2087,12 @@ _(b'write a (binary) serialised (new) nodemap on stdin'), ), ('', b'dump-disk', False, _(b'dump on-disk data on stdin')), +( +'', +b'check', +False, +_(b'check that the data on disk data are correct.'), +), ], ) def debugnodemap(ui, repo, **args): @@ -2102,6 +2108,11 @@ cl = unfi.changelog data = nodemap.persisted_data(cl) ui.write(data) +elif args['check']: +unfi = repo.unfiltered() +cl = unfi.changelog +data = nodemap.persisted_data(cl) +return nodemap.check_data(ui, cl.index, data) @command( To: marmoute, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel