]> git.ipfire.org Git - thirdparty/git.git/blob - t/t4215-log-skewed-merges.sh
The sixth batch
[thirdparty/git.git] / t / t4215-log-skewed-merges.sh
1 #!/bin/sh
2
3 test_description='git log --graph of skewed merges'
4
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/lib-log-graph.sh
7
8 check_graph () {
9 cat >expect &&
10 lib_test_cmp_graph --format=%s "$@"
11 }
12
13 test_expect_success 'log --graph with merge fusing with its left and right neighbors' '
14 git checkout --orphan _p &&
15 test_commit A &&
16 test_commit B &&
17 git checkout -b _q @^ && test_commit C &&
18 git checkout -b _r @^ && test_commit D &&
19 git checkout _p && git merge --no-ff _q _r -m E &&
20 git checkout _r && test_commit F &&
21 git checkout _p && git merge --no-ff _r -m G &&
22 git checkout @^^ && git merge --no-ff _p -m H &&
23
24 check_graph <<-\EOF
25 * H
26 |\
27 | * G
28 | |\
29 | | * F
30 | * | E
31 |/|\|
32 | | * D
33 | * | C
34 | |/
35 * / B
36 |/
37 * A
38 EOF
39 '
40
41 test_expect_success 'log --graph with left-skewed merge' '
42 git checkout --orphan 0_p && test_commit 0_A &&
43 git checkout -b 0_q 0_p && test_commit 0_B &&
44 git checkout -b 0_r 0_p &&
45 test_commit 0_C &&
46 test_commit 0_D &&
47 git checkout -b 0_s 0_p && test_commit 0_E &&
48 git checkout -b 0_t 0_p && git merge --no-ff 0_r^ 0_s -m 0_F &&
49 git checkout 0_p && git merge --no-ff 0_s -m 0_G &&
50 git checkout @^ && git merge --no-ff 0_q 0_r 0_t 0_p -m 0_H &&
51
52 check_graph <<-\EOF
53 *-----. 0_H
54 |\ \ \ \
55 | | | | * 0_G
56 | |_|_|/|
57 |/| | | |
58 | | | * | 0_F
59 | |_|/|\|
60 |/| | | |
61 | | | | * 0_E
62 | |_|_|/
63 |/| | |
64 | | * | 0_D
65 | | |/
66 | | * 0_C
67 | |/
68 |/|
69 | * 0_B
70 |/
71 * 0_A
72 EOF
73 '
74
75 test_expect_success 'log --graph with nested left-skewed merge' '
76 git checkout --orphan 1_p &&
77 test_commit 1_A &&
78 test_commit 1_B &&
79 test_commit 1_C &&
80 git checkout -b 1_q @^ && test_commit 1_D &&
81 git checkout 1_p && git merge --no-ff 1_q -m 1_E &&
82 git checkout -b 1_r @~3 && test_commit 1_F &&
83 git checkout 1_p && git merge --no-ff 1_r -m 1_G &&
84 git checkout @^^ && git merge --no-ff 1_p -m 1_H &&
85
86 check_graph <<-\EOF
87 * 1_H
88 |\
89 | * 1_G
90 | |\
91 | | * 1_F
92 | * | 1_E
93 |/| |
94 | * | 1_D
95 * | | 1_C
96 |/ /
97 * / 1_B
98 |/
99 * 1_A
100 EOF
101 '
102
103 test_expect_success 'log --graph with nested left-skewed merge following normal merge' '
104 git checkout --orphan 2_p &&
105 test_commit 2_A &&
106 test_commit 2_B &&
107 test_commit 2_C &&
108 git checkout -b 2_q @^^ &&
109 test_commit 2_D &&
110 test_commit 2_E &&
111 git checkout -b 2_r @^ && test_commit 2_F &&
112 git checkout 2_q &&
113 git merge --no-ff 2_r -m 2_G &&
114 git merge --no-ff 2_p^ -m 2_H &&
115 git checkout -b 2_s @^^ && git merge --no-ff 2_q -m 2_J &&
116 git checkout 2_p && git merge --no-ff 2_s -m 2_K &&
117
118 check_graph <<-\EOF
119 * 2_K
120 |\
121 | * 2_J
122 | |\
123 | | * 2_H
124 | | |\
125 | | * | 2_G
126 | |/| |
127 | | * | 2_F
128 | * | | 2_E
129 | |/ /
130 | * | 2_D
131 * | | 2_C
132 | |/
133 |/|
134 * | 2_B
135 |/
136 * 2_A
137 EOF
138 '
139
140 test_expect_success 'log --graph with nested right-skewed merge following left-skewed merge' '
141 git checkout --orphan 3_p &&
142 test_commit 3_A &&
143 git checkout -b 3_q &&
144 test_commit 3_B &&
145 test_commit 3_C &&
146 git checkout -b 3_r @^ &&
147 test_commit 3_D &&
148 git checkout 3_q && git merge --no-ff 3_r -m 3_E &&
149 git checkout 3_p && git merge --no-ff 3_q -m 3_F &&
150 git checkout 3_r && test_commit 3_G &&
151 git checkout 3_p && git merge --no-ff 3_r -m 3_H &&
152 git checkout @^^ && git merge --no-ff 3_p -m 3_J &&
153
154 check_graph <<-\EOF
155 * 3_J
156 |\
157 | * 3_H
158 | |\
159 | | * 3_G
160 | * | 3_F
161 |/| |
162 | * | 3_E
163 | |\|
164 | | * 3_D
165 | * | 3_C
166 | |/
167 | * 3_B
168 |/
169 * 3_A
170 EOF
171 '
172
173 test_expect_success 'log --graph with right-skewed merge following a left-skewed one' '
174 git checkout --orphan 4_p &&
175 test_commit 4_A &&
176 test_commit 4_B &&
177 test_commit 4_C &&
178 git checkout -b 4_q @^^ && test_commit 4_D &&
179 git checkout -b 4_r 4_p^ && git merge --no-ff 4_q -m 4_E &&
180 git checkout -b 4_s 4_p^^ &&
181 git merge --no-ff 4_r -m 4_F &&
182 git merge --no-ff 4_p -m 4_G &&
183 git checkout @^^ && git merge --no-ff 4_s -m 4_H &&
184
185 check_graph --date-order <<-\EOF
186 * 4_H
187 |\
188 | * 4_G
189 | |\
190 | * | 4_F
191 |/| |
192 | * | 4_E
193 | |\ \
194 | | * | 4_D
195 | |/ /
196 |/| |
197 | | * 4_C
198 | |/
199 | * 4_B
200 |/
201 * 4_A
202 EOF
203 '
204
205 test_expect_success 'log --graph with octopus merge with column joining its penultimate parent' '
206 git checkout --orphan 5_p &&
207 test_commit 5_A &&
208 git branch 5_q &&
209 git branch 5_r &&
210 test_commit 5_B &&
211 git checkout 5_q && test_commit 5_C &&
212 git checkout 5_r && test_commit 5_D &&
213 git checkout 5_p &&
214 git merge --no-ff 5_q 5_r -m 5_E &&
215 git checkout 5_q && test_commit 5_F &&
216 git checkout -b 5_s 5_p^ &&
217 git merge --no-ff 5_p 5_q -m 5_G &&
218 git checkout 5_r &&
219 git merge --no-ff 5_s -m 5_H &&
220
221 check_graph <<-\EOF
222 * 5_H
223 |\
224 | *-. 5_G
225 | |\ \
226 | | | * 5_F
227 | | * | 5_E
228 | |/|\ \
229 | |_|/ /
230 |/| | /
231 | | |/
232 * | | 5_D
233 | | * 5_C
234 | |/
235 |/|
236 | * 5_B
237 |/
238 * 5_A
239 EOF
240 '
241
242 test_expect_success 'log --graph with multiple tips' '
243 git checkout --orphan 6_1 &&
244 test_commit 6_A &&
245 git branch 6_2 &&
246 git branch 6_4 &&
247 test_commit 6_B &&
248 git branch 6_3 &&
249 test_commit 6_C &&
250 git checkout 6_2 && test_commit 6_D &&
251 git checkout 6_3 && test_commit 6_E &&
252 git checkout -b 6_5 6_1 &&
253 git merge --no-ff 6_2 -m 6_F &&
254 git checkout 6_4 && test_commit 6_G &&
255 git checkout 6_3 &&
256 git merge --no-ff 6_4 -m 6_H &&
257 git checkout 6_1 &&
258 git merge --no-ff 6_2 -m 6_I &&
259
260 check_graph 6_1 6_3 6_5 <<-\EOF
261 * 6_I
262 |\
263 | | * 6_H
264 | | |\
265 | | | * 6_G
266 | | * | 6_E
267 | | | | * 6_F
268 | |_|_|/|
269 |/| | |/
270 | | |/|
271 | |/| |
272 | * | | 6_D
273 | | |/
274 | |/|
275 * | | 6_C
276 | |/
277 |/|
278 * | 6_B
279 |/
280 * 6_A
281 EOF
282 '
283
284 test_expect_success 'log --graph with multiple tips and colors' '
285 test_config log.graphColors red,green,yellow,blue,magenta,cyan &&
286 cat >expect.colors <<-\EOF &&
287 * 6_I
288 <RED>|<RESET><GREEN>\<RESET>
289 <RED>|<RESET> <GREEN>|<RESET> * 6_H
290 <RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET><BLUE>\<RESET>
291 <RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> * 6_G
292 <RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET> * 6_F
293 <RED>|<RESET> <GREEN>|<RESET><RED>_<RESET><YELLOW>|<RESET><RED>_<RESET><BLUE>|<RESET><RED>/<RESET><GREEN>|<RESET>
294 <RED>|<RESET><RED>/<RESET><GREEN>|<RESET> <YELLOW>|<RESET> <BLUE>|<RESET><GREEN>/<RESET>
295 <RED>|<RESET> <GREEN>|<RESET> <YELLOW>|<RESET><GREEN>/<RESET><BLUE>|<RESET>
296 <RED>|<RESET> <GREEN>|<RESET><GREEN>/<RESET><YELLOW>|<RESET> <BLUE>|<RESET>
297 <RED>|<RESET> <GREEN>|<RESET> * <BLUE>|<RESET> 6_E
298 <RED>|<RESET> * <CYAN>|<RESET> <BLUE>|<RESET> 6_D
299 <RED>|<RESET> <BLUE>|<RESET> <CYAN>|<RESET><BLUE>/<RESET>
300 <RED>|<RESET> <BLUE>|<RESET><BLUE>/<RESET><CYAN>|<RESET>
301 * <BLUE>|<RESET> <CYAN>|<RESET> 6_C
302 <CYAN>|<RESET> <BLUE>|<RESET><CYAN>/<RESET>
303 <CYAN>|<RESET><CYAN>/<RESET><BLUE>|<RESET>
304 * <BLUE>|<RESET> 6_B
305 <BLUE>|<RESET><BLUE>/<RESET>
306 * 6_A
307 EOF
308 lib_test_cmp_colored_graph --date-order --pretty=tformat:%s 6_1 6_3 6_5
309 '
310
311 test_expect_success 'log --graph with multiple tips' '
312 git checkout --orphan 7_1 &&
313 test_commit 7_A &&
314 test_commit 7_B &&
315 test_commit 7_C &&
316 git checkout -b 7_2 7_1~2 &&
317 test_commit 7_D &&
318 test_commit 7_E &&
319 git checkout -b 7_3 7_1~1 &&
320 test_commit 7_F &&
321 test_commit 7_G &&
322 git checkout -b 7_4 7_2~1 &&
323 test_commit 7_H &&
324 git checkout -b 7_5 7_1~2 &&
325 test_commit 7_I &&
326 git checkout -b 7_6 7_3~1 &&
327 test_commit 7_J &&
328 git checkout -b M_1 7_1 &&
329 git merge --no-ff 7_2 -m 7_M1 &&
330 git checkout -b M_3 7_3 &&
331 git merge --no-ff 7_4 -m 7_M2 &&
332 git checkout -b M_5 7_5 &&
333 git merge --no-ff 7_6 -m 7_M3 &&
334 git checkout -b M_7 7_1 &&
335 git merge --no-ff 7_2 7_3 -m 7_M4 &&
336
337 check_graph M_1 M_3 M_5 M_7 <<-\EOF
338 * 7_M1
339 |\
340 | | * 7_M2
341 | | |\
342 | | | * 7_H
343 | | | | * 7_M3
344 | | | | |\
345 | | | | | * 7_J
346 | | | | * | 7_I
347 | | | | | | * 7_M4
348 | |_|_|_|_|/|\
349 |/| | | | |/ /
350 | | |_|_|/| /
351 | |/| | | |/
352 | | | |_|/|
353 | | |/| | |
354 | | * | | | 7_G
355 | | | |_|/
356 | | |/| |
357 | | * | | 7_F
358 | * | | | 7_E
359 | | |/ /
360 | |/| |
361 | * | | 7_D
362 | | |/
363 | |/|
364 * | | 7_C
365 | |/
366 |/|
367 * | 7_B
368 |/
369 * 7_A
370 EOF
371 '
372
373 test_done