Mercurial > public > mercurial-scm > hg-stable
diff tests/test-rebase-obsolete.t @ 46829:13b200ffe8eb
tests: split up test-rebase-obsolete.t in four pieces
The test case took 42 seconds to run the test before this patch and 12
seconds after (wall time, of course).
Differential Revision: https://phab.mercurial-scm.org/D10255
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 23 Mar 2021 09:13:29 -0700 |
parents | 32399d0813e0 |
children | f8f2ecdde4b5 |
line wrap: on
line diff
--- a/tests/test-rebase-obsolete.t Wed Mar 24 00:04:58 2021 +0100 +++ b/tests/test-rebase-obsolete.t Tue Mar 23 09:13:29 2021 -0700 @@ -743,1396 +743,3 @@ 1 new orphan changesets $ cd .. - -Skip obsolete changeset even with multiple hops ------------------------------------------------ - -setup - - $ hg init obsskip - $ cd obsskip - $ cat << EOF >> .hg/hgrc - > [experimental] - > rebaseskipobsolete = True - > [extensions] - > strip = - > EOF - $ echo A > A - $ hg add A - $ hg commit -m A - $ echo B > B - $ hg add B - $ hg commit -m B0 - $ hg commit --amend -m B1 - $ hg commit --amend -m B2 - $ hg up --hidden 'desc(B0)' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset a8b11f55fb19 - (hidden revision 'a8b11f55fb19' was rewritten as: 261e70097290) - $ echo C > C - $ hg add C - $ hg commit -m C - 1 new orphan changesets - $ hg log -G - @ 4:212cb178bcbb C - | - | o 3:261e70097290 B2 - | | - x | 1:a8b11f55fb19 B0 (rewritten using amend as 3:261e70097290) - |/ - o 0:4a2df7238c3b A - - -Rebase finds its way in a chain of marker - - $ hg rebase -d 'desc(B2)' - note: not rebasing 1:a8b11f55fb19 "B0", already in destination as 3:261e70097290 "B2" - rebasing 4:212cb178bcbb tip "C" - -Even when the chain include missing node - - $ hg up --hidden 'desc(B0)' - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - updated to hidden changeset a8b11f55fb19 - (hidden revision 'a8b11f55fb19' was rewritten as: 261e70097290) - $ echo D > D - $ hg add D - $ hg commit -m D - 1 new orphan changesets - $ hg --hidden strip -r 'desc(B1)' - saved backup bundle to $TESTTMP/obsskip/.hg/strip-backup/86f6414ccda7-b1c452ee-backup.hg - 1 new orphan changesets - $ hg log -G - @ 5:1a79b7535141 D - | - | o 4:ff2c4d47b71d C - | | - | o 2:261e70097290 B2 - | | - x | 1:a8b11f55fb19 B0 (rewritten using amend as 2:261e70097290) - |/ - o 0:4a2df7238c3b A - - - $ hg rebase -d 'desc(B2)' - note: not rebasing 1:a8b11f55fb19 "B0", already in destination as 2:261e70097290 "B2" - rebasing 5:1a79b7535141 tip "D" - $ hg up 4 - 1 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo "O" > O - $ hg add O - $ hg commit -m O - $ echo "P" > P - $ hg add P - $ hg commit -m P - $ hg log -G - @ 8:8d47583e023f P - | - o 7:360bbaa7d3ce O - | - | o 6:9c48361117de D - | | - o | 4:ff2c4d47b71d C - |/ - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - - $ hg debugobsolete `hg log -r 7 -T '{node}\n'` --config experimental.evolution=true - 1 new obsolescence markers - obsoleted 1 changesets - 1 new orphan changesets - $ hg rebase -d 6 -r "4::" - rebasing 4:ff2c4d47b71d "C" - note: not rebasing 7:360bbaa7d3ce "O", it has no successor - rebasing 8:8d47583e023f tip "P" - -If all the changeset to be rebased are obsolete and present in the destination, we -should display a friendly error message - - $ hg log -G - @ 10:121d9e3bc4c6 P - | - o 9:4be60e099a77 C - | - o 6:9c48361117de D - | - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - - - $ hg up 9 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo "non-relevant change" > nonrelevant - $ hg add nonrelevant - $ hg commit -m nonrelevant - created new head - $ hg debugobsolete `hg log -r 11 -T '{node}\n'` --config experimental.evolution=true - 1 new obsolescence markers - obsoleted 1 changesets - $ hg log -G - @ 11:f44da1f4954c nonrelevant (pruned) - | - | o 10:121d9e3bc4c6 P - |/ - o 9:4be60e099a77 C - | - o 6:9c48361117de D - | - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - - $ hg rebase -r . -d 10 - note: not rebasing 11:f44da1f4954c tip "nonrelevant", it has no successor - -If a rebase is going to create divergence, it should abort - - $ hg log -G - @ 10:121d9e3bc4c6 P - | - o 9:4be60e099a77 C - | - o 6:9c48361117de D - | - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - - - $ hg up 9 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo "john" > doe - $ hg add doe - $ hg commit -m "john doe" - created new head - $ hg up 10 - 1 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo "foo" > bar - $ hg add bar - $ hg commit --amend -m "10'" - $ hg up 10 --hidden - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - updated to hidden changeset 121d9e3bc4c6 - (hidden revision '121d9e3bc4c6' was rewritten as: 77d874d096a2) - $ echo "bar" > foo - $ hg add foo - $ hg commit -m "bar foo" - 1 new orphan changesets - $ hg log -G - @ 14:73568ab6879d bar foo - | - | o 13:77d874d096a2 10' - | | - | | o 12:3eb461388009 john doe - | |/ - x | 10:121d9e3bc4c6 P (rewritten using amend as 13:77d874d096a2) - |/ - o 9:4be60e099a77 C - | - o 6:9c48361117de D - | - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - - $ hg summary - parent: 14:73568ab6879d tip (orphan) - bar foo - branch: default - commit: (clean) - update: 2 new changesets, 3 branch heads (merge) - phases: 8 draft - orphan: 1 changesets - $ hg rebase -s 10 -d 12 - abort: this rebase will cause divergences from: 121d9e3bc4c6 - (to force the rebase please set experimental.evolution.allowdivergence=True) - [20] - $ hg log -G - @ 14:73568ab6879d bar foo - | - | o 13:77d874d096a2 10' - | | - | | o 12:3eb461388009 john doe - | |/ - x | 10:121d9e3bc4c6 P (rewritten using amend as 13:77d874d096a2) - |/ - o 9:4be60e099a77 C - | - o 6:9c48361117de D - | - o 2:261e70097290 B2 - | - o 0:4a2df7238c3b A - -With experimental.evolution.allowdivergence=True, rebase can create divergence - - $ hg rebase -s 10 -d 12 --config experimental.evolution.allowdivergence=True - rebasing 10:121d9e3bc4c6 "P" - rebasing 14:73568ab6879d tip "bar foo" - 2 new content-divergent changesets - $ hg summary - parent: 16:61bd55f69bc4 tip - bar foo - branch: default - commit: (clean) - update: 1 new changesets, 2 branch heads (merge) - phases: 8 draft - content-divergent: 2 changesets - -rebase --continue + skipped rev because their successors are in destination -we make a change in trunk and work on conflicting changes to make rebase abort. - - $ hg log -G -r 16:: - @ 16:61bd55f69bc4 bar foo - | - ~ - -Create the two changes in trunk - $ printf "a" > willconflict - $ hg add willconflict - $ hg commit -m "willconflict first version" - - $ printf "dummy" > C - $ hg commit -m "dummy change successor" - -Create the changes that we will rebase - $ hg update -C 16 -q - $ printf "b" > willconflict - $ hg add willconflict - $ hg commit -m "willconflict second version" - created new head - $ printf "dummy" > K - $ hg add K - $ hg commit -m "dummy change" - $ printf "dummy" > L - $ hg add L - $ hg commit -m "dummy change" - $ hg debugobsolete `hg log -r ".^" -T '{node}'` `hg log -r 18 -T '{node}'` --config experimental.evolution=true - 1 new obsolescence markers - obsoleted 1 changesets - 1 new orphan changesets - - $ hg log -G -r 16:: - @ 21:7bdc8a87673d dummy change - | - x 20:8b31da3c4919 dummy change (rewritten as 18:601db7a18f51) - | - o 19:b82fb57ea638 willconflict second version - | - | o 18:601db7a18f51 dummy change successor - | | - | o 17:357ddf1602d5 willconflict first version - |/ - o 16:61bd55f69bc4 bar foo - | - ~ - $ hg rebase -r ".^^ + .^ + ." -d 18 - rebasing 19:b82fb57ea638 "willconflict second version" - merging willconflict - warning: conflicts while merging willconflict! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - - $ hg resolve --mark willconflict - (no more unresolved files) - continue: hg rebase --continue - $ hg rebase --continue - rebasing 19:b82fb57ea638 "willconflict second version" - note: not rebasing 20:8b31da3c4919 "dummy change", already in destination as 18:601db7a18f51 "dummy change successor" - rebasing 21:7bdc8a87673d tip "dummy change" - $ cd .. - -Divergence cases due to obsolete changesets -------------------------------------------- - -We should ignore branches with unstable changesets when they are based on an -obsolete changeset which successor is in rebase set. - - $ hg init divergence - $ cd divergence - $ cat >> .hg/hgrc << EOF - > [extensions] - > strip = - > [alias] - > strip = strip --no-backup --quiet - > [templates] - > instabilities = '{rev}:{node|short} {desc|firstline}{if(instabilities," ({instabilities})")}\n' - > EOF - - $ hg debugdrawdag <<EOF - > e f - > | | - > d' d # replace: d -> d' - > \ / - > c - > | - > x b - > \| - > a - > EOF - 1 new orphan changesets - $ hg log -G -r 'a':: - * 7:1143e9adc121 f - | - | o 6:d60ebfa0f1cb e - | | - | o 5:027ad6c5830d d' - | | - x | 4:76be324c128b d (rewritten using replace as 5:027ad6c5830d) - |/ - o 3:a82ac2b38757 c - | - | o 2:630d7c95eff7 x - | | - o | 1:488e1b7e7341 b - |/ - o 0:b173517d0057 a - - -Changeset d and its descendants are excluded to avoid divergence of d, which -would occur because the successor of d (d') is also in rebaseset. As a -consequence f (descendant of d) is left behind. - - $ hg rebase -b 'e' -d 'x' - rebasing 1:488e1b7e7341 b "b" - rebasing 3:a82ac2b38757 c "c" - rebasing 5:027ad6c5830d d' "d'" - rebasing 6:d60ebfa0f1cb e "e" - note: not rebasing 4:76be324c128b d "d" and its descendants as this would cause divergence - $ hg log -G -r 'a':: - o 11:eb6d63fc4ed5 e - | - o 10:44d8c724a70c d' - | - o 9:d008e6b4d3fd c - | - o 8:67e8f4a16c49 b - | - | * 7:1143e9adc121 f - | | - | | x 6:d60ebfa0f1cb e (rewritten using rebase as 11:eb6d63fc4ed5) - | | | - | | x 5:027ad6c5830d d' (rewritten using rebase as 10:44d8c724a70c) - | | | - | x | 4:76be324c128b d (rewritten using replace as 5:027ad6c5830d) - | |/ - | x 3:a82ac2b38757 c (rewritten using rebase as 9:d008e6b4d3fd) - | | - o | 2:630d7c95eff7 x - | | - | x 1:488e1b7e7341 b (rewritten using rebase as 8:67e8f4a16c49) - |/ - o 0:b173517d0057 a - - $ hg strip -r 8: - $ hg log -G -r 'a':: - * 7:1143e9adc121 f - | - | o 6:d60ebfa0f1cb e - | | - | o 5:027ad6c5830d d' - | | - x | 4:76be324c128b d (rewritten using replace as 5:027ad6c5830d) - |/ - o 3:a82ac2b38757 c - | - | o 2:630d7c95eff7 x - | | - o | 1:488e1b7e7341 b - |/ - o 0:b173517d0057 a - - -If the rebase set has an obsolete (d) with a successor (d') outside the rebase -set and none in destination, we still get the divergence warning. -By allowing divergence, we can perform the rebase. - - $ hg rebase -r 'c'::'f' -d 'x' - abort: this rebase will cause divergences from: 76be324c128b - (to force the rebase please set experimental.evolution.allowdivergence=True) - [20] - $ hg rebase --config experimental.evolution.allowdivergence=true -r 'c'::'f' -d 'x' - rebasing 3:a82ac2b38757 c "c" - rebasing 4:76be324c128b d "d" - rebasing 7:1143e9adc121 f tip "f" - 1 new orphan changesets - 2 new content-divergent changesets - $ hg log -G -r 'a':: -T instabilities - o 10:e1744ea07510 f - | - * 9:e2b36ea9a0a0 d (content-divergent) - | - o 8:6a0376de376e c - | - | x 7:1143e9adc121 f - | | - | | * 6:d60ebfa0f1cb e (orphan) - | | | - | | * 5:027ad6c5830d d' (orphan content-divergent) - | | | - | x | 4:76be324c128b d - | |/ - | x 3:a82ac2b38757 c - | | - o | 2:630d7c95eff7 x - | | - | o 1:488e1b7e7341 b - |/ - o 0:b173517d0057 a - - $ hg strip -r 8: - -(Not skipping obsoletes means that divergence is allowed.) - - $ hg rebase --config experimental.rebaseskipobsolete=false -r 'c'::'f' -d 'x' - rebasing 3:a82ac2b38757 c "c" - rebasing 4:76be324c128b d "d" - rebasing 7:1143e9adc121 f tip "f" - 1 new orphan changesets - 2 new content-divergent changesets - - $ hg strip -r 0: - -Similar test on a more complex graph - - $ hg debugdrawdag <<EOF - > g - > | - > f e - > | | - > e' d # replace: e -> e' - > \ / - > c - > | - > x b - > \| - > a - > EOF - 1 new orphan changesets - $ hg log -G -r 'a': - * 8:2876ce66c6eb g - | - | o 7:3ffec603ab53 f - | | - x | 6:e36fae928aec e (rewritten using replace as 5:63324dc512ea) - | | - | o 5:63324dc512ea e' - | | - o | 4:76be324c128b d - |/ - o 3:a82ac2b38757 c - | - | o 2:630d7c95eff7 x - | | - o | 1:488e1b7e7341 b - |/ - o 0:b173517d0057 a - - $ hg rebase -b 'f' -d 'x' - rebasing 1:488e1b7e7341 b "b" - rebasing 3:a82ac2b38757 c "c" - rebasing 5:63324dc512ea e' "e'" - rebasing 7:3ffec603ab53 f "f" - rebasing 4:76be324c128b d "d" - note: not rebasing 6:e36fae928aec e "e" and its descendants as this would cause divergence - $ hg log -G -r 'a': - o 13:a1707a5b7c2c d - | - | o 12:ef6251596616 f - | | - | o 11:b6f172e64af9 e' - |/ - o 10:d008e6b4d3fd c - | - o 9:67e8f4a16c49 b - | - | * 8:2876ce66c6eb g - | | - | | x 7:3ffec603ab53 f (rewritten using rebase as 12:ef6251596616) - | | | - | x | 6:e36fae928aec e (rewritten using replace as 5:63324dc512ea) - | | | - | | x 5:63324dc512ea e' (rewritten using rebase as 11:b6f172e64af9) - | | | - | x | 4:76be324c128b d (rewritten using rebase as 13:a1707a5b7c2c) - | |/ - | x 3:a82ac2b38757 c (rewritten using rebase as 10:d008e6b4d3fd) - | | - o | 2:630d7c95eff7 x - | | - | x 1:488e1b7e7341 b (rewritten using rebase as 9:67e8f4a16c49) - |/ - o 0:b173517d0057 a - - -issue5782 - $ hg strip -r 0: - $ hg debugdrawdag <<EOF - > d - > | - > c1 c # replace: c -> c1 - > \ / - > b - > | - > a - > EOF - 1 new orphan changesets - $ hg debugobsolete `hg log -T "{node}" --hidden -r 'desc("c1")'` - 1 new obsolescence markers - obsoleted 1 changesets - $ hg log -G -r 'a': --hidden - * 4:76be324c128b d - | - | x 3:ef8a456de8fa c1 (pruned) - | | - x | 2:a82ac2b38757 c (rewritten using replace as 3:ef8a456de8fa) - |/ - o 1:488e1b7e7341 b - | - o 0:b173517d0057 a - - $ hg rebase -d 0 -r 2 - note: not rebasing 2:a82ac2b38757 c "c", it has no successor - $ hg log -G -r 'a': --hidden - * 4:76be324c128b d - | - | x 3:ef8a456de8fa c1 (pruned) - | | - x | 2:a82ac2b38757 c (rewritten using replace as 3:ef8a456de8fa) - |/ - o 1:488e1b7e7341 b - | - o 0:b173517d0057 a - - $ cd .. - -Rebase merge where successor of one parent is equal to destination (issue5198) - - $ hg init p1-succ-is-dest - $ cd p1-succ-is-dest - - $ hg debugdrawdag <<EOF - > F - > /| - > E D B # replace: D -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d B -s D - note: not rebasing 2:b18e25de2cf5 D "D", already in destination as 1:112478962961 B "B" - rebasing 4:66f1a38021c9 F tip "F" - $ hg log -G - o 5:50e9d60b99c6 F - |\ - | | x 4:66f1a38021c9 F (rewritten using rebase as 5:50e9d60b99c6) - | |/| - | o | 3:7fb047a69f22 E - | | | - | | x 2:b18e25de2cf5 D (rewritten using replace as 1:112478962961) - | |/ - o | 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of other parent is equal to destination - - $ hg init p2-succ-is-dest - $ cd p2-succ-is-dest - - $ hg debugdrawdag <<EOF - > F - > /| - > E D B # replace: E -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d B -s E - note: not rebasing 3:7fb047a69f22 E "E", already in destination as 1:112478962961 B "B" - rebasing 4:66f1a38021c9 F tip "F" - $ hg log -G - o 5:aae1787dacee F - |\ - | | x 4:66f1a38021c9 F (rewritten using rebase as 5:aae1787dacee) - | |/| - | | x 3:7fb047a69f22 E (rewritten using replace as 1:112478962961) - | | | - | o | 2:b18e25de2cf5 D - | |/ - o / 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of one parent is ancestor of destination - - $ hg init p1-succ-in-dest - $ cd p1-succ-in-dest - - $ hg debugdrawdag <<EOF - > F C - > /| | - > E D B # replace: D -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d C -s D - note: not rebasing 2:b18e25de2cf5 D "D", already in destination as 1:112478962961 B "B" - rebasing 5:66f1a38021c9 F tip "F" - - $ hg log -G - o 6:0913febf6439 F - |\ - +---x 5:66f1a38021c9 F (rewritten using rebase as 6:0913febf6439) - | | | - | o | 4:26805aba1e60 C - | | | - o | | 3:7fb047a69f22 E - | | | - +---x 2:b18e25de2cf5 D (rewritten using replace as 1:112478962961) - | | - | o 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of other parent is ancestor of destination - - $ hg init p2-succ-in-dest - $ cd p2-succ-in-dest - - $ hg debugdrawdag <<EOF - > F C - > /| | - > E D B # replace: E -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d C -s E - note: not rebasing 3:7fb047a69f22 E "E", already in destination as 1:112478962961 B "B" - rebasing 5:66f1a38021c9 F tip "F" - $ hg log -G - o 6:c6ab0cc6d220 F - |\ - +---x 5:66f1a38021c9 F (rewritten using rebase as 6:c6ab0cc6d220) - | | | - | o | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E (rewritten using replace as 1:112478962961) - | | | - o---+ 2:b18e25de2cf5 D - / / - o / 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of one parent is ancestor of destination - - $ hg init p1-succ-in-dest-b - $ cd p1-succ-in-dest-b - - $ hg debugdrawdag <<EOF - > F C - > /| | - > E D B # replace: E -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d C -b F - rebasing 2:b18e25de2cf5 D "D" - note: not rebasing 3:7fb047a69f22 E "E", already in destination as 1:112478962961 B "B" - rebasing 5:66f1a38021c9 F tip "F" - note: not rebasing 5:66f1a38021c9 F tip "F", its destination already has all its changes - $ hg log -G - o 6:8f47515dda15 D - | - | x 5:66f1a38021c9 F (pruned using rebase) - | |\ - o | | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E (rewritten using replace as 1:112478962961) - | | | - | x | 2:b18e25de2cf5 D (rewritten using rebase as 6:8f47515dda15) - | |/ - o / 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of other parent is ancestor of destination - - $ hg init p2-succ-in-dest-b - $ cd p2-succ-in-dest-b - - $ hg debugdrawdag <<EOF - > F C - > /| | - > E D B # replace: D -> B - > \|/ - > A - > EOF - 1 new orphan changesets - - $ hg rebase -d C -b F - note: not rebasing 2:b18e25de2cf5 D "D", already in destination as 1:112478962961 B "B" - rebasing 3:7fb047a69f22 E "E" - rebasing 5:66f1a38021c9 F tip "F" - note: not rebasing 5:66f1a38021c9 F tip "F", its destination already has all its changes - - $ hg log -G - o 6:533690786a86 E - | - | x 5:66f1a38021c9 F (pruned using rebase) - | |\ - o | | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E (rewritten using rebase as 6:533690786a86) - | | | - | x | 2:b18e25de2cf5 D (rewritten using replace as 1:112478962961) - | |/ - o / 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where extinct node has successor that is not an ancestor of -destination - - $ hg init extinct-with-succ-not-in-dest - $ cd extinct-with-succ-not-in-dest - - $ hg debugdrawdag <<EOF - > E C # replace: C -> E - > | | - > D B - > |/ - > A - > EOF - - $ hg rebase -d D -s B - rebasing 1:112478962961 B "B" - note: not rebasing 3:26805aba1e60 C "C" and its descendants as this would cause divergence - - $ cd .. - - $ hg init p2-succ-in-dest-c - $ cd p2-succ-in-dest-c - -The scenario here was that B::D were developed on default. B was queued on -stable, but amended before being push to hg-committed. C was queued on default, -along with unrelated J. - - $ hg debugdrawdag <<EOF - > J - > | - > F - > | - > E - > | D - > | | - > | C # replace: C -> F - > | | H I # replace: B -> H -> I - > | B |/ - > |/ G - > A - > EOF - 1 new orphan changesets - -This strip seems to be the key to avoid an early divergence warning. - $ hg --config extensions.strip= --hidden strip -qr H - 1 new orphan changesets - - $ hg rebase -b 'desc("D")' -d 'desc("J")' - abort: this rebase will cause divergences from: 112478962961 - (to force the rebase please set experimental.evolution.allowdivergence=True) - [20] - -Rebase merge where both parents have successors in destination - - $ hg init p12-succ-in-dest - $ cd p12-succ-in-dest - $ hg debugdrawdag <<'EOS' - > E F - > /| /| # replace: A -> C - > A B C D # replace: B -> D - > | | - > X Y - > EOS - 1 new orphan changesets - $ hg rebase -r A+B+E -d F - note: not rebasing 4:a3d17304151f A "A", already in destination as 0:96cc3511f894 C "C" - note: not rebasing 5:b23a2cc00842 B "B", already in destination as 1:058c1e1fb10a D "D" - rebasing 7:dac5d11c5a7d E tip "E" - abort: rebasing 7:dac5d11c5a7d will include unwanted changes from 3:59c792af609c, 5:b23a2cc00842 or 2:ba2b7fa7166d, 4:a3d17304151f - [10] - $ cd .. - -Rebase a non-clean merge. One parent has successor in destination, the other -parent moves as requested. - - $ hg init p1-succ-p2-move - $ cd p1-succ-p2-move - $ hg debugdrawdag <<'EOS' - > D Z - > /| | # replace: A -> C - > A B C # D/D = D - > EOS - 1 new orphan changesets - $ hg rebase -r A+B+D -d Z - note: not rebasing 0:426bada5c675 A "A", already in destination as 2:96cc3511f894 C "C" - rebasing 1:fc2b737bb2e5 B "B" - rebasing 3:b8ed089c80ad D "D" - - $ rm .hg/localtags - $ hg log -G - o 6:e4f78693cc88 D - | - o 5:76840d832e98 B - | - o 4:50e41c1f3950 Z - | - o 2:96cc3511f894 C - - $ hg files -r tip - B - C - D - Z - - $ cd .. - - $ hg init p1-move-p2-succ - $ cd p1-move-p2-succ - $ hg debugdrawdag <<'EOS' - > D Z - > /| | # replace: B -> C - > A B C # D/D = D - > EOS - 1 new orphan changesets - $ hg rebase -r B+A+D -d Z - rebasing 0:426bada5c675 A "A" - note: not rebasing 1:fc2b737bb2e5 B "B", already in destination as 2:96cc3511f894 C "C" - rebasing 3:b8ed089c80ad D "D" - - $ rm .hg/localtags - $ hg log -G - o 6:1b355ed94d82 D - | - o 5:a81a74d764a6 A - | - o 4:50e41c1f3950 Z - | - o 2:96cc3511f894 C - - $ hg files -r tip - A - C - D - Z - - $ cd .. - -Test that bookmark is moved and working dir is updated when all changesets have -equivalents in destination - $ hg init rbsrepo && cd rbsrepo - $ echo "[experimental]" > .hg/hgrc - $ echo "evolution=true" >> .hg/hgrc - $ echo "rebaseskipobsolete=on" >> .hg/hgrc - $ echo root > root && hg ci -Am root - adding root - $ echo a > a && hg ci -Am a - adding a - $ hg up 0 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo b > b && hg ci -Am b - adding b - created new head - $ hg rebase -r 2 -d 1 - rebasing 2:1e9a3c00cbe9 tip "b" - $ hg log -r . # working dir is at rev 3 (successor of 2) - 3:be1832deae9a b (no-eol) - $ hg book -r 2 mybook --hidden # rev 2 has a bookmark on it now - bookmarking hidden changeset 1e9a3c00cbe9 - (hidden revision '1e9a3c00cbe9' was rewritten as: be1832deae9a) - $ hg up 2 && hg log -r . # working dir is at rev 2 again - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - 2:1e9a3c00cbe9 b (rewritten using rebase as 3:be1832deae9a) (no-eol) - $ hg rebase -r 2 -d 3 --config experimental.evolution.track-operation=1 - note: not rebasing 2:1e9a3c00cbe9 mybook "b", already in destination as 3:be1832deae9a tip "b" -Check that working directory and bookmark was updated to rev 3 although rev 2 -was skipped - $ hg log -r . - 3:be1832deae9a b (no-eol) - $ hg bookmarks - mybook 3:be1832deae9a - $ hg debugobsolete --rev tip - 1e9a3c00cbe90d236ac05ef61efcc5e40b7412bc be1832deae9ac531caa7438b8dcf6055a122cd8e 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '4', 'operation': 'rebase', 'user': 'test'} - -Obsoleted working parent and bookmark could be moved if an ancestor of working -parent gets moved: - - $ hg init $TESTTMP/ancestor-wd-move - $ cd $TESTTMP/ancestor-wd-move - $ hg debugdrawdag <<'EOS' - > E D1 # rebase: D1 -> D2 - > | | - > | C - > D2 | - > | B - > |/ - > A - > EOS - $ hg update D1 -q - $ hg bookmark book -i - $ hg rebase -r B+D1 -d E - rebasing 1:112478962961 B "B" - note: not rebasing 5:15ecf15e0114 book D1 tip "D1", already in destination as 2:0807738e0be9 D2 "D2" - 1 new orphan changesets - $ hg log -G -T '{desc} {bookmarks}' - @ B book - | - | x D1 - | | - o | E - | | - | * C - | | - o | D2 - | | - | x B - |/ - o A - -Rebasing a merge with one of its parent having a hidden successor - - $ hg init $TESTTMP/merge-p1-hidden-successor - $ cd $TESTTMP/merge-p1-hidden-successor - - $ hg debugdrawdag <<'EOS' - > E - > | - > B3 B2 # amend: B1 -> B2 -> B3 - > |/ # B2 is hidden - > | D - > | |\ - > | B1 C - > |/ - > A - > EOS - 1 new orphan changesets - - $ eval `hg tags -T '{tag}={node}\n'` - $ rm .hg/localtags - - $ hg rebase -r $D -d $E - rebasing 5:9e62094e4d94 "D" - - $ hg log -G - o 7:a699d059adcf D - |\ - | o 6:ecc93090a95c E - | | - | o 4:0dc878468a23 B3 - | | - o | 1:96cc3511f894 C - / - o 0:426bada5c675 A - -For some reasons (--hidden, rebaseskipobsolete=0, directaccess, etc.), -rebasestate may contain hidden hashes. "rebase --abort" should work regardless. - - $ hg init $TESTTMP/hidden-state1 - $ cd $TESTTMP/hidden-state1 - $ cat >> .hg/hgrc <<EOF - > [experimental] - > rebaseskipobsolete=0 - > EOF - - $ hg debugdrawdag <<'EOS' - > C - > | - > D B # prune: B, C - > |/ # B/D=B - > A - > EOS - - $ eval `hg tags -T '{tag}={node}\n'` - $ rm .hg/localtags - - $ hg update -q $C --hidden - updated to hidden changeset 7829726be4dc - (hidden revision '7829726be4dc' is pruned) - $ hg rebase -s $B -d $D - rebasing 1:2ec65233581b "B" - merging D - warning: conflicts while merging D! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - - $ cp -R . $TESTTMP/hidden-state2 - - $ hg log -G - @ 2:b18e25de2cf5 D - | - | % 1:2ec65233581b B (pruned using prune) - |/ - o 0:426bada5c675 A - - $ hg summary - parent: 2:b18e25de2cf5 tip - D - branch: default - commit: 1 modified, 1 added, 1 unknown, 1 unresolved - update: 1 new changesets, 2 branch heads (merge) - phases: 3 draft - rebase: 0 rebased, 2 remaining (rebase --continue) - - $ hg rebase --abort - rebase aborted - -Also test --continue for the above case - - $ cd $TESTTMP/hidden-state2 - $ hg resolve -m - (no more unresolved files) - continue: hg rebase --continue - $ hg rebase --continue - rebasing 1:2ec65233581b "B" - rebasing 3:7829726be4dc tip "C" - $ hg log -G - @ 5:1964d5d5b547 C - | - o 4:68deb90c12a2 B - | - o 2:b18e25de2cf5 D - | - o 0:426bada5c675 A - -==================== -Test --stop option | -==================== - $ cd .. - $ hg init rbstop - $ cd rbstop - $ echo a>a - $ hg ci -Aqma - $ echo b>b - $ hg ci -Aqmb - $ echo c>c - $ hg ci -Aqmc - $ echo d>d - $ hg ci -Aqmd - $ hg up 0 -q - $ echo f>f - $ hg ci -Aqmf - $ echo D>d - $ hg ci -Aqm "conflict with d" - $ hg up 3 -q - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | o 2:177f92b77385 test - | | c - | | - | o 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - - $ hg rebase -s 1 -d 5 - rebasing 1:d2ae7f538514 "b" - rebasing 2:177f92b77385 "c" - rebasing 3:055a42cdd887 "d" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop - 1 new orphan changesets - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 7:7fffad344617 test - | c - | - o 6:b15528633407 test - | b - | - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | x 2:177f92b77385 test - | | c - | | - | x 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - -Test it aborts if unstable csets is not allowed: -=============================================== - $ cat >> $HGRCPATH << EOF - > [experimental] - > evolution.allowunstable=False - > EOF - - $ hg strip 6 --no-backup -q - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | o 2:177f92b77385 test - | | c - | | - | o 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - - $ hg rebase -s 1 -d 5 - rebasing 1:d2ae7f538514 "b" - rebasing 2:177f92b77385 "c" - rebasing 3:055a42cdd887 "d" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop - abort: cannot remove original changesets with unrebased descendants - (either enable obsmarkers to allow unstable revisions or use --keep to keep original changesets) - [20] - $ hg rebase --abort - saved backup bundle to $TESTTMP/rbstop/.hg/strip-backup/b15528633407-6eb72b6f-backup.hg - rebase aborted - -Test --stop when --keep is passed: -================================== - $ hg rebase -s 1 -d 5 --keep - rebasing 1:d2ae7f538514 "b" - rebasing 2:177f92b77385 "c" - rebasing 3:055a42cdd887 "d" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 7:7fffad344617 test - | c - | - o 6:b15528633407 test - | b - | - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | o 2:177f92b77385 test - | | c - | | - | o 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - -Test --stop aborts when --collapse was passed: -============================================= - $ cat >> $HGRCPATH << EOF - > [experimental] - > evolution.allowunstable=True - > EOF - - $ hg strip 6 - saved backup bundle to $TESTTMP/rbstop/.hg/strip-backup/b15528633407-6eb72b6f-backup.hg - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | o 2:177f92b77385 test - | | c - | | - | o 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - - $ hg rebase -s 1 -d 5 --collapse -m "collapsed b c d" - rebasing 1:d2ae7f538514 "b" - rebasing 2:177f92b77385 "c" - rebasing 3:055a42cdd887 "d" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop - abort: cannot stop in --collapse session - [20] - $ hg rebase --abort - rebase aborted - $ hg diff - $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" - o 5:00bfc9898aeb test - | conflict with d - | - o 4:dafd40200f93 test - | f - | - | @ 3:055a42cdd887 test - | | d - | | - | o 2:177f92b77385 test - | | c - | | - | o 1:d2ae7f538514 test - |/ b - | - o 0:cb9a9f314b8b test - a - -Test --stop raise errors with conflicting options: -================================================= - $ hg rebase -s 3 -d 5 - rebasing 3:055a42cdd887 "d" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop --dry-run - abort: cannot specify both --stop and --dry-run - [10] - - $ hg rebase -s 3 -d 5 - abort: rebase in progress - (use 'hg rebase --continue', 'hg rebase --abort', or 'hg rebase --stop') - [20] - $ hg rebase --stop --continue - abort: cannot specify both --stop and --continue - [10] - -Test --stop moves bookmarks of original revisions to new rebased nodes: -====================================================================== - $ cd .. - $ hg init repo - $ cd repo - - $ echo a > a - $ hg ci -Am A - adding a - - $ echo b > b - $ hg ci -Am B - adding b - $ hg book X - $ hg book Y - - $ echo c > c - $ hg ci -Am C - adding c - $ hg book Z - - $ echo d > d - $ hg ci -Am D - adding d - - $ hg up 0 -q - $ echo e > e - $ hg ci -Am E - adding e - created new head - - $ echo doubt > d - $ hg ci -Am "conflict with d" - adding d - - $ hg log -GT "{rev}: {node|short} '{desc}' bookmarks: {bookmarks}\n" - @ 5: 39adf30bc1be 'conflict with d' bookmarks: - | - o 4: 9c1e55f411b6 'E' bookmarks: - | - | o 3: 67a385d4e6f2 'D' bookmarks: Z - | | - | o 2: 49cb3485fa0c 'C' bookmarks: Y - | | - | o 1: 6c81ed0049f8 'B' bookmarks: X - |/ - o 0: 1994f17a630e 'A' bookmarks: - - $ hg rebase -s 1 -d 5 - rebasing 1:6c81ed0049f8 X "B" - rebasing 2:49cb3485fa0c Y "C" - rebasing 3:67a385d4e6f2 Z "D" - merging d - warning: conflicts while merging d! (edit, then use 'hg resolve --mark') - unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') - [240] - $ hg rebase --stop - 1 new orphan changesets - $ hg log -GT "{rev}: {node|short} '{desc}' bookmarks: {bookmarks}\n" - o 7: 9c86c650b686 'C' bookmarks: Y - | - o 6: 9b87b54e5fd8 'B' bookmarks: X - | - @ 5: 39adf30bc1be 'conflict with d' bookmarks: - | - o 4: 9c1e55f411b6 'E' bookmarks: - | - | * 3: 67a385d4e6f2 'D' bookmarks: Z - | | - | x 2: 49cb3485fa0c 'C' bookmarks: - | | - | x 1: 6c81ed0049f8 'B' bookmarks: - |/ - o 0: 1994f17a630e 'A' bookmarks: -