mercurial/manifest.py
changeset 30291 dc21ea3323c4
parent 30290 1a0c1ad57833
child 30292 d4b340bf68c5
--- 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):