# HG changeset patch # User Pierre-Yves David # Date 1579099746 -3600 # Node ID d58206b70199059036361ba7f4a10f7ac95808a5 # Parent 20e125cdd71973a40edad3eda6e384911ebebcaa nodemap: all check that revision and nodes match in the nodemap More check is always useful. Differential Revision: https://phab.mercurial-scm.org/D7846 diff -r 20e125cdd719 -r d58206b70199 mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py Wed Jan 15 15:48:57 2020 +0100 +++ b/mercurial/revlogutils/nodemap.py Wed Jan 15 15:49:06 2020 +0100 @@ -356,6 +356,19 @@ ret = 1 else: all_revs.remove(r) + nm_rev = _find_node(root, nodemod.hex(index[r][7])) + if nm_rev is None: + msg = b" revision node does not match any entries: %d\n" % r + ui.write_err(msg) + ret = 1 + elif nm_rev != r: + msg = ( + b" revision node does not match the expected revision: " + b"%d != %d\n" % (r, nm_rev) + ) + ui.write_err(msg) + ret = 1 + if all_revs: for r in sorted(all_revs): msg = b" extra revision in nodemap: %d\n" % r @@ -371,3 +384,11 @@ if v is None or isinstance(v, Block): continue yield v + + +def _find_node(block, node): + """find the revision associated with a given node""" + entry = block.get(_to_int(node[0:1])) + if isinstance(entry, dict): + return _find_node(entry, node[1:]) + return entry