revert: fix edition of newly added file during --interactive
authorLaurent Charignon <lcharignon@fb.com>
Thu, 21 May 2015 14:34:24 -0700
changeset 25259 5b05f10c5024
parent 25258 f37a69ec3f47
child 25260 8fa3e995a375
revert: fix edition of newly added file during --interactive Before this patch: editing hunks of newly added file when performing a revert --interactive had no effect: the edits were discarded. After this patch, the edits are taken into account.
mercurial/cmdutil.py
tests/test-revert-interactive.t
--- a/mercurial/cmdutil.py	Thu May 21 14:25:57 2015 -0700
+++ b/mercurial/cmdutil.py	Thu May 21 14:34:24 2015 -0700
@@ -3123,6 +3123,7 @@
         else:
             normal = repo.dirstate.normal
 
+    newlyaddedandmodifiedfiles = set()
     if interactive:
         # Prompt the user for changes to revert
         torevert = [repo.wjoin(f) for f in actions['revert'][0]]
@@ -3137,6 +3138,7 @@
         except patch.PatchError, err:
             raise util.Abort(_('error parsing patch: %s') % err)
 
+        newlyaddedandmodifiedfiles = newandmodified(chunks, originalchunks)
         # Apply changes
         fp = cStringIO.StringIO()
         for c in chunks:
@@ -3160,8 +3162,10 @@
                 repo.dirstate.normallookup(f)
 
     for f in actions['add'][0]:
-        checkout(f)
-        repo.dirstate.add(f)
+        # Don't checkout modified files, they are already created by the diff
+        if f not in newlyaddedandmodifiedfiles:
+            checkout(f)
+            repo.dirstate.add(f)
 
     normal = repo.dirstate.normallookup
     if node == parent and p2 == nullid:
--- a/tests/test-revert-interactive.t	Thu May 21 14:25:57 2015 -0700
+++ b/tests/test-revert-interactive.t	Thu May 21 14:34:24 2015 -0700
@@ -270,3 +270,53 @@
   3
   4
   5
+  $ rm f.orig
+  $ hg update -C .
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Check editing files newly added by a revert
+
+1) Create a dummy editor changing 1 to 42
+  $ cat > $TESTTMP/editor.sh << '__EOF__'
+  > cat "$1"  | sed "s/1/42/g"  > tt
+  > mv tt  "$1"
+  > __EOF__
+
+2) Remove f
+  $ hg rm f
+  $ hg commit -m "remove f"
+
+3) Do another commit on top
+  $ touch k; hg add k
+  $ hg commit -m "add k"
+  $ hg st
+
+4) Use interactive revert to recover f and change it on the fly
+  $ HGEDITOR="\"sh\" \"\${TESTTMP}/editor.sh\"" PRINTHUNK="YES" hg revert -i -r ".^^"  <<EOF
+  > y
+  > e
+  > EOF
+  adding f
+  removing k
+  diff --git a/f b/f
+  new file mode 100644
+  examine changes to 'f'? [Ynesfdaq?] y
+  
+  @@ -0,0 +1,7 @@
+  +a
+  +1
+  +2
+  +3
+  +4
+  +5
+  +b
+  record this change to 'f'? [Ynesfdaq?] e
+  
+  $ cat f
+  a
+  42
+  2
+  3
+  4
+  5
+  b