evolve: make sure divergence resolution doesn't undo changes (issue6203)
Before this patch, in content-divergence resolution logic if resolution
parent is not the parent of any of the two divergent changesets then
it could undo some changes introduced by previous revs (while resolving
stack of content-divergent changesets) as demonstrated by the test added in
previous patch.
To solve this, what this patch doing is: if divergent cset has obsolete
parent with a successor then first resolve the "orphan" instability of
divergent cset by relocating, then perform the content-divergence resolution.
After this change in logic, I found that it's kind of more correct as
reflected by the changes in tests/test-evolve-content-divergent-corner-cases.t
where it prevented creating conflicts while merging.
Changes in tests/test-evolve-content-divergent-stack.t demonstrate the fixed
behaviour.
Next patches will be covering the `evolve --continue` case for the relocation
of "divergent" cset.
Orphan changeset and trying to relocate a node on top of itself (issue6097)
https://bz.mercurial-scm.org/show_bug.cgi?id=6097
$ . $TESTDIR/testlib/common.sh
$ cat << EOF >> $HGRCPATH
> [extensions]
> rebase =
> evolve =
> EOF
$ hg init issue6097
$ cd issue6097
$ echo apricot > a
$ hg ci -qAm apricot
$ echo banana > b
$ hg ci -qAm banana
Let's go back to amend 0 and make an orphan out of 1
$ hg up -q 0
$ echo coconut > c
$ hg add -q c
$ hg ci --amend -m 'apricot and coconut'
1 new orphan changesets
Now rebase the successor of 0 on top of 1
$ hg rebase -r . -d 1
rebasing 2:32acf8fb1b23 "apricot and coconut" (tip)
1 new orphan changesets
Pruning 1 just to get it out of the way
$ hg prune -q 1
Note how both the regular DAG and the obsolescence graph are linear, but the
paths from 3 to 0 are different: 3-1-0 and 3-2-0
$ hg log -G
@ changeset: 3:2868fe6df617
| tag: tip
| parent: 1:e0486f65907d
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| instability: orphan
| summary: apricot and coconut
|
x changeset: 1:e0486f65907d
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| obsolete: pruned using prune
| summary: banana
|
x changeset: 0:692cc7b6212c
user: test
date: Thu Jan 01 00:00:00 1970 +0000
obsolete: rewritten using amend, rebase as 3:2868fe6df617
summary: apricot
$ hg obslog
@ 2868fe6df617 (3) apricot and coconut
|
x 32acf8fb1b23 (2) apricot and coconut
| rewritten(parent, content) as 2868fe6df617 using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
|
x 692cc7b6212c (0) apricot
rewritten(description, content) as 32acf8fb1b23 using amend by test (Thu Jan 01 00:00:00 1970 +0000)
$ hg evolve -r .
move:[3] apricot and coconut
atop:[-1]
working directory is now at bb847d1d3a5f
$ hg log -G
@ changeset: 4:bb847d1d3a5f
tag: tip
parent: -1:000000000000
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: apricot and coconut
$ hg obslog
@ bb847d1d3a5f (4) apricot and coconut
|
x 2868fe6df617 (3) apricot and coconut
| rewritten(parent) as bb847d1d3a5f using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
|
x 32acf8fb1b23 (2) apricot and coconut
| rewritten(parent, content) as 2868fe6df617 using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
|
x 692cc7b6212c (0) apricot
rewritten(description, content) as 32acf8fb1b23 using amend by test (Thu Jan 01 00:00:00 1970 +0000)