# HG changeset patch # User Martin von Zweigbergk # Date 1552599989 25200 # Node ID e1ceefab9bcad1bb472e261d73a5e3fda74fdf18 # Parent dd1ab72be9832584993955dfeb98d46c79602935 rebase: fix crash with in-memory rebase and copies When using regular on-disk rebase, filectx.markcopies() calls to dirstate.copy(), which happily records the copy. Then it's simply ignored if it doesn't matter for the commit (as in the test case I added in the previous patch). Let's do the same for overlayworkingctx. Differential Revision: https://phab.mercurial-scm.org/D6133 diff -r dd1ab72be983 -r e1ceefab9bca mercurial/context.py --- a/mercurial/context.py Thu Mar 14 13:53:20 2019 -0700 +++ b/mercurial/context.py Thu Mar 14 14:46:29 2019 -0700 @@ -1891,10 +1891,8 @@ return self._wrappedctx[path].date() def markcopied(self, path, origin): - if self.isdirty(path): - self._cache[path]['copied'] = origin - else: - raise error.ProgrammingError('markcopied() called on clean context') + self._markdirty(path, exists=True, date=self.filedate(path), + flags=self.flags(path), copied=origin) def copydata(self, path): if self.isdirty(path): @@ -2098,7 +2096,8 @@ del self._cache[path] return keys - def _markdirty(self, path, exists, data=None, date=None, flags=''): + def _markdirty(self, path, exists, data=None, date=None, flags='', + copied=None): # data not provided, let's see if we already have some; if not, let's # grab it from our underlying context, so that we always have data if # the file is marked as existing. @@ -2111,7 +2110,7 @@ 'data': data, 'date': date, 'flags': flags, - 'copied': None, + 'copied': copied, } def filectx(self, path, filelog=None): diff -r dd1ab72be983 -r e1ceefab9bca tests/test-rebase-inmemory.t --- a/tests/test-rebase-inmemory.t Thu Mar 14 13:53:20 2019 -0700 +++ b/tests/test-rebase-inmemory.t Thu Mar 14 14:46:29 2019 -0700 @@ -756,5 +756,7 @@ | o 0: b173517d0057 'a' - $ hg rebase -b 5 -d tip 2>&1 | grep '** ProgrammingError' - ** ProgrammingError: markcopied() called on clean context + $ hg rebase -b 5 -d tip + rebasing 3:ca58782ad1e4 "b" + rebasing 5:71cb43376053 "merge" + note: not rebasing 5:71cb43376053 "merge", its destination already has all its changes