1#!/bin/sh
2#
3# Copyright (c) 2006, Junio C Hamano
4#
5
6test_description='fmt-merge-msg test'
7
8. ./test-lib.sh
9
10test_expect_success setup '
11	echo one >one &&
12	git add one &&
13	test_tick &&
14	git commit -m "Initial" &&
15
16	git clone . remote &&
17
18	echo uno >one &&
19	echo dos >two &&
20	git add two &&
21	test_tick &&
22	git commit -a -m "Second" &&
23
24	git checkout -b left &&
25
26	echo "c1" >one &&
27	test_tick &&
28	git commit -a -m "Common #1" &&
29
30	echo "c2" >one &&
31	test_tick &&
32	git commit -a -m "Common #2" &&
33
34	git branch right &&
35
36	echo "l3" >two &&
37	test_tick &&
38	GIT_COMMITTER_NAME="Another Committer" \
39	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #3" &&
40
41	echo "l4" >two &&
42	test_tick &&
43	GIT_COMMITTER_NAME="Another Committer" \
44	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #4" &&
45
46	echo "l5" >two &&
47	test_tick &&
48	GIT_COMMITTER_NAME="Another Committer" \
49	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #5" &&
50	git tag tag-l5 &&
51
52	git checkout right &&
53
54	echo "r3" >three &&
55	git add three &&
56	test_tick &&
57	git commit -a -m "Right #3" &&
58	git tag tag-r3 &&
59
60	echo "r4" >three &&
61	test_tick &&
62	git commit -a -m "Right #4" &&
63
64	echo "r5" >three &&
65	test_tick &&
66	git commit -a -m "Right #5" &&
67
68	git checkout -b long &&
69	test_commit_bulk --start=0 --message=%s --filename=one 30 &&
70
71	git show-branch &&
72
73	apos="'\''"
74'
75
76test_expect_success 'message for merging local branch' '
77	echo "Merge branch ${apos}left${apos}" >expected &&
78
79	git checkout master &&
80	git fetch . left &&
81
82	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
83	test_cmp expected actual
84'
85
86test_expect_success 'message for merging external branch' '
87	echo "Merge branch ${apos}left${apos} of $(pwd)" >expected &&
88
89	git checkout master &&
90	git fetch "$(pwd)" left &&
91
92	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
93	test_cmp expected actual
94'
95
96test_expect_success '[merge] summary/log configuration' '
97	cat >expected <<-EOF &&
98	Merge branch ${apos}left${apos}
99
100	# By Another Author (3) and A U Thor (2)
101	# Via Another Committer
102	* left:
103	  Left #5
104	  Left #4
105	  Left #3
106	  Common #2
107	  Common #1
108	EOF
109
110	test_config merge.log true &&
111	test_unconfig merge.summary &&
112
113	git checkout master &&
114	test_tick &&
115	git fetch . left &&
116
117	git fmt-merge-msg <.git/FETCH_HEAD >actual1 &&
118
119	test_unconfig merge.log &&
120	test_config merge.summary true &&
121
122	git checkout master &&
123	test_tick &&
124	git fetch . left &&
125
126	git fmt-merge-msg <.git/FETCH_HEAD >actual2 &&
127
128	test_cmp expected actual1 &&
129	test_cmp expected actual2
130'
131
132test_expect_success 'setup FETCH_HEAD' '
133	git checkout master &&
134	test_tick &&
135	git fetch . left
136'
137
138test_expect_success 'merge.log=3 limits shortlog length' '
139	cat >expected <<-EOF &&
140	Merge branch ${apos}left${apos}
141
142	# By Another Author (3) and A U Thor (2)
143	# Via Another Committer
144	* left: (5 commits)
145	  Left #5
146	  Left #4
147	  Left #3
148	  ...
149	EOF
150
151	git -c merge.log=3 fmt-merge-msg <.git/FETCH_HEAD >actual &&
152	test_cmp expected actual
153'
154
155test_expect_success 'merge.log=5 shows all 5 commits' '
156	cat >expected <<-EOF &&
157	Merge branch ${apos}left${apos}
158
159	# By Another Author (3) and A U Thor (2)
160	# Via Another Committer
161	* left:
162	  Left #5
163	  Left #4
164	  Left #3
165	  Common #2
166	  Common #1
167	EOF
168
169	git -c merge.log=5 fmt-merge-msg <.git/FETCH_HEAD >actual &&
170	test_cmp expected actual
171'
172
173test_expect_success '--log=5 with custom comment character' '
174	cat >expected <<-EOF &&
175	Merge branch ${apos}left${apos}
176
177	x By Another Author (3) and A U Thor (2)
178	x Via Another Committer
179	* left:
180	  Left #5
181	  Left #4
182	  Left #3
183	  Common #2
184	  Common #1
185	EOF
186
187	git -c core.commentchar="x" fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
188	test_cmp expected actual
189'
190
191test_expect_success 'merge.log=0 disables shortlog' '
192	echo "Merge branch ${apos}left${apos}" >expected &&
193	git -c merge.log=0 fmt-merge-msg <.git/FETCH_HEAD >actual &&
194	test_cmp expected actual
195'
196
197test_expect_success '--log=3 limits shortlog length' '
198	cat >expected <<-EOF &&
199	Merge branch ${apos}left${apos}
200
201	# By Another Author (3) and A U Thor (2)
202	# Via Another Committer
203	* left: (5 commits)
204	  Left #5
205	  Left #4
206	  Left #3
207	  ...
208	EOF
209
210	git fmt-merge-msg --log=3 <.git/FETCH_HEAD >actual &&
211	test_cmp expected actual
212'
213
214test_expect_success '--log=5 shows all 5 commits' '
215	cat >expected <<-EOF &&
216	Merge branch ${apos}left${apos}
217
218	# By Another Author (3) and A U Thor (2)
219	# Via Another Committer
220	* left:
221	  Left #5
222	  Left #4
223	  Left #3
224	  Common #2
225	  Common #1
226	EOF
227
228	git fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
229	test_cmp expected actual
230'
231
232test_expect_success '--no-log disables shortlog' '
233	echo "Merge branch ${apos}left${apos}" >expected &&
234	git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
235	test_cmp expected actual
236'
237
238test_expect_success '--log=0 disables shortlog' '
239	echo "Merge branch ${apos}left${apos}" >expected &&
240	git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
241	test_cmp expected actual
242'
243
244test_expect_success 'fmt-merge-msg -m' '
245	echo "Sync with left" >expected &&
246	cat >expected.log <<-EOF &&
247	Sync with left
248
249	# By Another Author (3) and A U Thor (2)
250	# Via Another Committer
251	* ${apos}left${apos} of $(pwd):
252	  Left #5
253	  Left #4
254	  Left #3
255	  Common #2
256	  Common #1
257	EOF
258
259	test_unconfig merge.log &&
260	test_unconfig merge.summary &&
261	git checkout master &&
262	git fetch "$(pwd)" left &&
263	git fmt-merge-msg -m "Sync with left" <.git/FETCH_HEAD >actual &&
264	git fmt-merge-msg --log -m "Sync with left" \
265					<.git/FETCH_HEAD >actual.log &&
266	test_config merge.log true &&
267	git fmt-merge-msg -m "Sync with left" \
268					<.git/FETCH_HEAD >actual.log-config &&
269	git fmt-merge-msg --no-log -m "Sync with left" \
270					<.git/FETCH_HEAD >actual.nolog &&
271
272	test_cmp expected actual &&
273	test_cmp expected.log actual.log &&
274	test_cmp expected.log actual.log-config &&
275	test_cmp expected actual.nolog
276'
277
278test_expect_success 'setup: expected shortlog for two branches' '
279	cat >expected <<-EOF
280	Merge branches ${apos}left${apos} and ${apos}right${apos}
281
282	# By Another Author (3) and A U Thor (2)
283	# Via Another Committer
284	* left:
285	  Left #5
286	  Left #4
287	  Left #3
288	  Common #2
289	  Common #1
290
291	* right:
292	  Right #5
293	  Right #4
294	  Right #3
295	  Common #2
296	  Common #1
297	EOF
298'
299
300test_expect_success 'shortlog for two branches' '
301	test_config merge.log true &&
302	test_unconfig merge.summary &&
303	git checkout master &&
304	test_tick &&
305	git fetch . left right &&
306	git fmt-merge-msg <.git/FETCH_HEAD >actual1 &&
307
308	test_unconfig merge.log &&
309	test_config merge.summary true &&
310	git checkout master &&
311	test_tick &&
312	git fetch . left right &&
313	git fmt-merge-msg <.git/FETCH_HEAD >actual2 &&
314
315	test_config merge.log yes &&
316	test_unconfig merge.summary &&
317	git checkout master &&
318	test_tick &&
319	git fetch . left right &&
320	git fmt-merge-msg <.git/FETCH_HEAD >actual3 &&
321
322	test_unconfig merge.log &&
323	test_config merge.summary yes &&
324	git checkout master &&
325	test_tick &&
326	git fetch . left right &&
327	git fmt-merge-msg <.git/FETCH_HEAD >actual4 &&
328
329	test_cmp expected actual1 &&
330	test_cmp expected actual2 &&
331	test_cmp expected actual3 &&
332	test_cmp expected actual4
333'
334
335test_expect_success 'merge-msg -F' '
336	test_unconfig merge.log &&
337	test_config merge.summary yes &&
338	git checkout master &&
339	test_tick &&
340	git fetch . left right &&
341	git fmt-merge-msg -F .git/FETCH_HEAD >actual &&
342	test_cmp expected actual
343'
344
345test_expect_success 'merge-msg -F in subdirectory' '
346	test_unconfig merge.log &&
347	test_config merge.summary yes &&
348	git checkout master &&
349	test_tick &&
350	git fetch . left right &&
351	mkdir sub &&
352	cp .git/FETCH_HEAD sub/FETCH_HEAD &&
353	(
354		cd sub &&
355		git fmt-merge-msg -F FETCH_HEAD >../actual
356	) &&
357	test_cmp expected actual
358'
359
360test_expect_success 'merge-msg with nothing to merge' '
361	test_unconfig merge.log &&
362	test_config merge.summary yes &&
363
364	(
365		cd remote &&
366		git checkout -b unrelated &&
367		test_tick &&
368		git fetch origin &&
369		git fmt-merge-msg <.git/FETCH_HEAD >../actual
370	) &&
371
372	test_must_be_empty actual
373'
374
375test_expect_success 'merge-msg tag' '
376	cat >expected <<-EOF &&
377	Merge tag ${apos}tag-r3${apos}
378
379	* tag ${apos}tag-r3${apos}:
380	  Right #3
381	  Common #2
382	  Common #1
383	EOF
384
385	test_unconfig merge.log &&
386	test_config merge.summary yes &&
387
388	git checkout master &&
389	test_tick &&
390	git fetch . tag tag-r3 &&
391
392	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
393	test_cmp expected actual
394'
395
396test_expect_success 'merge-msg two tags' '
397	cat >expected <<-EOF &&
398	Merge tags ${apos}tag-r3${apos} and ${apos}tag-l5${apos}
399
400	* tag ${apos}tag-r3${apos}:
401	  Right #3
402	  Common #2
403	  Common #1
404
405	# By Another Author (3) and A U Thor (2)
406	# Via Another Committer
407	* tag ${apos}tag-l5${apos}:
408	  Left #5
409	  Left #4
410	  Left #3
411	  Common #2
412	  Common #1
413	EOF
414
415	test_unconfig merge.log &&
416	test_config merge.summary yes &&
417
418	git checkout master &&
419	test_tick &&
420	git fetch . tag tag-r3 tag tag-l5 &&
421
422	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
423	test_cmp expected actual
424'
425
426test_expect_success 'merge-msg tag and branch' '
427	cat >expected <<-EOF &&
428	Merge branch ${apos}left${apos}, tag ${apos}tag-r3${apos}
429
430	* tag ${apos}tag-r3${apos}:
431	  Right #3
432	  Common #2
433	  Common #1
434
435	# By Another Author (3) and A U Thor (2)
436	# Via Another Committer
437	* left:
438	  Left #5
439	  Left #4
440	  Left #3
441	  Common #2
442	  Common #1
443	EOF
444
445	test_unconfig merge.log &&
446	test_config merge.summary yes &&
447
448	git checkout master &&
449	test_tick &&
450	git fetch . tag tag-r3 left &&
451
452	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
453	test_cmp expected actual
454'
455
456test_expect_success 'merge-msg lots of commits' '
457	{
458		cat <<-EOF &&
459		Merge branch ${apos}long${apos}
460
461		* long: (35 commits)
462		EOF
463
464		i=29 &&
465		while test $i -gt 9
466		do
467			echo "  $i" &&
468			i=$(($i-1))
469		done &&
470		echo "  ..."
471	} >expected &&
472
473	test_config merge.summary yes &&
474
475	git checkout master &&
476	test_tick &&
477	git fetch . long &&
478
479	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
480	test_cmp expected actual
481'
482
483test_expect_success 'merge-msg with "merging" an annotated tag' '
484	test_config merge.log true &&
485
486	git checkout master^0 &&
487	git commit --allow-empty -m "One step ahead" &&
488	git tag -a -m "An annotated one" annote HEAD &&
489
490	git checkout master &&
491	git fetch . annote &&
492
493	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
494	{
495		cat <<-\EOF
496		Merge tag '\''annote'\''
497
498		An annotated one
499
500		* tag '\''annote'\'':
501		  One step ahead
502		EOF
503	} >expected &&
504	test_cmp expected actual &&
505
506	test_when_finished "git reset --hard" &&
507	annote=$(git rev-parse annote) &&
508	git merge --no-commit --no-ff $annote &&
509	{
510		cat <<-EOF
511		Merge tag '\''$annote'\''
512
513		An annotated one
514
515		* tag '\''$annote'\'':
516		  One step ahead
517		EOF
518	} >expected &&
519	test_cmp expected .git/MERGE_MSG
520'
521
522test_done
523