[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