changeset 41954:e1ceefab9bca

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
author Martin von Zweigbergk <martinvonz@google.com>
date Thu, 14 Mar 2019 14:46:29 -0700
parents dd1ab72be983
children e7b84ffb06d9
files mercurial/context.py tests/test-rebase-inmemory.t
diffstat 2 files changed, 9 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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):
--- 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