]> git.ipfire.org Git - thirdparty/git.git/blame_incremental - t/t3421-rebase-topology-linear.sh
The eleventh batch
[thirdparty/git.git] / t / t3421-rebase-topology-linear.sh
... / ...
CommitLineData
1#!/bin/sh
2
3test_description='basic rebase topology tests'
4. ./test-lib.sh
5. "$TEST_DIRECTORY"/lib-rebase.sh
6
7# a---b---c
8# \
9# d---e
10test_expect_success 'setup' '
11 test_commit a &&
12 test_commit b &&
13 test_commit c &&
14 git checkout b &&
15 test_commit d &&
16 test_commit e
17'
18
19test_run_rebase () {
20 result=$1
21 shift
22 test_expect_$result "simple rebase $*" "
23 reset_rebase &&
24 git rebase $* c e &&
25 test_cmp_rev c HEAD~2 &&
26 test_linear_range 'd e' c..
27 "
28}
29test_run_rebase success --apply
30test_run_rebase success -m
31test_run_rebase success -i
32
33test_expect_success 'setup branches and remote tracking' '
34 git tag -l >tags &&
35 for tag in $(cat tags)
36 do
37 git branch branch-$tag $tag || return 1
38 done &&
39 git remote add origin "file://$PWD" &&
40 git fetch origin
41'
42
43test_run_rebase () {
44 result=$1
45 shift
46 test_expect_$result "rebase $* is no-op if upstream is an ancestor" "
47 reset_rebase &&
48 git rebase $* b e &&
49 test_cmp_rev e HEAD
50 "
51}
52test_run_rebase success --apply
53test_run_rebase success -m
54test_run_rebase success -i
55
56test_run_rebase () {
57 result=$1
58 shift
59 test_expect_$result "rebase $* -f rewrites even if upstream is an ancestor" "
60 reset_rebase &&
61 git rebase $* -f b e &&
62 test_cmp_rev ! e HEAD &&
63 test_cmp_rev b HEAD~2 &&
64 test_linear_range 'd e' b..
65 "
66}
67test_run_rebase success --apply
68test_run_rebase success --fork-point
69test_run_rebase success -m
70test_run_rebase success -i
71
72test_run_rebase () {
73 result=$1
74 shift
75 test_expect_$result "rebase $* -f rewrites even if remote upstream is an ancestor" "
76 reset_rebase &&
77 git rebase $* -f branch-b branch-e &&
78 test_cmp_rev ! branch-e origin/branch-e &&
79 test_cmp_rev branch-b HEAD~2 &&
80 test_linear_range 'd e' branch-b..
81 "
82}
83test_run_rebase success --apply
84test_run_rebase success --fork-point
85test_run_rebase success -m
86test_run_rebase success -i
87
88test_run_rebase () {
89 result=$1
90 shift
91 test_expect_$result "rebase $* fast-forwards from ancestor of upstream" "
92 reset_rebase &&
93 git rebase $* e b &&
94 test_cmp_rev e HEAD
95 "
96}
97test_run_rebase success --apply
98test_run_rebase success --fork-point
99test_run_rebase success -m
100test_run_rebase success -i
101
102# f
103# /
104# a---b---c---g---h
105# \
106# d---gp--i
107#
108# gp = cherry-picked g
109# h = reverted g
110#
111# Reverted patches are there for tests to be able to check if a commit
112# that introduced the same change as another commit is
113# dropped. Without reverted commits, we could get false positives
114# because applying the patch succeeds, but simply results in no
115# changes.
116test_expect_success 'setup of linear history for range selection tests' '
117 git checkout c &&
118 test_commit g &&
119 revert h g &&
120 git checkout d &&
121 cherry_pick gp g &&
122 test_commit i &&
123 git checkout b &&
124 test_commit f
125'
126
127test_run_rebase () {
128 result=$1
129 shift
130 test_expect_$result "rebase $* drops patches in upstream" "
131 reset_rebase &&
132 git rebase $* h i &&
133 test_cmp_rev h HEAD~2 &&
134 test_linear_range 'd i' h..
135 "
136}
137test_run_rebase success --apply
138test_run_rebase success -m
139test_run_rebase success -i
140
141test_run_rebase () {
142 result=$1
143 shift
144 test_expect_$result "rebase $* can drop last patch if in upstream" "
145 reset_rebase &&
146 git rebase $* h gp &&
147 test_cmp_rev h HEAD^ &&
148 test_linear_range 'd' h..
149 "
150}
151test_run_rebase success --apply
152test_run_rebase success -m
153test_run_rebase success -i
154
155test_run_rebase () {
156 result=$1
157 shift
158 test_expect_$result "rebase $* --onto drops patches in upstream" "
159 reset_rebase &&
160 git rebase $* --onto f h i &&
161 test_cmp_rev f HEAD~2 &&
162 test_linear_range 'd i' f..
163 "
164}
165test_run_rebase success --apply
166test_run_rebase success -m
167test_run_rebase success -i
168
169test_run_rebase () {
170 result=$1
171 shift
172 test_expect_$result "rebase $* --onto does not drop patches in onto" "
173 reset_rebase &&
174 git rebase $* --onto h f i &&
175 test_cmp_rev h HEAD~3 &&
176 test_linear_range 'd gp i' h..
177 "
178}
179test_run_rebase success --apply
180test_run_rebase success -m
181test_run_rebase success -i
182
183# a---b---c---j!
184# \
185# d---k!--l
186#
187# ! = empty
188test_expect_success 'setup of linear history for empty commit tests' '
189 git checkout c &&
190 make_empty j &&
191 git checkout d &&
192 make_empty k &&
193 test_commit l
194'
195
196test_run_rebase () {
197 result=$1
198 shift
199 test_expect_$result "rebase $* keeps begin-empty commits" "
200 reset_rebase &&
201 git rebase $* j l &&
202 test_cmp_rev c HEAD~4 &&
203 test_linear_range 'j d k l' c..
204 "
205}
206test_run_rebase failure --apply
207test_run_rebase success -m
208test_run_rebase success -i
209
210test_run_rebase () {
211 result=$1
212 shift
213 test_expect_$result "rebase $* --no-keep-empty drops begin-empty commits" "
214 reset_rebase &&
215 git rebase $* --no-keep-empty c l &&
216 test_cmp_rev c HEAD~2 &&
217 test_linear_range 'd l' c..
218 "
219}
220test_run_rebase success -m
221test_run_rebase success -i
222
223test_run_rebase () {
224 result=$1
225 shift
226 test_expect_$result "rebase $* --keep-empty keeps empty even if already in upstream" "
227 reset_rebase &&
228 git rebase $* --keep-empty j l &&
229 test_cmp_rev j HEAD~3 &&
230 test_linear_range 'd k l' j..
231 "
232}
233test_run_rebase success -m
234test_run_rebase success -i
235test_run_rebase success --rebase-merges
236
237# m
238# /
239# a---b---c---g
240#
241# x---y---bp
242#
243# bp = cherry-picked b
244# m = reverted b
245#
246# Reverted patches are there for tests to be able to check if a commit
247# that introduced the same change as another commit is
248# dropped. Without reverted commits, we could get false positives
249# because applying the patch succeeds, but simply results in no
250# changes.
251test_expect_success 'setup of linear history for test involving root' '
252 git checkout b &&
253 revert m b &&
254 git checkout --orphan disjoint &&
255 git rm -rf . &&
256 test_commit x &&
257 test_commit y &&
258 cherry_pick bp b
259'
260
261test_run_rebase () {
262 result=$1
263 shift
264 test_expect_$result "rebase $* --onto --root" "
265 reset_rebase &&
266 git rebase $* --onto c --root y &&
267 test_cmp_rev c HEAD~2 &&
268 test_linear_range 'x y' c..
269 "
270}
271test_run_rebase success --apply
272test_run_rebase success -m
273test_run_rebase success -i
274
275test_run_rebase () {
276 result=$1
277 shift
278 test_expect_$result "rebase $* without --onto --root with disjoint history" "
279 reset_rebase &&
280 git rebase $* c y &&
281 test_cmp_rev c HEAD~2 &&
282 test_linear_range 'x y' c..
283 "
284}
285test_run_rebase success --apply
286test_run_rebase success -m
287test_run_rebase success -i
288
289test_run_rebase () {
290 result=$1
291 shift
292 test_expect_$result "rebase $* --onto --root drops patch in onto" "
293 reset_rebase &&
294 git rebase $* --onto m --root bp &&
295 test_cmp_rev m HEAD~2 &&
296 test_linear_range 'x y' m..
297 "
298}
299test_run_rebase success --apply
300test_run_rebase success -m
301test_run_rebase success -i
302
303test_run_rebase () {
304 result=$1
305 shift
306 test_expect_$result "rebase $* --onto --root with merge-base does not go to root" "
307 reset_rebase &&
308 git rebase $* --onto m --root g &&
309 test_cmp_rev m HEAD~2 &&
310 test_linear_range 'c g' m..
311 "
312}
313
314test_run_rebase success --apply
315test_run_rebase success -m
316test_run_rebase success -i
317
318test_run_rebase () {
319 result=$1
320 shift
321 test_expect_$result "rebase $* without --onto --root with disjoint history drops patch in onto" "
322 reset_rebase &&
323 git rebase $* m bp &&
324 test_cmp_rev m HEAD~2 &&
325 test_linear_range 'x y' m..
326 "
327}
328test_run_rebase success --apply
329test_run_rebase success -m
330test_run_rebase success -i
331
332test_run_rebase () {
333 result=$1
334 shift
335 test_expect_$result "rebase $* --root on linear history is a no-op" "
336 reset_rebase &&
337 git rebase $* --root c &&
338 test_cmp_rev c HEAD
339 "
340}
341test_run_rebase success ''
342test_run_rebase success -m
343test_run_rebase success -i
344
345test_run_rebase () {
346 result=$1
347 shift
348 test_expect_$result "rebase $* -f --root on linear history causes re-write" "
349 reset_rebase &&
350 git rebase $* -f --root c &&
351 test_cmp_rev ! a HEAD~2 &&
352 test_linear_range 'a b c' HEAD
353 "
354}
355test_run_rebase success ''
356test_run_rebase success -m
357test_run_rebase success -i
358
359test_done