[PATCH evolve-ext] evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt
halbersa at gmail.com
Fri Nov 27 02:41:20 UTC 2015
# HG changeset patch
# User Andrew Halberstadt <ahalberstadt at mozilla.com>
# Date 1448588311 18000
# Thu Nov 26 20:38:31 2015 -0500
# Node ID 21b5e4b3df092855c554331587fdd7b713b9551e
# Parent 72f50a17780674de8f372803a333d43c77230df5
evolve: handle merge commit with single obsolete parent (issue4389)
diff --git a/hgext/evolve.py b/hgext/evolve.py
--- a/hgext/evolve.py
+++ b/hgext/evolve.py
@@ -899,20 +899,32 @@ def relocate(repo, orig, dest, keepbranc
"""rewrite <rev> on dest"""
if orig.rev() == dest.rev():
raise util.Abort(_('tried to relocate a node on top of itself'),
hint=_("This shouldn't happen. If you still "
"need to move changesets, please do so "
"manually with nothing to rebase - working "
"directory parent is also destination"))
- if not orig.p2().rev() == node.nullrev:
- raise util.Abort(
- 'no support for evolving merge changesets yet',
- hint="Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one")
+ parents = orig.parents()
+ if len(parents) == 2:
+ if all(p.obsolete() for p in parents):
+ raise util.Abort(
+ 'no support for evolving merge changesets with two obsolete parents yet',
+ hint="Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one")
+
+ for p in parents:
+ if p.obsolete():
+ pctx = p
+ else:
+ pother = p.node()
+ else:
+ pctx = orig.p1()
+ pother = nullid
+
destbookmarks = repo.nodebookmarks(dest.node())
nodesrc = orig.node()
destphase = repo[nodesrc].phase()
commitmsg = orig.description()
cache = {}
sha1s = re.findall(sha1re, commitmsg)
unfi = repo.unfiltered()
@@ -942,17 +954,26 @@ def relocate(repo, orig, dest, keepbranc
try:
if repo['.'].rev() != dest.rev():
merge.update(repo, dest, False, True, False)
if bmactive(repo):
repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo))
bmdeactivate(repo)
if keepbranch:
repo.dirstate.setbranch(orig.branch())
- r = merge.graft(repo, orig, orig.p1(), ['local', 'graft'])
+ r = merge.graft(repo, orig, pctx, ['local', 'graft'])
+
+ if pother != nullid:
+ # Add back the original second parent which got nullified
+ # by merge.graft().
+ repo.dirstate.beginparentchange()
+ repo.setparents(repo['.'].node(), pother)
+ repo.dirstate.write(repo.currenttransaction())
+ repo.dirstate.endparentchange()
+
if r[-1]: #some conflict
raise util.Abort(
'unresolved merge conflicts (see hg help resolve)')
if commitmsg is None:
commitmsg = orig.description()
extra = dict(orig.extra())
if 'branch' in extra:
del extra['branch']
diff --git a/tests/test-unstable.t b/tests/test-unstable.t
--- a/tests/test-unstable.t
+++ b/tests/test-unstable.t
@@ -98,27 +98,23 @@ Not supported yet
| x 1:b3264cec9506 at default(draft) add _a
|/
o 0:b4952fcf48cf at default(draft) add base
$ hg evo --all --any --unstable
move:[3] merge
atop:[4] aprime
- abort: no support for evolving merge changesets yet
- (Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one)
- [255]
+ working directory is now at 0bf3f3a59c8c
$ hg log -G
- @ 4:47127ea62e5f at default(draft) aprime
- |
- | o 3:6b4280e33286 at default(draft) merge
- | |\
- +---o 2:474da87dd33b at default(draft) add _c
+ @ 5:0bf3f3a59c8c at default(draft) merge
+ |\
+ | o 4:47127ea62e5f at default(draft) aprime
| |
- | x 1:b3264cec9506 at default(draft) add _a
+ o | 2:474da87dd33b at default(draft) add _c
|/
o 0:b4952fcf48cf at default(draft) add base
$ cd ..
===============================================================================
Test instability resolution for a merge changeset unstable because both
@@ -155,17 +151,17 @@ Not supported yet
| x 1:b3264cec9506 at default(draft) add _a
|/
o 0:b4952fcf48cf at default(draft) add base
$ hg evo --all --any --unstable
move:[3] merge
atop:[5] cprime
- abort: no support for evolving merge changesets yet
+ abort: no support for evolving merge changesets with two obsolete parents yet
(Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one)
[255]
$ hg log -G
@ 5:2db39fda7e2f at default(draft) cprime
|
| o 4:47127ea62e5f at default(draft) aprime
|/
| o 3:6b4280e33286 at default(draft) merge
More information about the Mercurial-devel
mailing list