1#!/bin/sh
2
3test_description='git log --graph of skewed merges'
4
5. ./test-lib.sh
6. "$TEST_DIRECTORY"/lib-log-graph.sh
7
8check_graph () {
9	cat >expect &&
10	lib_test_cmp_graph --format=%s "$@"
11}
12
13test_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
41test_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
75test_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
103test_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
140test_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
173test_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
205test_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
242test_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
284test_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
311test_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
373test_done
374