summaryrefslogtreecommitdiffstats
path: root/t/t3407-rebase-abort.sh
blob: 9f49c4228b629589d7bfcf3435fda8e7c4b308be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/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