changeset 16531:b9f51f49bf2a stable

rebase: preserve mq series order, guarded patches (issue2849) The previous code was rebasing an applied series like: patch1 +guarded patch2 patch3 +guarded patch4 patch5 +guarded into: patch2 patch4 patch1 +guarded patch3 +guarded patch5 +guarded Reported by Lars Westerhoff <lars.westerhoff@newtec.eu> Also rename mq.series_dirty into mq.seriesdirty, missed by 599a72895c0d, and without effect since mq.qimport() was setting it already.
author Patrick Mezard <patrick@mezard.eu>
date Wed, 25 Apr 2012 17:04:18 +0200
parents e37199a1f9d4
children 9eba72cdde34
files hgext/rebase.py tests/test-rebase-mq.t
diffstat 2 files changed, 40 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/rebase.py	Thu Apr 26 12:13:20 2012 +0200
+++ b/hgext/rebase.py	Wed Apr 25 17:04:18 2012 +0200
@@ -446,6 +446,7 @@
     mqrebase = {}
     mq = repo.mq
     original_series = mq.fullseries[:]
+    skippedpatches = set()
 
     for p in mq.applied:
         rev = repo[p.node].rev()
@@ -453,6 +454,9 @@
             repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
                                         (rev, p.name))
             mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
+        else:
+            # Applied but not rebased, not sure this should happen
+            skippedpatches.add(p.name)
 
     if mqrebase:
         mq.finish(repo, mqrebase.keys())
@@ -464,14 +468,17 @@
                 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name))
                 mq.qimport(repo, (), patchname=name, git=isgit,
                                 rev=[str(state[rev])])
+            else:
+                # Rebased and skipped
+                skippedpatches.add(mqrebase[rev][0])
 
-        # restore missing guards
-        for s in original_series:
-            pname = mq.guard_re.split(s, 1)[0]
-            if pname in mq.fullseries:
-                repo.ui.debug('restoring guard for patch %s' % (pname))
-                mq.fullseries[mq.fullseries.index(pname)] = s
-                mq.series_dirty = True
+        # Patches were either applied and rebased and imported in
+        # order, applied and removed or unapplied. Discard the removed
+        # ones while preserving the original series order and guards.
+        newseries = [s for s in original_series
+                     if mq.guard_re.split(s, 1)[0] not in skippedpatches]
+        mq.fullseries[:] = newseries
+        mq.seriesdirty = True
         mq.savedirty()
 
 def updatebookmarks(repo, nstate, originalbookmarks, **opts):
--- a/tests/test-rebase-mq.t	Thu Apr 26 12:13:20 2012 +0200
+++ b/tests/test-rebase-mq.t	Wed Apr 25 17:04:18 2012 +0200
@@ -247,30 +247,41 @@
 Create mq repo with guarded patches foo and bar and empty patch:
 
   $ hg qinit
-  $ hg qnew foo
-  $ hg qguard foo +baz
+  $ echo guarded > guarded
+  $ hg add guarded
+  $ hg qnew guarded
+  $ hg qnew empty-important -m 'important commit message'
+  $ echo bar > bar
+  $ hg add bar
+  $ hg qnew bar
   $ echo foo > foo
   $ hg add foo
-  $ hg qref
-  $ hg qpop
+  $ hg qnew foo
+  $ hg qpop -a
   popping foo
+  popping bar
+  popping empty-important
+  popping guarded
   patch queue now empty
-
-  $ hg qnew empty-important -m 'important commit message'
-
-  $ hg qnew bar
+  $ hg qguard guarded +guarded
   $ hg qguard bar +baz
-  $ echo bar > bar
-  $ hg add bar
-  $ hg qref
+  $ hg qguard foo +baz
+  $ hg qselect baz
+  number of unguarded, unapplied patches has changed from 1 to 3
+  $ hg qpush bar
+  applying empty-important
+  patch empty-important is empty
+  applying bar
+  now at: bar
 
   $ hg qguard -l
+  guarded: +guarded
   empty-important: unguarded
   bar: +baz
   foo: +baz
 
   $ hg tglog
-  @  2: '[mq]: bar' tags: bar qtip tip
+  @  2: 'imported patch bar' tags: bar qtip tip
   |
   o  1: 'important commit message' tags: empty-important qbase
   |
@@ -303,18 +314,21 @@
 removed from the series):
 
   $ hg qseries
+  guarded
   empty-important
   bar
   foo
   $ [ -f .hg/patches/empty-important ]
   $ hg -q rebase -d 2
   $ hg qseries
+  guarded
   bar
   foo
   $ [ -f .hg/patches/empty-important ]
   [1]
 
   $ hg qguard -l
+  guarded: +guarded
   bar: +baz
   foo: +baz