changeset 1002:fa23c454c528

manifest: update to work with new manifest classes in core Core hg has refactored the manifest logic to remove the manifest class. So we need to update our use of manifests to use manifestlog and manifestctx instead. Tested this by running the tests against hg 3.8, 3.9, 4.0, and @ (c27614f2dec).
author Durham Goode <durham@fb.com>
date Thu, 17 Nov 2016 16:22:42 -0800
parents d0ce6eaebe7b
children 6d1c19dceaf4
files hggit/overlay.py
diffstat 1 files changed, 45 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/overlay.py
+++ b/hggit/overlay.py
@@ -9,6 +9,7 @@
     changelog,
     manifest,
     context,
+    util,
 )
 from mercurial.node import bin, hex, nullid
 
@@ -308,14 +309,45 @@
     def __len__(self):
         return len(self.repo.handler.repo) + len(self.repo.revmap)
 
-class overlaymanifestlog(overlayrevlog):
+class overlayoldmanifestlog(overlayrevlog):
     def read(self, sha):
         if sha == nullid:
             return manifest.manifestdict()
         return overlaymanifest(self.repo, sha)
 
     def __getitem__(self, sha):
-        return self.read(sha)
+        return overlaymanifestctx(self.repo, sha)
+
+class overlaymanifestrevlog(overlayrevlog):
+    pass
+
+class overlaymanifestctx(object):
+    def __init__(self, repo, node):
+        self._repo = repo
+        self._node = node
+
+    def read(self):
+        return overlaymanifest(self._repo, self._node)
+
+try:
+    class overlaymanifestlog(manifest.manifestlog):
+        def __init__(self, repo):
+            self._repo = repo
+
+        # Needed for 4.0, since __getitem__ did not redirect to get() in that
+        # release.
+        def __getitem__(self, node):
+            return self.get('', node)
+
+        def get(self, dir, node):
+            if dir:
+                raise RuntimeError("hggit doesn't support treemanifests")
+            if node == nullid:
+                return manifest.manifestctx()
+            return overlaymanifestctx(self._repo, node)
+except AttributeError:
+    # manifestlog did not exist prior to 4.0
+    pass
 
 class overlaychangelog(overlayrevlog):
     def read(self, sha):
@@ -336,9 +368,13 @@
         self.handler = handler
 
         self.changelog = overlaychangelog(self, handler.repo.changelog)
-        self.manifest = overlaymanifestlog(self, handler.repo.manifest)
-        # new as of mercurial 3.9+
-        self.manifestlog = self.manifest
+        if util.safehasattr(handler.repo, 'manifest'):
+            self.manifest = overlayoldmanifestlog(self, handler.repo.manifest)
+            # new as of mercurial 3.9+
+            self.manifestlog = self.manifest
+        else:
+            # no more manifest class as of 4.1
+            self.manifestlog = overlaymanifestlog(self)
 
         # for incoming -p
         self.root = handler.repo.root
@@ -360,6 +396,10 @@
         except (AttributeError, ImportError):
             pass
 
+    def _constructmanifest(self):
+        return overlaymanifestrevlog(self,
+                self.handler.repo._constructmanifest())
+
     def __getitem__(self, n):
         if n not in self.revmap:
             return self.handler.repo[n]