[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