context: reuse changectx._copies() in all but workingctx
This moves the dirstate-specific _copies() implementation from
committablectx into workingctx where it should be (I think all
dirstate-specific stuff should be moved into workingctx). The part of
changectx._copies() that is for producing changeset-wide copy dicts
from the filectxs is moved into basectx so it's reused by the other
subclasses. The part of changectx._copies() that's about reading copy
information from the changeset remains there. This fixes in-memory
rebase (and makes `hg convert` able to write copies to changesets).
Differential Revision: https://phab.mercurial-scm.org/D6219
--- a/mercurial/context.py Fri May 10 14:27:22 2019 -0700
+++ b/mercurial/context.py Fri May 10 13:41:42 2019 -0700
@@ -272,6 +272,30 @@
except error.LookupError:
return ''
+ @propertycache
+ def _copies(self):
+ p1copies = {}
+ p2copies = {}
+ p1 = self.p1()
+ p2 = self.p2()
+ narrowmatch = self._repo.narrowmatch()
+ for dst in self.files():
+ if not narrowmatch(dst) or dst not in self:
+ continue
+ copied = self[dst].renamed()
+ if not copied:
+ continue
+ src, srcnode = copied
+ if src in p1 and p1[src].filenode() == srcnode:
+ p1copies[dst] = src
+ elif src in p2 and p2[src].filenode() == srcnode:
+ p2copies[dst] = src
+ return p1copies, p2copies
+ def p1copies(self):
+ return self._copies[0]
+ def p2copies(self):
+ return self._copies[1]
+
def sub(self, path, allowcreate=True):
'''return a subrepo for the stored revision of path, never wdir()'''
return subrepo.subrepo(self, path, allowcreate=allowcreate)
@@ -456,27 +480,7 @@
# Otherwise (config said to read only from filelog, or we are in
# compatiblity mode and there is not data in the changeset), we get
# the copy metadata from the filelogs.
- p1copies = {}
- p2copies = {}
- p1 = self.p1()
- p2 = self.p2()
- narrowmatch = self._repo.narrowmatch()
- for dst in self.files():
- if not narrowmatch(dst) or dst not in self:
- continue
- copied = self[dst].renamed()
- if not copied:
- continue
- src, srcnode = copied
- if src in p1 and p1[src].filenode() == srcnode:
- p1copies[dst] = src
- elif src in p2 and p2[src].filenode() == srcnode:
- p2copies[dst] = src
- return p1copies, p2copies
- def p1copies(self):
- return self._copies[0]
- def p2copies(self):
- return self._copies[1]
+ return super(changectx, self)._copies
def description(self):
return self._changeset.description
def branch(self):
@@ -1206,26 +1210,6 @@
return self._status.removed
def deleted(self):
return self._status.deleted
- @propertycache
- def _copies(self):
- p1copies = {}
- p2copies = {}
- parents = self._repo.dirstate.parents()
- p1manifest = self._repo[parents[0]].manifest()
- p2manifest = self._repo[parents[1]].manifest()
- narrowmatch = self._repo.narrowmatch()
- for dst, src in self._repo.dirstate.copies().items():
- if not narrowmatch(dst):
- continue
- if src in p1manifest:
- p1copies[dst] = src
- elif src in p2manifest:
- p2copies[dst] = src
- return p1copies, p2copies
- def p1copies(self):
- return self._copies[0]
- def p2copies(self):
- return self._copies[1]
def branch(self):
return encoding.tolocal(self._extra['branch'])
def closesbranch(self):
@@ -1579,6 +1563,27 @@
return s
@propertycache
+ def _copies(self):
+ p1copies = {}
+ p2copies = {}
+ parents = self._repo.dirstate.parents()
+ p1manifest = self._repo[parents[0]].manifest()
+ p2manifest = self._repo[parents[1]].manifest()
+ narrowmatch = self._repo.narrowmatch()
+ for dst, src in self._repo.dirstate.copies().items():
+ if not narrowmatch(dst):
+ continue
+ if src in p1manifest:
+ p1copies[dst] = src
+ elif src in p2manifest:
+ p2copies[dst] = src
+ return p1copies, p2copies
+ def p1copies(self):
+ return self._copies[0]
+ def p2copies(self):
+ return self._copies[1]
+
+ @propertycache
def _manifest(self):
"""generate a manifest corresponding to the values in self._status
--- a/tests/test-copies-in-changeset.t Fri May 10 14:27:22 2019 -0700
+++ b/tests/test-copies-in-changeset.t Fri May 10 13:41:42 2019 -0700
@@ -151,8 +151,8 @@
rebasing 2:55d0b405c1b2 "rename a to b" (tip)
merging a and b to b
saved backup bundle to $TESTTMP/rebase-rename/.hg/strip-backup/55d0b405c1b2-78df867e-rebase.hg
-BROKEN: should show the rename
$ hg st --change . --copies
A b
+ a
R a
$ cd ..