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