Patchwork [3,of,4,STABLE] mq: pop correct patches at changing pushable-ness of already applied ones

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Sept. 11, 2014, 5:48 p.m.
Message ID <d73ceeacc825f29ac22d.1410457723@feefifofum>
Download mbox | patch
Permalink /patch/5802/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - Sept. 11, 2014, 5:48 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1410456559 -32400
#      Fri Sep 12 02:29:19 2014 +0900
# Branch stable
# Node ID d73ceeacc825f29ac22d7a7d80113e7779ad3117
# Parent  feb907fe8902ff408380741674602a845107d844
mq: pop correct patches at changing pushable-ness of already applied ones

Before this patch, "hg qselect" with --pop/--reapply may pop incorrect
patches, because the index in "applied patches" is used to pop patches
by "mq.pop()", even though the index in "the series" should be used.

For example, when the already applied patch becomes guarded and it
follows the already guarded (= not yet applied) one, "hg qselect" is
aborted, because it tries to pop to guarded one.

This patch uses "mq.applied[i - 1].name" to pop to the patch, of which
the index in the "applied ones" is "i - 1".

Patch

diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -3026,7 +3026,7 @@ 
                 if i == 0:
                     q.pop(repo, all=True)
                 else:
-                    q.pop(repo, str(i - 1))
+                    q.pop(repo, q.applied[i - 1].name)
                 break
     if popped:
         try:
diff --git a/tests/test-mq-guards.t b/tests/test-mq-guards.t
--- a/tests/test-mq-guards.t
+++ b/tests/test-mq-guards.t
@@ -541,3 +541,28 @@ 
   guards deactivated
   $ hg qselect not-new not-c not-d
   number of guarded, applied patches has changed from 0 to 1
+
+test that "qselect --reapply" reapplies patches successfully when the
+already applied patch becomes unguarded and it follows the already
+guarded (= not yet applied) one.
+
+  $ hg qpop -q -a
+  patch queue now empty
+  $ hg qselect not-new not-c
+  number of unguarded, unapplied patches has changed from 1 to 2
+  $ hg qpush -q -a
+  patch d.patch is empty
+  now at: b.patch
+  $ hg qapplied -v
+  0 G new.patch
+  1 G c.patch
+  2 A d.patch
+  3 A b.patch
+  $ hg qselect -q --reapply not-c not-b
+  now at: d.patch
+  cannot push 'b.patch' - guarded by '-not-b'
+  $ hg qseries -v
+  0 U new.patch
+  1 G c.patch
+  2 A d.patch
+  3 G b.patch