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.
--- 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 ..
+