Mercurial > hg
changeset 42291:a13b30555ffb
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
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 10 May 2019 13:41:42 -0700 |
parents | e79aeb518aa1 |
children | 491855ea9d62 |
files | mercurial/context.py tests/test-copies-in-changeset.t |
diffstat | 2 files changed, 47 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- 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 ..