mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Phillip Wood](/assets/img/avatar_default.png)
A rebase started with 'git rebase <A> <B>' is conceptually to first checkout <B> and run 'git rebase <A>' starting from that state. 'git rebase --abort' in the middle of such a rebase should take us back to the state we checked out <B>. This used to work, even when <B> is a tag that points at a commit, until Git 2.20.0 when the command was reimplemented in C. The command now complains that the tag object itself cannot be checked out, which may be technically correct but is not what the user asked to do. Fix this old regression by using lookup_commit_reference_by_name() when parsing <B>. The scripted version did not need to peel the tag because the commands it passed the tag to (e.g 'git reset') peeled the tag themselves. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
117 lines
3.2 KiB
Bash
Executable file
117 lines
3.2 KiB
Bash
Executable file
#!/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 "rebase$type --abort after --skip" '
|
|
# 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" &&
|
|
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
|