changeset 19129:bd19587a3347 stable

revert: ensure that copies and renames are honored (issue3920) Previously, we restored the states of files, but not the additional information the dirstate uses to track copies and renames.
author Bryan O'Sullivan <bryano@fb.com>
date Fri, 03 May 2013 12:40:17 -0700
parents f4930b533d55
children 70f0d1da36b0 af3b651505e2
files mercurial/cmdutil.py tests/test-revert.t
diffstat 2 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/cmdutil.py	Fri May 03 09:44:50 2013 -0700
+++ b/mercurial/cmdutil.py	Fri May 03 12:40:17 2013 -0700
@@ -2055,6 +2055,12 @@
                 checkout(f)
                 normal(f)
 
+            copied = copies.pathcopies(repo[parent], ctx)
+
+            for f in add[0] + undelete[0] + revert[0]:
+                if f in copied:
+                    repo.dirstate.copy(copied[f], f)
+
             if targetsubs:
                 # Revert the subrepos on the revert list
                 for sub in targetsubs:
--- a/tests/test-revert.t	Fri May 03 09:44:50 2013 -0700
+++ b/tests/test-revert.t	Fri May 03 12:40:17 2013 -0700
@@ -275,4 +275,28 @@
   $ hg revert --no-backup ignored removed
   $ hg st -mardi
 
+someone set up us the copies
+
+  $ rm .hgignore
+  $ hg update -C
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg mv ignored allyour
+  $ hg copy removed base
+  $ hg commit -m rename
+
+copies and renames, you have no chance to survive make your time (issue3920)
+
+  $ hg update '.^'
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg revert -rtip -a
+  adding allyour
+  adding base
+  removing ignored
+  $ hg status -C
+  A allyour
+    ignored
+  A base
+    removed
+  R ignored
+
   $ cd ..