| #!/bin/sh |
| |
| test_description='git rebase --abort tests' |
| |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| . ./test-lib.sh |
| |
| test_expect_success setup ' |
| test_commit a a a && |
| git branch to-rebase && |
| |
| test_commit --annotate b a b && |
| test_commit --annotate c a c && |
| |
| git checkout to-rebase && |
| test_commit "merge should fail on this" a d d && |
| test_commit --annotate "merge should fail on this, too" a e pre-rebase |
| ' |
| |
| # Check that HEAD is equal to "pre-rebase" and the current branch is |
| # "to-rebase" |
| check_head() { |
| test_cmp_rev HEAD pre-rebase^{commit} && |
| test "$(git symbolic-ref HEAD)" = refs/heads/to-rebase |
| } |
| |
| testrebase() { |
| type=$1 |
| state_dir=$2 |
| |
| test_expect_success "rebase$type --abort" ' |
| # Clean up the state from the previous one |
| git reset --hard pre-rebase && |
| test_must_fail git rebase$type main && |
| test_path_is_dir "$state_dir" && |
| git rebase --abort && |
| check_head && |
| test_path_is_missing "$state_dir" |
| ' |
| |
| test_expect_success "pre rebase$type head is marked as reachable" ' |
| # Clean up the state from the previous one |
| git checkout -f --detach pre-rebase && |
| test_tick && |
| git commit --amend --only -m "reworded" && |
| orig_head=$(git rev-parse HEAD) && |
| test_must_fail git rebase$type main && |
| # Stop ORIG_HEAD marking $state_dir/orig-head as reachable |
| git update-ref -d ORIG_HEAD && |
| git reflog expire --expire="$GIT_COMMITTER_DATE" --all && |
| git prune --expire=now && |
| git rebase --abort && |
| test_cmp_rev $orig_head HEAD |
| ' |
| |
| test_expect_success "rebase$type --abort after --skip" ' |
| # Clean up the state from the previous one |
| git checkout -B to-rebase pre-rebase && |
| test_must_fail git rebase$type main && |
| test_path_is_dir "$state_dir" && |
| test_must_fail git rebase --skip && |
| test_cmp_rev HEAD main && |
| git rebase --abort && |
| check_head && |
| test_path_is_missing "$state_dir" |
| ' |
| |
| test_expect_success "rebase$type --abort after --continue" ' |
| # Clean up the state from the previous one |
| git reset --hard pre-rebase && |
| test_must_fail git rebase$type main && |
| test_path_is_dir "$state_dir" && |
| echo c > a && |
| echo d >> a && |
| git add a && |
| test_must_fail git rebase --continue && |
| test_cmp_rev ! HEAD main && |
| git rebase --abort && |
| check_head && |
| test_path_is_missing "$state_dir" |
| ' |
| |
| test_expect_success "rebase$type --abort when checking out a tag" ' |
| test_when_finished "git symbolic-ref HEAD refs/heads/to-rebase" && |
| git reset --hard a -- && |
| test_must_fail git rebase$type --onto b c pre-rebase && |
| test_cmp_rev HEAD b^{commit} && |
| git rebase --abort && |
| test_cmp_rev HEAD pre-rebase^{commit} && |
| ! git symbolic-ref HEAD |
| ' |
| |
| test_expect_success "rebase$type --abort does not update reflog" ' |
| # Clean up the state from the previous one |
| git reset --hard pre-rebase && |
| git reflog show to-rebase > reflog_before && |
| test_must_fail git rebase$type main && |
| git rebase --abort && |
| git reflog show to-rebase > reflog_after && |
| test_cmp reflog_before reflog_after && |
| rm reflog_before reflog_after |
| ' |
| |
| test_expect_success 'rebase --abort can not be used with other options' ' |
| # Clean up the state from the previous one |
| git reset --hard pre-rebase && |
| test_must_fail git rebase$type main && |
| test_must_fail git rebase -v --abort && |
| test_must_fail git rebase --abort -v && |
| git rebase --abort |
| ' |
| |
| test_expect_success "rebase$type --quit" ' |
| test_when_finished "git symbolic-ref HEAD refs/heads/to-rebase" && |
| # Clean up the state from the previous one |
| git reset --hard pre-rebase && |
| test_must_fail git rebase$type main && |
| test_path_is_dir $state_dir && |
| head_before=$(git rev-parse HEAD) && |
| git rebase --quit && |
| test_cmp_rev HEAD $head_before && |
| test_path_is_missing .git/rebase-apply |
| ' |
| } |
| |
| testrebase " --apply" .git/rebase-apply |
| testrebase " --merge" .git/rebase-merge |
| |
| test_done |