[PATCH 1 of 2] manifest: make revlog verification optional

Durham Goode durham at fb.com
Mon Nov 14 23:27:09 UTC 2016


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1479165447 28800
#      Mon Nov 14 15:17:27 2016 -0800
# Node ID 27209d52a5865422c5ef4ba05cedb28ce32919ed
# Parent  046a7e828ea63ec940ffae1089a33fae7954da2e
manifest: make revlog verification optional

This patches adds an parameter to manifestlog.get() to disable hash checking.
This will be used in an upcoming patch to support treemanifestctx reading
sub-trees without loading them from the revlog. (This is already supported but
does not go through the manifestlog.get() code path)

diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -1278,9 +1278,12 @@ class manifestlog(object):
         """
         return self.get('', node)
 
-    def get(self, dir, node):
+    def get(self, dir, node, verify=True):
         """Retrieves the manifest instance for the given node. Throws a
         LookupError if not found.
+
+        `verify` - if True an exception will be thrown if the node is not in
+                   the revlog
         """
         if node in self._dirmancache.get(dir, ()):
             cachemf = self._dirmancache[dir][node]
@@ -1292,19 +1295,21 @@ class manifestlog(object):
 
         if dir:
             if self._revlog._treeondisk:
-                dirlog = self._revlog.dirlog(dir)
-                if node not in dirlog.nodemap:
-                    raise LookupError(node, dirlog.indexfile,
-                                      _('no node'))
+                if verify:
+                    dirlog = self._revlog.dirlog(dir)
+                    if node not in dirlog.nodemap:
+                        raise LookupError(node, dirlog.indexfile,
+                                          _('no node'))
                 m = treemanifestctx(self._repo, dir, node)
             else:
                 raise error.Abort(
                         _("cannot ask for manifest directory '%s' in a flat "
                           "manifest") % dir)
         else:
-            if node not in self._revlog.nodemap:
-                raise LookupError(node, self._revlog.indexfile,
-                                  _('no node'))
+            if verify:
+                if node not in self._revlog.nodemap:
+                    raise LookupError(node, self._revlog.indexfile,
+                                      _('no node'))
             if self._treeinmem:
                 m = treemanifestctx(self._repo, '', node)
             else:


More information about the Mercurial-devel mailing list