diff hgext/rebase.py @ 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 0806823370d8
children ebf6d38c9063
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):