]> git.ipfire.org Git - thirdparty/git.git/blame - t/t3425-rebase-topology-merges.sh
Merge branch 'rs/test-remove-useless-debugging-cat'
[thirdparty/git.git] / t / t3425-rebase-topology-merges.sh
CommitLineData
3f213981
MZ
1#!/bin/sh
2
3test_description='rebase topology tests with merges'
4. ./test-lib.sh
5. "$TEST_DIRECTORY"/lib-rebase.sh
6
7test_revision_subjects () {
8 expected="$1"
9 shift
10 set -- $(git log --format=%s --no-walk=unsorted "$@")
11 test "$expected" = "$*"
12}
13
14# a---b-----------c
15# \ \
16# d-------e \
17# \ \ \
18# n---o---w---v
19# \
20# z
21test_expect_success 'setup of non-linear-history' '
22 test_commit a &&
23 test_commit b &&
24 test_commit c &&
25 git checkout b &&
26 test_commit d &&
99094a7a 27 test_commit e &&
3f213981
MZ
28
29 git checkout c &&
30 test_commit g &&
31 revert h g &&
32 git checkout d &&
984f78d2 33 cherry_pick gp g &&
3f213981
MZ
34 test_commit i &&
35 git checkout b &&
99094a7a 36 test_commit f &&
3f213981
MZ
37
38 git checkout d &&
39 test_commit n &&
40 test_commit o &&
41 test_merge w e &&
42 test_merge v c &&
43 git checkout o &&
44 test_commit z
45'
46
47test_run_rebase () {
48 result=$1
49 shift
50 test_expect_$result "rebase $* after merge from upstream" "
51 reset_rebase &&
52 git rebase $* e w &&
53 test_cmp_rev e HEAD~2 &&
54 test_linear_range 'n o' e..
55 "
56}
57test_run_rebase success ''
58test_run_rebase success -m
59test_run_rebase success -i
60
61test_run_rebase () {
62 result=$1
63 shift
64 expected=$1
65 shift
66 test_expect_$result "rebase $* of non-linear history is linearized in place" "
67 reset_rebase &&
68 git rebase $* d w &&
69 test_cmp_rev d HEAD~3 &&
70 test_linear_range "\'"$expected"\'" d..
71 "
72}
c91c944a
EN
73test_run_rebase success 'n o e' ''
74test_run_rebase success 'n o e' -m
3f213981
MZ
75test_run_rebase success 'n o e' -i
76
77test_run_rebase () {
78 result=$1
79 shift
80 expected=$1
81 shift
82 test_expect_$result "rebase $* of non-linear history is linearized upstream" "
83 reset_rebase &&
84 git rebase $* c w &&
85 test_cmp_rev c HEAD~4 &&
86 test_linear_range "\'"$expected"\'" c..
87 "
88}
c91c944a
EN
89test_run_rebase success 'd n o e' ''
90test_run_rebase success 'd n o e' -m
3f213981
MZ
91test_run_rebase success 'd n o e' -i
92
93test_run_rebase () {
94 result=$1
95 shift
96 expected=$1
97 shift
98 test_expect_$result "rebase $* of non-linear history with merges after upstream merge is linearized" "
99 reset_rebase &&
100 git rebase $* c v &&
101 test_cmp_rev c HEAD~4 &&
102 test_linear_range "\'"$expected"\'" c..
103 "
104}
c91c944a
EN
105test_run_rebase success 'd n o e' ''
106test_run_rebase success 'd n o e' -m
3f213981
MZ
107test_run_rebase success 'd n o e' -i
108
11aad464
JS
109if ! test_have_prereq REBASE_P; then
110 skip_all='skipping git rebase -p tests, as asked for'
111 test_done
112fi
113
3f213981
MZ
114test_expect_success "rebase -p is no-op in non-linear history" "
115 reset_rebase &&
116 git rebase -p d w &&
117 test_cmp_rev w HEAD
118"
119
120test_expect_success "rebase -p is no-op when base inside second parent" "
121 reset_rebase &&
122 git rebase -p e w &&
123 test_cmp_rev w HEAD
124"
125
126test_expect_failure "rebase -p --root on non-linear history is a no-op" "
127 reset_rebase &&
128 git rebase -p --root w &&
129 test_cmp_rev w HEAD
130"
131
132test_expect_success "rebase -p re-creates merge from side branch" "
133 reset_rebase &&
134 git rebase -p z w &&
135 test_cmp_rev z HEAD^ &&
136 test_cmp_rev w^2 HEAD^2
137"
138
139test_expect_success "rebase -p re-creates internal merge" "
140 reset_rebase &&
141 git rebase -p c w &&
142 test_cmp_rev c HEAD~4 &&
143 test_cmp_rev HEAD^2^ HEAD~3 &&
144 test_revision_subjects 'd n e o w' HEAD~3 HEAD~2 HEAD^2 HEAD^ HEAD
145"
146
147test_expect_success "rebase -p can re-create two branches on onto" "
148 reset_rebase &&
149 git rebase -p --onto c d w &&
150 test_cmp_rev c HEAD~3 &&
151 test_cmp_rev c HEAD^2^ &&
152 test_revision_subjects 'n e o w' HEAD~2 HEAD^2 HEAD^ HEAD
153"
154
155# f
156# /
157# a---b---c---g---h
158# \
984f78d2 159# d---gp--i
3f213981
MZ
160# \ \
161# e-------u
162#
984f78d2 163# gp = cherry-picked g
3f213981
MZ
164# h = reverted g
165test_expect_success 'setup of non-linear-history for patch-equivalence tests' '
166 git checkout e &&
167 test_merge u i
168'
169
170test_expect_success "rebase -p re-creates history around dropped commit matching upstream" "
171 reset_rebase &&
172 git rebase -p h u &&
173 test_cmp_rev h HEAD~3 &&
174 test_cmp_rev HEAD^2^ HEAD~2 &&
175 test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
176"
177
178test_expect_success "rebase -p --onto in merged history drops patches in upstream" "
179 reset_rebase &&
180 git rebase -p --onto f h u &&
181 test_cmp_rev f HEAD~3 &&
182 test_cmp_rev HEAD^2^ HEAD~2 &&
183 test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
184"
185
186test_expect_success "rebase -p --onto in merged history does not drop patches in onto" "
187 reset_rebase &&
188 git rebase -p --onto h f u &&
189 test_cmp_rev h HEAD~3 &&
190 test_cmp_rev HEAD^2~2 HEAD~2 &&
984f78d2 191 test_revision_subjects 'd gp i e u' HEAD~2 HEAD^2^ HEAD^2 HEAD^ HEAD
3f213981
MZ
192"
193
194# a---b---c---g---h
195# \
984f78d2 196# d---gp--s
3f213981
MZ
197# \ \ /
198# \ X
199# \ / \
200# e---t
201#
984f78d2 202# gp = cherry-picked g
3f213981
MZ
203# h = reverted g
204test_expect_success 'setup of non-linear-history for dropping whole side' '
984f78d2 205 git checkout gp &&
3f213981
MZ
206 test_merge s e &&
207 git checkout e &&
984f78d2 208 test_merge t gp
3f213981
MZ
209'
210
211test_expect_failure "rebase -p drops merge commit when entire first-parent side is dropped" "
212 reset_rebase &&
213 git rebase -p h s &&
214 test_cmp_rev h HEAD~2 &&
215 test_linear_range 'd e' h..
216"
217
218test_expect_success "rebase -p drops merge commit when entire second-parent side is dropped" "
219 reset_rebase &&
220 git rebase -p h t &&
221 test_cmp_rev h HEAD~2 &&
222 test_linear_range 'd e' h..
223"
224
225# a---b---c
226# \
227# d---e
228# \ \
229# n---r
230# \
231# o
232#
233# r = tree-same with n
234test_expect_success 'setup of non-linear-history for empty commits' '
235 git checkout n &&
236 git merge --no-commit e &&
237 git reset n . &&
238 git commit -m r &&
239 git reset --hard &&
240 git clean -f &&
241 git tag r
242'
243
244test_expect_success "rebase -p re-creates empty internal merge commit" "
245 reset_rebase &&
246 git rebase -p c r &&
247 test_cmp_rev c HEAD~3 &&
248 test_cmp_rev HEAD^2^ HEAD~2 &&
249 test_revision_subjects 'd e n r' HEAD~2 HEAD^2 HEAD^ HEAD
250"
251
252test_expect_success "rebase -p re-creates empty merge commit" "
253 reset_rebase &&
254 git rebase -p o r &&
255 test_cmp_rev e HEAD^2 &&
256 test_cmp_rev o HEAD^ &&
257 test_revision_subjects 'r' HEAD
258"
259
260test_done