changeset 30305:dc21ea3323c4

manifest: add manifestlog.get to obtain subdirectory instances Previously manifestlog only allowed obtaining root level manifests. Future patches will need direct access to subdirectory manifests as part of changegroup creation, so let's add a get() function that knows how to deal with subdirectories.
author Durham Goode <durham@fb.com>
date Wed, 02 Nov 2016 17:24:06 -0700
parents 1a0c1ad57833
children d4b340bf68c5
files mercurial/manifest.py
diffstat 1 files changed, 33 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/manifest.py	Wed Nov 02 17:33:31 2016 -0700
+++ b/mercurial/manifest.py	Wed Nov 02 17:24:06 2016 -0700
@@ -1265,23 +1265,41 @@
         """Retrieves the manifest instance for the given node. Throws a
         LookupError if not found.
         """
-        if node in self._mancache:
-            cachemf = self._mancache[node]
-            # The old manifest may put non-ctx manifests in the cache, so skip
-            # those since they don't implement the full api.
-            if (isinstance(cachemf, manifestctx) or
-                isinstance(cachemf, treemanifestctx)):
-                return cachemf
+        return self.get('', node)
 
-        if node not in self._revlog.nodemap:
-            raise LookupError(node, self._revlog.indexfile,
-                              _('no node'))
-        if self._treeinmem:
-            m = treemanifestctx(self._repo, '', node)
+    def get(self, dir, node):
+        """Retrieves the manifest instance for the given node. Throws a
+        LookupError if not found.
+        """
+        if dir:
+            if self._revlog._treeondisk:
+                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:
-            m = manifestctx(self._repo, node)
-        if node != revlog.nullid:
-            self._mancache[node] = m
+            if node in self._mancache:
+                cachemf = self._mancache[node]
+                # The old manifest may put non-ctx manifests in the cache, so
+                # skip those since they don't implement the full api.
+                if (isinstance(cachemf, manifestctx) or
+                    isinstance(cachemf, treemanifestctx)):
+                    return cachemf
+
+            if node not in self._revlog.nodemap:
+                raise LookupError(node, self._revlog.indexfile,
+                                  _('no node'))
+            if self._treeinmem:
+                m = treemanifestctx(self._repo, '', node)
+            else:
+                m = manifestctx(self._repo, node)
+            if node != revlog.nullid:
+                self._mancache[node] = m
         return m
 
     def add(self, m, transaction, link, p1, p2, added, removed):