Patchwork D7846: nodemap: all check that revision and nodes match in the nodemap

login
register
mail settings
Submitter phabricator
Date Feb. 5, 2020, 12:25 a.m.
Message ID <5f96e43f8f328fb1a9d26a286f14ddc6@localhost.localdomain>
Download mbox | patch
Permalink /patch/44938/
State Not Applicable
Headers show

Comments

phabricator - Feb. 5, 2020, 12:25 a.m.
marmoute added a comment.
marmoute updated this revision to Diff 19894.


  rebase to latest default

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7846?vs=19835&id=19894

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7846/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7846

AFFECTED FILES
  mercurial/revlogutils/nodemap.py

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py
--- a/mercurial/revlogutils/nodemap.py
+++ b/mercurial/revlogutils/nodemap.py
@@ -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