[PATCH 4 of 4] transplant: add --merge-all and --merge-last

Peter Arrenbrecht peter.arrenbrecht at gmail.com
Sat Oct 10 05:52:12 CDT 2009


# HG changeset patch
# User Peter Arrenbrecht <peter.arrenbrecht at gmail.com>
# Date 1255171614 -7200
transplant: add --merge-all and --merge-last

With --merge-last, the last transplanted changeset is automatically
marked as a merge.
With --merge-all, all transplanted changesets are marked as merges.
These options are useful mainly together with --branch.

diff --git a/hgext/transplant.py b/hgext/transplant.py
--- a/hgext/transplant.py
+++ b/hgext/transplant.py
@@ -98,6 +98,7 @@
     def apply(self, repo, source, revmap, merges, mergeparentfrom,
               noparentfrom, opts={}):
         '''apply the revisions in revmap one by one in revision order'''
+        merges = set(merges)
         revs = sorted(revmap)
         p1, p2 = repo.dirstate.parents()
         pulls = []
@@ -516,7 +517,10 @@
     You can optionally mark selected transplanted changesets as merge
     changesets. You will not be prompted to transplant any ancestors
     of a merged transplant, and you can merge descendants of them
-    normally instead of transplanting them.
+    normally instead of transplanting them. If you specify --merge-last,
+    the last transplanted changeset is automatically marked as a merge.
+    With --merge-all, all transplanted changesets are marked as merges.
+    The latter two options are useful mainly together with --branch.
 
     If no merges or revisions are provided, hg transplant will start
     an interactive changeset browser.
@@ -642,6 +646,12 @@
         for r in merges:
             revmap[source.changelog.rev(r)] = r
 
+        if revmap:
+            if opts.get('merge_all'):
+                merges.extend(revmap.itervalues())
+            elif opts.get('merge_last'):
+                merges.append(revmap[max(revmap)])
+
         tp.apply(repo, source, revmap, merges, mergeparentfrom, noparentfrom,
                  opts)
     finally:
@@ -661,6 +671,8 @@
                                           'from this named branch')),
           ('B', 'no-parent-from', '', _('skip merges with a parent from '
                                         'this named branch')),
+          ('', 'merge-all', None, _('')),
+          ('', 'merge-last', None, _('')),
           ('', 'log', None, _('append transplant info to log message')),
           ('c', 'continue', None, _('continue last transplant session '
                                     'after repair')),
diff --git a/tests/test-transplant b/tests/test-transplant
--- a/tests/test-transplant
+++ b/tests/test-transplant
@@ -301,6 +301,9 @@
 echo my2-rel >my2
 hg ci -Ammy-rel-change -d '0 0'
 
+echo '%% save for later with --merge-all'
+hg clone . ../ttrack2
+
 echo '%% port to dev'
 hg up my-dev
 hg glog --template '{rev}/{node|short}: [{branches}] {desc}\n'
@@ -310,9 +313,32 @@
 #  * up-rel to my-rel ("merge-up-rel"), which we don't.
 # In practice, there can be longish sequences of merges we either want or don't.
 # The new options allow me to automate such a transplant.
-# Note: To be fully general, I'd need a --merge-last option, since the tip of my-rel
-# might actually be an unwanted merge from up-rel.
-hg transplant --branch my-rel --all --merge my-rel --diff-parent-from my-rel --no-parent-from up-rel --log
+hg transplant --branch my-rel --all --merge-last --diff-parent-from my-rel --no-parent-from up-rel --log
+cat up1
+cat my1
+cat my2
+
+echo '%% final result'
+hg glog --template '{rev}/{node|short}: [{branches}] {desc}\n'
+
+# Check these are really not considered by transplant again.
+echo '%% I change rel again'
+hg up my-rel
+echo my2-rel2 >my2
+hg ci -mmy-rel-change2 -d '0 0'
+
+echo '%% port to dev'
+hg up my-dev
+hg transplant --branch my-rel --all --merge-last --diff-parent-from my-rel --no-parent-from up-rel --log
+cat up1
+cat my1
+cat my2
+
+cd ../ttrack2
+
+echo '%% port to dev (with --merge-all)'
+hg up my-dev
+hg transplant --branch my-rel --all --merge-all --diff-parent-from my-rel --no-parent-from up-rel --log
 cat up1
 cat my1
 cat my2
diff --git a/tests/test-transplant.out b/tests/test-transplant.out
--- a/tests/test-transplant.out
+++ b/tests/test-transplant.out
@@ -295,6 +295,9 @@
 my1-fix
 %% I change rel
 adding my2
+%% save for later with --merge-all
+updating working directory
+4 files updated, 0 files merged, 0 files removed, 0 files unresolved
 %% port to dev
 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
 o  12/30584df1821b: [my-rel] my-rel-change
@@ -362,3 +365,54 @@
 |/
 o  0/1dc89647ce6f: [up-fix] up-fix
 
+%% I change rel again
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+created new head
+%% port to dev
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+applying a2aca9709fcd
+15:a2aca9709fcd merged at 3662eb972b98
+up1
+my1-fix
+my2-rel2
+%% port to dev (with --merge-all)
+3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+applying 49eeaf726a7a
+11:49eeaf726a7a merged at 06b1a0fbd07e
+applying 30584df1821b
+12:30584df1821b merged at 9cd5b3c53e4b
+up1
+my1-fix
+my2-rel
+%% final result
+@    14/9cd5b3c53e4b: [my-dev] my-rel-change
+|\   (transplanted from 30584df1821b396956af32fe94ea2bb95f829530)
+| o    13/06b1a0fbd07e: [my-dev] my-fix-change
+| |\   (transplanted from b1c99ca86ae9f7ade6f79b84eba618e630868bce)
+| | |  (transplanted from 49eeaf726a7ad68b166cf926883ff1cb40d94c41)
+o---+  12/30584df1821b: [my-rel] my-rel-change
+ / /
+| o    11/49eeaf726a7a: [my-rel] my-fix-change
+| |\   (transplanted from b1c99ca86ae9f7ade6f79b84eba618e630868bce)
+| | o  10/b1c99ca86ae9: [my-fix] my-fix-change
+| | |
+| o |    9/5af79cffbf5a: [my-rel] merge-up-rel
+| |\ \
+| | o |  8/8f2fcb8e3106: [up-rel] up-rel-fixed
+| | | |
+| | | o    7/b07e380635c1: [my-fix] merge-up-fix
+| | | |\
+| | | | o  6/b38451fed68b: [up-fix] up-fix-fixed
+| | | | |
+o | | | |  5/a396c7632151: [my-dev] my-dev
+|\| | | |
+o---+ | |  4/c138da2414fc: [up-dev] up-dev
+ / / / /
+o---+ /  3/b8a745f8955f: [my-rel] my-rel
+|/ / /
+o---+  2/b1a16fe7fb52: [up-rel] up-rel
+ / /
+o /  1/6e1643e6b4aa: [my-fix] my-fix
+|/
+o  0/1dc89647ce6f: [up-fix] up-fix
+


More information about the Mercurial-devel mailing list