diff -r 0d5a1175d0f9 -r 8cef8f7d51d0 tests/test-rebase-base-flag.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-rebase-base-flag.t Thu Oct 05 20:41:50 2017 -0700 @@ -0,0 +1,384 @@ +Test the "--base" flag of the rebase command. (Tests unrelated to the "--base" +flag should probably live in somewhere else) + + $ cat >> $HGRCPATH < [extensions] + > rebase= + > drawdag=$TESTDIR/drawdag.py + > + > [phases] + > publish=False + > + > [alias] + > tglog = log -G --template "{rev}: {desc}" + > EOF + + $ rebasewithdag() { + > N=`$PYTHON -c "print($N+1)"` + > hg init repo$N && cd repo$N + > hg debugdrawdag + > hg rebase "$@" > _rebasetmp + > r=$? + > grep -v 'saved backup bundle' _rebasetmp + > [ $r -eq 0 ] && hg tglog + > cd .. + > return $r + > } + +Single branching point, without merge: + + $ rebasewithdag -b D -d Z <<'EOS' + > D E + > |/ + > Z B C # C: branching point, E should be picked + > \|/ # B should not be picked + > A + > | + > R + > EOS + rebasing 3:d6003a550c2c "C" (C) + rebasing 5:4526cf523425 "D" (D) + rebasing 6:b296604d9846 "E" (E tip) + o 6: E + | + | o 5: D + |/ + o 4: C + | + o 3: Z + | + | o 2: B + |/ + o 1: A + | + o 0: R + +Multiple branching points caused by selecting a single merge changeset: + + $ rebasewithdag -b E -d Z <<'EOS' + > E + > /| + > B C D # B, C: multiple branching points + > | |/ # D should not be picked + > Z | / + > \|/ + > A + > | + > R + > EOS + rebasing 2:c1e6b162678d "B" (B) + rebasing 3:d6003a550c2c "C" (C) + rebasing 6:54c8f00cb91c "E" (E tip) + o 6: E + |\ + | o 5: C + | | + o | 4: B + |/ + o 3: Z + | + | o 2: D + |/ + o 1: A + | + o 0: R + +Rebase should not extend the "--base" revset using "descendants": + + $ rebasewithdag -b B -d Z <<'EOS' + > E + > /| + > Z B C # descendants(B) = B+E. With E, C will be included incorrectly + > \|/ + > A + > | + > R + > EOS + rebasing 2:c1e6b162678d "B" (B) + rebasing 5:54c8f00cb91c "E" (E tip) + o 5: E + |\ + | o 4: B + | | + | o 3: Z + | | + o | 2: C + |/ + o 1: A + | + o 0: R + +Rebase should not simplify the "--base" revset using "roots": + + $ rebasewithdag -b B+E -d Z <<'EOS' + > E + > /| + > Z B C # roots(B+E) = B. Without E, C will be missed incorrectly + > \|/ + > A + > | + > R + > EOS + rebasing 2:c1e6b162678d "B" (B) + rebasing 3:d6003a550c2c "C" (C) + rebasing 5:54c8f00cb91c "E" (E tip) + o 5: E + |\ + | o 4: C + | | + o | 3: B + |/ + o 2: Z + | + o 1: A + | + o 0: R + +The destination is one of the two branching points of a merge: + + $ rebasewithdag -b F -d Z <<'EOS' + > F + > / \ + > E D + > / / + > Z C + > \ / + > B + > | + > A + > EOS + nothing to rebase + [1] + +Multiple branching points caused by multiple bases (issue5420): + + $ rebasewithdag -b E1+E2+C2+B1 -d Z <<'EOS' + > Z E2 + > | / + > F E1 C2 + > |/ / + > E C1 B2 + > |/ / + > C B1 + > |/ + > B + > | + > A + > | + > R + > EOS + rebasing 3:a113dbaa660a "B1" (B1) + rebasing 5:06ce7b1cc8c2 "B2" (B2) + rebasing 6:0ac98cce32d3 "C1" (C1) + rebasing 8:781512f5e33d "C2" (C2) + rebasing 9:428d8c18f641 "E1" (E1) + rebasing 11:e1bf82f6b6df "E2" (E2) + o 12: E2 + | + o 11: E1 + | + | o 10: C2 + | | + | o 9: C1 + |/ + | o 8: B2 + | | + | o 7: B1 + |/ + o 6: Z + | + o 5: F + | + o 4: E + | + o 3: C + | + o 2: B + | + o 1: A + | + o 0: R + +Multiple branching points with multiple merges: + + $ rebasewithdag -b G+P -d Z <<'EOS' + > G H P + > |\ /| |\ + > F E D M N + > \|/| /| |\ + > Z C B I J K L + > \|/ |/ |/ + > A A A + > EOS + rebasing 2:dc0947a82db8 "C" (C) + rebasing 8:4e4f9194f9f1 "D" (D) + rebasing 9:03ca77807e91 "E" (E) + rebasing 10:afc707c82df0 "F" (F) + rebasing 13:690dfff91e9e "G" (G) + rebasing 14:2893b886bb10 "H" (H) + rebasing 3:08ebfeb61bac "I" (I) + rebasing 4:a0a5005cec67 "J" (J) + rebasing 5:83780307a7e8 "K" (K) + rebasing 6:e131637a1cb6 "L" (L) + rebasing 11:d1f6d0c3c7e4 "M" (M) + rebasing 12:7aaec6f81888 "N" (N) + rebasing 15:325bc8f1760d "P" (P tip) + o 15: P + |\ + | o 14: N + | |\ + o \ \ 13: M + |\ \ \ + | | | o 12: L + | | | | + | | o | 11: K + | | |/ + | o / 10: J + | |/ + o / 9: I + |/ + | o 8: H + | |\ + | | | o 7: G + | | |/| + | | | o 6: F + | | | | + | | o | 5: E + | | |/ + | o | 4: D + | |\| + +---o 3: C + | | + o | 2: Z + | | + | o 1: B + |/ + o 0: A + +Slightly more complex merge case (mentioned in https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-November/091074.html): + + $ rebasewithdag -b A3+B3 -d Z <<'EOF' + > Z C1 A3 B3 + > | / / \ / \ + > M3 C0 A1 A2 B1 B2 + > | / | | | | + > M2 M1 C1 C1 M3 + > | + > M1 + > | + > M0 + > EOF + rebasing 4:8817fae53c94 "C0" (C0) + rebasing 6:06ca5dfe3b5b "B2" (B2) + rebasing 7:73508237b032 "C1" (C1) + rebasing 9:fdb955e2faed "A2" (A2) + rebasing 11:4e449bd1a643 "A3" (A3) + rebasing 10:0a33b0519128 "B1" (B1) + rebasing 12:209327807c3a "B3" (B3 tip) + o 12: B3 + |\ + | o 11: B1 + | | + | | o 10: A3 + | | |\ + | +---o 9: A2 + | | | + | o | 8: C1 + | | | + o | | 7: B2 + | | | + | o | 6: C0 + |/ / + o | 5: Z + | | + o | 4: M3 + | | + o | 3: M2 + | | + | o 2: A1 + |/ + o 1: M1 + | + o 0: M0 + +Disconnected graph: + + $ rebasewithdag -b B -d Z <<'EOS' + > B + > | + > Z A + > EOS + nothing to rebase from 112478962961 to 48b9aae0607f + [1] + +Multiple roots. Roots are ancestors of dest: + + $ rebasewithdag -b B+D -d Z <<'EOF' + > D Z B + > \|\| + > C A + > EOF + rebasing 2:112478962961 "B" (B) + rebasing 3:b70f76719894 "D" (D) + o 4: D + | + | o 3: B + |/ + o 2: Z + |\ + | o 1: C + | + o 0: A + +Multiple roots. One root is not an ancestor of dest: + + $ rebasewithdag -b B+D -d Z <<'EOF' + > Z B D + > \|\| + > A C + > EOF + nothing to rebase from f675d5a1c6a4+b70f76719894 to 262e37e34f63 + [1] + +Multiple roots. One root is not an ancestor of dest. Select using a merge: + + $ rebasewithdag -b E -d Z <<'EOF' + > E + > |\ + > Z B D + > \|\| + > A C + > EOF + rebasing 2:f675d5a1c6a4 "B" (B) + rebasing 5:f68696fe6af8 "E" (E tip) + o 5: E + |\ + | o 4: B + | |\ + | | o 3: Z + | | | + o | | 2: D + |/ / + o / 1: C + / + o 0: A + +Multiple roots. Two children share two parents while dest has only one parent: + + $ rebasewithdag -b B+D -d Z <<'EOF' + > Z B D + > \|\|\ + > A C A + > EOF + rebasing 2:f675d5a1c6a4 "B" (B) + rebasing 3:c2a779e13b56 "D" (D) + o 4: D + |\ + +---o 3: B + | |/ + | o 2: Z + | | + o | 1: C + / + o 0: A +