[PATCH 6 of 6 ctx-minor-fixes] context: define contract for parents

Sean Farley sean at farley.io
Wed Sep 19 01:35:48 EDT 2018


# HG changeset patch
# User Sean Farley <sean at farley.io>
# Date 1528497109 25200
#      Fri Jun 08 15:31:49 2018 -0700
# Branch ctx-minor-fixes
# Node ID 58496e395dd324297748551297d1d572ab762496
# Parent  56222df6e5c8738b9b04881477c166540c50b17a
context: define contract for parents

>From now on, context._parents will be a list of length two, containing
the parent revs while context.parents() will return a list of the parent
contexts for each parent that isn't null.

diff --git a/mercurial/context.py b/mercurial/context.py
index 1871edb..ca54843 100644
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -231,11 +231,17 @@ class basectx(object):
             instabilities.append('content-divergent')
         return instabilities
 
     def parents(self):
         """return contexts for each parent changeset"""
-        return self._parents
+        pl = self._parents
+
+        # maybe should assert that we expect _parents to always be both parents
+        # (even when p2 is null) and to always be revs (e.g. ints)
+        if pl[1] == nullrev:
+            return [changectx(self._repo, pl[0])]
+        return [changectx(self._repo, pl[0]), changectx(self._repo, pl[1])]
 
     def p1(self):
         return self.parents()[0]
 
     def p2(self):
@@ -479,15 +485,11 @@ class changectx(basectx):
     def _manifestdelta(self):
         return self._manifestctx.readdelta()
 
     @propertycache
     def _parents(self):
-        repo = self._repo
-        p1, p2 = repo.changelog.parentrevs(self._rev)
-        if p2 == nullrev:
-            return [changectx(repo, p1)]
-        return [changectx(repo, p1), changectx(repo, p2)]
+        return self._repo.changelog.parentrevs(self._rev)
 
     def changeset(self):
         c = self._changeset
         return (
             c.manifest,
@@ -1298,14 +1300,11 @@ class workingctx(committablectx):
     def hex(self):
         return hex(wdirid)
 
     @propertycache
     def _parents(self):
-        p = self._repo.dirstate.parents()
-        if p[1] == nullid:
-            p = p[:-1]
-        return [changectx(self._repo, x) for x in p]
+        return [self._repo[p].rev() for p in self._repo.dirstate.parents()]
 
     def _fileinfo(self, path):
         # populate __dict__['_manifest'] as workingctx has no _manifestdelta
         self._manifest
         return super(workingctx, self)._fileinfo(path)
@@ -1777,11 +1776,11 @@ class overlayworkingctx(committablectx):
         super(overlayworkingctx, self).__init__(repo)
         self.clean()
 
     def setbase(self, wrappedctx):
         self._wrappedctx = wrappedctx
-        self._parents = [wrappedctx]
+        self._parents = [wrappedctx.rev(), nullrev]
         # Drop old manifest cache as it is now out of date.
         # This is necessary when, e.g., rebasing several nodes with one
         # ``overlayworkingctx`` (e.g. with --collapse).
         util.clearcachedproperty(self, '_manifest')
 
@@ -2245,11 +2244,11 @@ class memctx(committablectx):
         super(memctx, self).__init__(repo, text, user, date, extra)
         self._rev = None
         self._node = None
         parents = [(p or nullid) for p in parents]
         p1, p2 = parents
-        self._parents = [self._repo[p] for p in (p1, p2)]
+        self._parents = [self._repo[p].rev() for p in (p1, p2)]
         files = sorted(set(files))
         self._files = files
         if branch is not None:
             self._extra['branch'] = encoding.fromlocal(branch)
         self.substate = {}
@@ -2391,19 +2390,19 @@ class metadataonlyctx(committablectx):
         else:
             parents = [repo[p] for p in parents if p is not None]
         parents = parents[:]
         while len(parents) < 2:
             parents.append(repo[nullid])
-        p1, p2 = self._parents = parents
+        p1, p2 = self._parents = parents[0].rev(), parents[1].rev()
 
         # sanity check to ensure that the reused manifest parents are
         # manifests of our commit parents
         mp1, mp2 = self.manifestctx().parents
-        if p1 != nullid and p1.manifestnode() != mp1:
+        if p1 != nullrev and self.p1().manifestnode() != mp1:
             raise RuntimeError('can\'t reuse the manifest: '
                                'its p1 doesn\'t match the new ctx p1')
-        if p2 != nullid and p2.manifestnode() != mp2:
+        if p2 != nullrev and self.p2().manifestnode() != mp2:
             raise RuntimeError('can\'t reuse the manifest: '
                                'its p2 doesn\'t match the new ctx p2')
 
         self._files = originalctx.files()
         self.substate = {}
diff --git a/tests/drawdag.py b/tests/drawdag.py
index c417856..2f784c7 100644
--- a/tests/drawdag.py
+++ b/tests/drawdag.py
@@ -288,13 +288,13 @@ class simplecommitctx(context.committabl
             'date': b'0 0',
             'extra': {b'branch': b'default'},
         }
         super(simplecommitctx, self).__init__(repo, name, **opts)
         self._added = added
-        self._parents = parentctxs
+        self._parents = [p.rev() for p in parentctxs]
         while len(self._parents) < 2:
-            self._parents.append(repo[node.nullid])
+            self._parents.append(node.nullrev)
 
     def filectx(self, key):
         return simplefilectx(key, self._added[key])
 
     def commit(self):


More information about the Mercurial-devel mailing list