evolve: fix stabilization of orphan merge changesets in case of conflicts
As demonstrated by tests added in previous patch, if one of the parent of a
merge changeset has a new version and merge changeset gets, running `hg evolve`
to stabilize that if results in conflicts will lead to lose of other parent of
that merge changeset when we resolve conflicts and do `hg evolve --continue`.
This patch fixes the behavior, by checking whether we are continuing evolving a
merge changeset and if yes, setting the dirstate parents according to that.
--- a/hgext3rd/evolve/evolvecmd.py Tue Mar 13 15:29:35 2018 +0530
+++ b/hgext3rd/evolve/evolvecmd.py Tue Mar 13 18:17:50 2018 +0530
@@ -1134,6 +1134,34 @@
targetphase = max(ctx.phase(), phases.draft)
overrides = {('phases', 'new-commit'): targetphase}
+ ctxparents = orig.parents()
+ if len(ctxparents) == 2:
+ currentp1 = repo.dirstate.parents()[0]
+ p1obs = ctxparents[0].obsolete()
+ p2obs = ctxparents[1].obsolete()
+ # asumming that the parent of current wdir is successor of one
+ # of p1 or p2 of the original changeset
+ if p1obs and not p2obs:
+ # p1 is obsolete and p2 is not obsolete, current working
+ # directory parent should be successor of p1, so we should
+ # set dirstate parents to (succ of p1, p2)
+ with repo.dirstate.parentchange():
+ repo.dirstate.setparents(currentp1,
+ ctxparents[1].node())
+ elif p2obs and not p1obs:
+ # p2 is obsolete and p1 is not obsolete, current working
+ # directory parent should be successor of p2, so we should
+ # set dirstate parents to (succ of p2, p1)
+ with repo.dirstate.parentchange():
+ repo.dirstate.setparents(currentp1,
+ ctxparents[0].node())
+
+ else:
+ # both the parents were obsolete, not sure what logic will
+ # required here
+ # XXX: add tests for this and see what is required here
+ pass
+
with repo.ui.configoverride(overrides, 'evolve-continue'):
node = repo.commit(text=message, user=user,
date=date, extra=extra)
--- a/tests/test-evolve-orphan-merge.t Tue Mar 13 15:29:35 2018 +0530
+++ b/tests/test-evolve-orphan-merge.t Tue Mar 13 18:17:50 2018 +0530
@@ -230,47 +230,10 @@
continue: hg evolve --continue
$ hg evolve --continue
evolving 10:fd41d25a3e90 "foobar to c"
- working directory is now at 6b42180a13dd
-
-XXX: we lost the second parent here after interrupted evolve
- $ hg glog
- @ 12:6b42180a13dd foobar to c
- | () draft
- o 11:31c317b7bdb1 foo to c
- | () draft
- | o 9:d0f84b25d4e3 bar to c
- |/ () draft
- o 0:8fa14d15e168 added hgignore
- () draft
-
- $ hg parents
- changeset: 12:6b42180a13dd
- tag: tip
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: foobar to c
-
-Getting back to a state from where we can test the same thing with obsoleting
-the second parent
-
- $ hg prune -r .
- 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
- working directory now at 31c317b7bdb1
- 1 changesets pruned
- $ hg merge
- merging c
- warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
- 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
- use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
- [1]
-
- $ echo FOObar > c
- $ hg resolve -m
- (no more unresolved files)
- $ hg commit -m "FOObar to c"
+ working directory is now at c5405d2da7a1
$ hg glog
- @ 13:14ac829917d7 FOObar to c
+ @ 12:c5405d2da7a1 foobar to c
|\ () draft
| o 11:31c317b7bdb1 foo to c
| | () draft
@@ -279,6 +242,15 @@
o 0:8fa14d15e168 added hgignore
() draft
+ $ hg parents
+ changeset: 12:c5405d2da7a1
+ tag: tip
+ parent: 11:31c317b7bdb1
+ parent: 9:d0f84b25d4e3
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: foobar to c
+
Testing a conlficting merge with second parent obsoleted
$ hg up 31c317b7bdb1
@@ -288,9 +260,9 @@
1 new orphan changesets
$ hg glog
- @ 14:928097d0b5b5 foo to c
+ @ 13:928097d0b5b5 foo to c
| () draft
- | * 13:14ac829917d7 FOObar to c
+ | * 12:c5405d2da7a1 foobar to c
| |\ () draft
+---x 11:31c317b7bdb1 foo to c
| | () draft
@@ -300,8 +272,8 @@
() draft
$ hg evolve --all
- move:[13] FOObar to c
- atop:[14] foo to c
+ move:[12] foobar to c
+ atop:[13] foo to c
merging c
warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
evolve failed!
@@ -315,16 +287,15 @@
continue: hg evolve --continue
$ hg evolve --continue
- evolving 13:14ac829917d7 "FOObar to c"
- working directory is now at 910c14950386
+ evolving 12:c5405d2da7a1 "foobar to c"
+ working directory is now at dc1948a6eeab
-XXX: we lost a parent here again.
$ hg glog
- @ 15:910c14950386 FOObar to c
- | () draft
- o 14:928097d0b5b5 foo to c
- | () draft
- | o 9:d0f84b25d4e3 bar to c
+ @ 14:dc1948a6eeab foobar to c
+ |\ () draft
+ | o 13:928097d0b5b5 foo to c
+ | | () draft
+ o | 9:d0f84b25d4e3 bar to c
|/ () draft
o 0:8fa14d15e168 added hgignore
() draft