| #!/bin/sh |
| |
| test_description='basic rebase topology tests' |
| . ./test-lib.sh |
| . "$TEST_DIRECTORY"/lib-rebase.sh |
| |
| # a---b---c |
| # \ |
| # d---e |
| test_expect_success 'setup' ' |
| test_commit a && |
| test_commit b && |
| test_commit c && |
| git checkout b && |
| test_commit d && |
| test_commit e |
| ' |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "simple rebase $*" " |
| reset_rebase && |
| git rebase $* c e && |
| test_cmp_rev c HEAD~2 && |
| test_linear_range 'd e' c.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_expect_success 'setup branches and remote tracking' ' |
| git tag -l >tags && |
| for tag in $(cat tags) |
| do |
| git branch branch-$tag $tag || return 1 |
| done && |
| git remote add origin "file://$PWD" && |
| git fetch origin |
| ' |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* is no-op if upstream is an ancestor" " |
| reset_rebase && |
| git rebase $* b e && |
| test_cmp_rev e HEAD |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* -f rewrites even if upstream is an ancestor" " |
| reset_rebase && |
| git rebase $* -f b e && |
| test_cmp_rev ! e HEAD && |
| test_cmp_rev b HEAD~2 && |
| test_linear_range 'd e' b.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success --fork-point |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* -f rewrites even if remote upstream is an ancestor" " |
| reset_rebase && |
| git rebase $* -f branch-b branch-e && |
| test_cmp_rev ! branch-e origin/branch-e && |
| test_cmp_rev branch-b HEAD~2 && |
| test_linear_range 'd e' branch-b.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success --fork-point |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* fast-forwards from ancestor of upstream" " |
| reset_rebase && |
| git rebase $* e b && |
| test_cmp_rev e HEAD |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success --fork-point |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| # f |
| # / |
| # a---b---c---g---h |
| # \ |
| # d---gp--i |
| # |
| # gp = cherry-picked g |
| # h = reverted g |
| # |
| # Reverted patches are there for tests to be able to check if a commit |
| # that introduced the same change as another commit is |
| # dropped. Without reverted commits, we could get false positives |
| # because applying the patch succeeds, but simply results in no |
| # changes. |
| test_expect_success 'setup of linear history for range selection tests' ' |
| git checkout c && |
| test_commit g && |
| revert h g && |
| git checkout d && |
| cherry_pick gp g && |
| test_commit i && |
| git checkout b && |
| test_commit f |
| ' |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* drops patches in upstream" " |
| reset_rebase && |
| git rebase $* h i && |
| test_cmp_rev h HEAD~2 && |
| test_linear_range 'd i' h.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* can drop last patch if in upstream" " |
| reset_rebase && |
| git rebase $* h gp && |
| test_cmp_rev h HEAD^ && |
| test_linear_range 'd' h.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --onto drops patches in upstream" " |
| reset_rebase && |
| git rebase $* --onto f h i && |
| test_cmp_rev f HEAD~2 && |
| test_linear_range 'd i' f.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --onto does not drop patches in onto" " |
| reset_rebase && |
| git rebase $* --onto h f i && |
| test_cmp_rev h HEAD~3 && |
| test_linear_range 'd gp i' h.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| # a---b---c---j! |
| # \ |
| # d---k!--l |
| # |
| # ! = empty |
| test_expect_success 'setup of linear history for empty commit tests' ' |
| git checkout c && |
| make_empty j && |
| git checkout d && |
| make_empty k && |
| test_commit l |
| ' |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* keeps begin-empty commits" " |
| reset_rebase && |
| git rebase $* j l && |
| test_cmp_rev c HEAD~4 && |
| test_linear_range 'j d k l' c.. |
| " |
| } |
| test_run_rebase failure --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --no-keep-empty drops begin-empty commits" " |
| reset_rebase && |
| git rebase $* --no-keep-empty c l && |
| test_cmp_rev c HEAD~2 && |
| test_linear_range 'd l' c.. |
| " |
| } |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --keep-empty keeps empty even if already in upstream" " |
| reset_rebase && |
| git rebase $* --keep-empty j l && |
| test_cmp_rev j HEAD~3 && |
| test_linear_range 'd k l' j.. |
| " |
| } |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| test_run_rebase success --rebase-merges |
| |
| # m |
| # / |
| # a---b---c---g |
| # |
| # x---y---bp |
| # |
| # bp = cherry-picked b |
| # m = reverted b |
| # |
| # Reverted patches are there for tests to be able to check if a commit |
| # that introduced the same change as another commit is |
| # dropped. Without reverted commits, we could get false positives |
| # because applying the patch succeeds, but simply results in no |
| # changes. |
| test_expect_success 'setup of linear history for test involving root' ' |
| git checkout b && |
| revert m b && |
| git checkout --orphan disjoint && |
| git rm -rf . && |
| test_commit x && |
| test_commit y && |
| cherry_pick bp b |
| ' |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --onto --root" " |
| reset_rebase && |
| git rebase $* --onto c --root y && |
| test_cmp_rev c HEAD~2 && |
| test_linear_range 'x y' c.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* without --onto --root with disjoint history" " |
| reset_rebase && |
| git rebase $* c y && |
| test_cmp_rev c HEAD~2 && |
| test_linear_range 'x y' c.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --onto --root drops patch in onto" " |
| reset_rebase && |
| git rebase $* --onto m --root bp && |
| test_cmp_rev m HEAD~2 && |
| test_linear_range 'x y' m.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --onto --root with merge-base does not go to root" " |
| reset_rebase && |
| git rebase $* --onto m --root g && |
| test_cmp_rev m HEAD~2 && |
| test_linear_range 'c g' m.. |
| " |
| } |
| |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* without --onto --root with disjoint history drops patch in onto" " |
| reset_rebase && |
| git rebase $* m bp && |
| test_cmp_rev m HEAD~2 && |
| test_linear_range 'x y' m.. |
| " |
| } |
| test_run_rebase success --apply |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* --root on linear history is a no-op" " |
| reset_rebase && |
| git rebase $* --root c && |
| test_cmp_rev c HEAD |
| " |
| } |
| test_run_rebase success '' |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase failure -p |
| |
| test_run_rebase () { |
| result=$1 |
| shift |
| test_expect_$result "rebase $* -f --root on linear history causes re-write" " |
| reset_rebase && |
| git rebase $* -f --root c && |
| test_cmp_rev ! a HEAD~2 && |
| test_linear_range 'a b c' HEAD |
| " |
| } |
| test_run_rebase success '' |
| test_run_rebase success -m |
| test_run_rebase success -i |
| test_have_prereq !REBASE_P || test_run_rebase success -p |
| |
| test_done |