changeset 41341:19c590ce8661

unamend: fix unamending of renamed rename Before this patch, we were passing in the result of a status call for a different set of commits than what we calculated copies for, which seemed suspicous to me. The rewritten version gets status and copy information from the same sets of commits. Differential Revision: https://phab.mercurial-scm.org/D5661
author Martin von Zweigbergk <martinvonz@google.com>
date Sun, 20 Jan 2019 22:00:25 -0800
parents c9f1fd82a826
children fe83040400b7
files hgext/uncommit.py tests/test-unamend.t
diffstat 2 files changed, 7 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/uncommit.py	Sun Jan 20 22:00:21 2019 -0800
+++ b/hgext/uncommit.py	Sun Jan 20 22:00:25 2019 -0800
@@ -93,13 +93,13 @@
                          extra=ctx.extra())
     return repo.commitctx(new)
 
-def _fixdirstate(repo, oldctx, newctx, status):
+def _fixdirstate(repo, oldctx, newctx, match=None):
     """ fix the dirstate after switching the working directory from oldctx to
     newctx which can be result of either unamend or uncommit.
     """
     ds = repo.dirstate
     copies = dict(ds.copies())
-    s = status
+    s = newctx.status(oldctx, match=match)
     for f in s.modified:
         if ds[f] == 'r':
             # modified + removed -> removed
@@ -121,11 +121,7 @@
             ds.remove(f)
 
     # Merge old parent and old working dir copies
-    oldcopies = {}
-    for f in (s.modified + s.added):
-        src = oldctx[f].renamed()
-        if src:
-            oldcopies[f] = src[0]
+    oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
     oldcopies.update(copies)
     copies = dict((dst, oldcopies.get(src, src))
                   for dst, src in oldcopies.iteritems())
@@ -181,8 +177,7 @@
 
             with repo.dirstate.parentchange():
                 repo.dirstate.setparents(newid, node.nullid)
-                s = old.p1().status(old, match=match)
-                _fixdirstate(repo, old, repo[newid], s)
+                _fixdirstate(repo, old, repo[newid], match)
 
             scmutil.cleanupnodes(repo, mapping, 'uncommit', fixphase=True)
 
@@ -245,8 +240,7 @@
 
         with dirstate.parentchange():
             dirstate.setparents(newprednode, node.nullid)
-            s = repo.status(predctx, curctx)
-            _fixdirstate(repo, curctx, newpredctx, s)
+            _fixdirstate(repo, curctx, newpredctx)
 
         mapping = {curctx.node(): (newprednode,)}
         scmutil.cleanupnodes(repo, mapping, 'unamend', fixphase=True)
--- a/tests/test-unamend.t	Sun Jan 20 22:00:21 2019 -0800
+++ b/tests/test-unamend.t	Sun Jan 20 22:00:25 2019 -0800
@@ -385,9 +385,9 @@
   A b
     a
   R a
-BROKEN: should indicate that b was renamed to c
   $ hg st --copies
   A c
+    b
   R b
   $ hg revert -qa
   $ rm c
@@ -405,7 +405,7 @@
   A b
     a
   R a
-BROKEN: should indicate that b was renamed to d
   $ hg st --copies
   A d
+    b
   R b