changeset 15322:c8e2a5ea7062 stable

mq: avoid data loss upon qfold + qmv (issue3058) When renaming a patch A as B where B was previously qfolded into A and therefore marked as removed, a versioned MQ would first restore B before marking it as a copy of A, thus losing A changes. The undelete() call is probably a left-over, wctx.copy() explicitely handles the case where the destination is removed. Also note that status command represents "hg rm b; hg mv a b" as: A b a R a which explains the first hunk in test-mq-qrename.t.
author Patrick Mezard <pmezard@gmail.com>
date Thu, 20 Oct 2011 16:43:31 +0200
parents e174353e8cda
children 19368c54a774
files hgext/mq.py tests/test-mq-qrename.t
diffstat 2 files changed, 30 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/mq.py	Fri Oct 21 00:33:08 2011 +0200
+++ b/hgext/mq.py	Thu Oct 20 16:43:31 2011 +0200
@@ -2614,8 +2614,6 @@
                 r.dirstate.drop(patch)
                 r.dirstate.add(name)
             else:
-                if r.dirstate[name] == 'r':
-                    wctx.undelete([name])
                 wctx.copy(patch, name)
                 wctx.forget([patch])
         finally:
--- a/tests/test-mq-qrename.t	Fri Oct 21 00:33:08 2011 +0200
+++ b/tests/test-mq-qrename.t	Thu Oct 20 16:43:31 2011 +0200
@@ -76,8 +76,8 @@
   $ hg qrename patchb patchc
   $ hg qrename patcha patchb
   $ hg st --mq
-  M patchb
   M series
+  A patchb
   A patchc
   R patcha
   $ cd ..
@@ -94,3 +94,32 @@
   nothing changed
   [1]
   $ cd ..
+
+Test renaming to a folded patch (issue3058)
+
+  $ hg init issue3058
+  $ cd issue3058
+  $ hg init --mq
+  $ echo a > a
+  $ hg add a
+  $ hg qnew adda
+  $ echo b >> a
+  $ hg qnew addb
+  $ hg qpop
+  popping addb
+  now at: adda
+  $ hg ci --mq -m "save mq"
+  $ hg qfold addb
+  $ hg qmv addb
+  $ cat .hg/patches/addb
+  # HG changeset patch
+  # Parent 0000000000000000000000000000000000000000
+  
+  diff -r 000000000000 a
+  --- /dev/null	* (glob)
+  +++ b/a	* (glob)
+  @@ -0,0 +1,2 @@
+  +a
+  +b
+  $ cd ..
+