summaryrefslogtreecommitdiffstats
path: root/t/t3422-rebase-incompatible-options.sh
blob: 2eba00bdf5898531744c8f77429a8f4d1ad1b91d (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/bin/sh

test_description='test if rebase detects and aborts on incompatible options'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '
	test_seq 2 9 >foo &&
	git add foo &&
	git commit -m orig &&

	git branch A &&
	git branch B &&

	git checkout A &&
	test_seq 1 9 >foo &&
	git add foo &&
	git commit -m A &&

	git checkout B &&
	echo "q qfoo();" | q_to_tab >>foo &&
	git add foo &&
	git commit -m B
'

#
# Rebase has a couple options which are specific to the apply backend,
# and several options which are specific to the merge backend.  Flags
# from the different sets cannot work together, and we do not want to
# just ignore one of the sets of flags.  Make sure rebase warns the
# user and aborts instead.
#

test_rebase_am_only () {
	opt=$1
	shift
	test_expect_success "$opt incompatible with --merge" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --merge A
	"

	test_expect_success "$opt incompatible with --strategy=ours" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --strategy=ours A
	"

	test_expect_success "$opt incompatible with --strategy-option=ours" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --strategy-option=ours A
	"

	test_expect_success "$opt incompatible with --autosquash" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --autosquash A
	"

	test_expect_success "$opt incompatible with --interactive" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --interactive A
	"

	test_expect_success "$opt incompatible with --exec" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --exec 'true' A
	"

	test_expect_success "$opt incompatible with --keep-empty" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --keep-empty A
	"

	test_expect_success "$opt incompatible with --empty=..." "
		git checkout B^0 &&
		test_must_fail git rebase $opt --empty=ask A
	"

	test_expect_success "$opt incompatible with --no-reapply-cherry-picks" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --no-reapply-cherry-picks A
	"

	test_expect_success "$opt incompatible with --reapply-cherry-picks" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --reapply-cherry-picks A
	"

	test_expect_success "$opt incompatible with --rebase-merges" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --rebase-merges A
	"

	test_expect_success "$opt incompatible with --update-refs" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --update-refs A
	"

	test_expect_success "$opt incompatible with --root without --onto" "
		git checkout B^0 &&
		test_must_fail git rebase $opt --root A
	"

	test_expect_success "$opt incompatible with rebase.autosquash" "
		git checkout B^0 &&
		test_must_fail git -c rebase.autosquash=true rebase $opt A 2>err &&
		grep -e --no-autosquash err
	"

	test_expect_success "$opt incompatible with rebase.rebaseMerges" "
		git checkout B^0 &&
		test_must_fail git -c rebase.rebaseMerges=true rebase $opt A 2>err &&
		grep -e --no-rebase-merges err
	"

	test_expect_success "$opt incompatible with rebase.updateRefs" "
		git checkout B^0 &&
		test_must_fail git -c rebase.updateRefs=true rebase $opt A 2>err &&
		grep -e --no-update-refs err
	"

	test_expect_success "$opt okay with overridden rebase.autosquash" "
		test_when_finished \"git reset --hard B^0\" &&
		git checkout B^0 &&
		git -c rebase.autosquash=true rebase --no-autosquash $opt A
	"

	test_expect_success "$opt okay with overridden rebase.rebaseMerges" "
		test_when_finished \"git reset --hard B^0\" &&
		git checkout B^0 &&
		git -c rebase.rebaseMerges=true rebase --no-rebase-merges $opt A
	"

	test_expect_success "$opt okay with overridden rebase.updateRefs" "
		test_when_finished \"git reset --hard B^0\" &&
		git checkout B^0 &&
		git -c rebase.updateRefs=true rebase --no-update-refs $opt A
	"
}

# Check options which imply --apply
test_rebase_am_only --whitespace=fix
test_rebase_am_only -C4
# Also check an explicit --apply
test_rebase_am_only --apply

test_done