Mercurial > hg > hg-git
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]