evolve: support successors of ancestor of orphan with multiple roots
The previous code checked that the set of successors has a single root.
However, there’s no reason to require that in general.
Example:
o 6
|
o 5
|\
| o 4
| |
o | 3
|/
| * 2
| |
| x 1
|/
o 0
1 is obsoleted by 3, 4 and 6. We are considering the case when 2 gets evolved.
The roots are [3, 4] and the heads are [6]. Before the change, the user was
asked which destination to choose, but there was only one choice (6). After the
change, 6 is chosen as the destination.
Check that evolve shows error while handling split commits
--------------------------------------
$ cat >> $HGRCPATH <<EOF
> [defaults]
> amend=-d "0 0"
> fold=-d "0 0"
> [web]
> push_ssl = false
> allow_push = *
> [phases]
> publish = False
> [diff]
> git = 1
> unified = 0
> [ui]
> logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n
> [extensions]
> EOF
$ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
$ mkcommit() {
> echo "$1" > "$1"
> hg add "$1"
> hg ci -m "add $1"
> }
$ hg init split
$ cd split
$ mkcommit aa
Create a split commit
$ printf "oo" > oo;
$ printf "pp" > pp;
$ hg add oo pp
$ hg commit -m "oo+pp"
$ mkcommit uu
$ hg up 0
0 files updated, 0 files merged, 3 files removed, 0 files unresolved
$ printf "oo" > oo;
$ hg add oo
$ hg commit -m "_oo"
created new head
$ printf "pp" > pp;
$ hg add pp
$ hg commit -m "_pp"
$ hg prune --successor "desc(_oo) + desc(_pp)" -r "desc('oo+pp')" --split
1 changesets pruned
1 new orphan changesets
$ hg log -G
@ 4:d0dcf24cddd3@default(draft) _pp
|
o 3:a7fdfda64c08@default(draft) _oo
|
| * 2:f52200b086ca@default(draft) add uu
| |
| x 1:d55647aaa0c6@default(draft) oo+pp
|/
o 0:58663bb03074@default(draft) add aa
$ hg evolve --rev "0::"
move:[2] add uu
atop:[4] _pp
Split the changeset such that there's an unrelated changeset in between
$ hg --config extensions.strip= strip 4 -q
$ mkcommit bb
$ printf "pp" > pp;
$ hg add pp
$ hg commit -m "_pp"
$ hg prune --successor "desc(_oo) + desc(_pp)" -r "desc('oo+pp')" --split
1 changesets pruned
1 new orphan changesets
$ hg log -G
@ 5:e4541785761d@default(draft) _pp
|
o 4:155f65ab6abc@default(draft) add bb
|
o 3:a7fdfda64c08@default(draft) _oo
|
| * 2:f52200b086ca@default(draft) add uu
| |
| x 1:d55647aaa0c6@default(draft) oo+pp
|/
o 0:58663bb03074@default(draft) add aa
$ hg evolve --rev "0::"
move:[2] add uu
atop:[5] _pp
$ cd ..
$ hg init split-merged
$ cd split-merged
$ mkcommit aa
Split the changeset such that the successors don't have a single root
$ printf "oo" > oo;
$ printf "pp" > pp;
$ printf "qq" > qq;
$ hg add oo pp qq
$ hg commit -m "oo+pp+qq"
$ mkcommit uu
$ hg up 0
0 files updated, 0 files merged, 4 files removed, 0 files unresolved
$ printf "oo" > oo;
$ hg add oo
$ hg commit -m "_oo"
created new head
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ printf "pp" > pp;
$ hg add pp
$ hg commit -m "_pp"
created new head
$ hg merge 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m 'merge oo and pp'
$ printf "qq" > qq;
$ hg add qq
$ hg commit -m "_qq"
$ hg prune --successor "desc(_oo) + desc(_pp) + desc(_qq)" -r "desc('oo+pp+qq')" --split
1 changesets pruned
1 new orphan changesets
$ hg log -G
@ 6:ea5b1e180c04@default(draft) _qq
|
o 5:bf7c32161b4b@default(draft) merge oo and pp
|\
| o 4:ece0aaa22eb7@default(draft) _pp
| |
o | 3:a7fdfda64c08@default(draft) _oo
|/
| * 2:cc56c47d84b3@default(draft) add uu
| |
| x 1:575a7380a87d@default(draft) oo+pp+qq
|/
o 0:58663bb03074@default(draft) add aa
$ hg evolve --rev "0::"
move:[2] add uu
atop:[6] _qq