Merge branch 'jk/set-upstream-error-cases'
[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 'merge.log=0 disables shortlog' '
179         echo "Merge branch ${apos}left${apos}" >expected
180         git -c merge.log=0 fmt-merge-msg <.git/FETCH_HEAD >actual &&
181         test_cmp expected actual
182 '
183
184 test_expect_success '--log=3 limits shortlog length' '
185         cat >expected <<-EOF &&
186         Merge branch ${apos}left${apos}
187
188         # By Another Author (3) and A U Thor (2)
189         # Via Another Committer
190         * left: (5 commits)
191           Left #5
192           Left #4
193           Left #3
194           ...
195         EOF
196
197         git fmt-merge-msg --log=3 <.git/FETCH_HEAD >actual &&
198         test_cmp expected actual
199 '
200
201 test_expect_success '--log=5 shows all 5 commits' '
202         cat >expected <<-EOF &&
203         Merge branch ${apos}left${apos}
204
205         # By Another Author (3) and A U Thor (2)
206         # Via Another Committer
207         * left:
208           Left #5
209           Left #4
210           Left #3
211           Common #2
212           Common #1
213         EOF
214
215         git fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
216         test_cmp expected actual
217 '
218
219 test_expect_success '--no-log disables shortlog' '
220         echo "Merge branch ${apos}left${apos}" >expected &&
221         git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
222         test_cmp expected actual
223 '
224
225 test_expect_success '--log=0 disables shortlog' '
226         echo "Merge branch ${apos}left${apos}" >expected &&
227         git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
228         test_cmp expected actual
229 '
230
231 test_expect_success 'fmt-merge-msg -m' '
232         echo "Sync with left" >expected &&
233         cat >expected.log <<-EOF &&
234         Sync with left
235
236         # By Another Author (3) and A U Thor (2)
237         # Via Another Committer
238         * ${apos}left${apos} of $(pwd):
239           Left #5
240           Left #4
241           Left #3
242           Common #2
243           Common #1
244         EOF
245
246         test_unconfig merge.log &&
247         test_unconfig merge.summary &&
248         git checkout master &&
249         git fetch "$(pwd)" left &&
250         git fmt-merge-msg -m "Sync with left" <.git/FETCH_HEAD >actual &&
251         git fmt-merge-msg --log -m "Sync with left" \
252                                         <.git/FETCH_HEAD >actual.log &&
253         test_config merge.log true &&
254         git fmt-merge-msg -m "Sync with left" \
255                                         <.git/FETCH_HEAD >actual.log-config &&
256         git fmt-merge-msg --no-log -m "Sync with left" \
257                                         <.git/FETCH_HEAD >actual.nolog &&
258
259         test_cmp expected actual &&
260         test_cmp expected.log actual.log &&
261         test_cmp expected.log actual.log-config &&
262         test_cmp expected actual.nolog
263 '
264
265 test_expect_success 'setup: expected shortlog for two branches' '
266         cat >expected <<-EOF
267         Merge branches ${apos}left${apos} and ${apos}right${apos}
268
269         # By Another Author (3) and A U Thor (2)
270         # Via Another Committer
271         * left:
272           Left #5
273           Left #4
274           Left #3
275           Common #2
276           Common #1
277
278         * right:
279           Right #5
280           Right #4
281           Right #3
282           Common #2
283           Common #1
284         EOF
285 '
286
287 test_expect_success 'shortlog for two branches' '
288         test_config merge.log true &&
289         test_unconfig merge.summary &&
290         git checkout master &&
291         test_tick &&
292         git fetch . left right &&
293         git fmt-merge-msg <.git/FETCH_HEAD >actual1 &&
294
295         test_unconfig merge.log &&
296         test_config merge.summary true &&
297         git checkout master &&
298         test_tick &&
299         git fetch . left right &&
300         git fmt-merge-msg <.git/FETCH_HEAD >actual2 &&
301
302         test_config merge.log yes &&
303         test_unconfig merge.summary &&
304         git checkout master &&
305         test_tick &&
306         git fetch . left right &&
307         git fmt-merge-msg <.git/FETCH_HEAD >actual3 &&
308
309         test_unconfig merge.log &&
310         test_config merge.summary yes &&
311         git checkout master &&
312         test_tick &&
313         git fetch . left right &&
314         git fmt-merge-msg <.git/FETCH_HEAD >actual4 &&
315
316         test_cmp expected actual1 &&
317         test_cmp expected actual2 &&
318         test_cmp expected actual3 &&
319         test_cmp expected actual4
320 '
321
322 test_expect_success 'merge-msg -F' '
323         test_unconfig merge.log &&
324         test_config merge.summary yes &&
325         git checkout master &&
326         test_tick &&
327         git fetch . left right &&
328         git fmt-merge-msg -F .git/FETCH_HEAD >actual &&
329         test_cmp expected actual
330 '
331
332 test_expect_success 'merge-msg -F in subdirectory' '
333         test_unconfig merge.log &&
334         test_config merge.summary yes &&
335         git checkout master &&
336         test_tick &&
337         git fetch . left right &&
338         mkdir sub &&
339         cp .git/FETCH_HEAD sub/FETCH_HEAD &&
340         (
341                 cd sub &&
342                 git fmt-merge-msg -F FETCH_HEAD >../actual
343         ) &&
344         test_cmp expected actual
345 '
346
347 test_expect_success 'merge-msg with nothing to merge' '
348         test_unconfig merge.log &&
349         test_config merge.summary yes &&
350
351         >empty &&
352
353         (
354                 cd remote &&
355                 git checkout -b unrelated &&
356                 test_tick &&
357                 git fetch origin &&
358                 git fmt-merge-msg <.git/FETCH_HEAD >../actual
359         ) &&
360
361         test_cmp empty actual
362 '
363
364 test_expect_success 'merge-msg tag' '
365         cat >expected <<-EOF &&
366         Merge tag ${apos}tag-r3${apos}
367
368         * tag ${apos}tag-r3${apos}:
369           Right #3
370           Common #2
371           Common #1
372         EOF
373
374         test_unconfig merge.log &&
375         test_config merge.summary yes &&
376
377         git checkout master &&
378         test_tick &&
379         git fetch . tag tag-r3 &&
380
381         git fmt-merge-msg <.git/FETCH_HEAD >actual &&
382         test_cmp expected actual
383 '
384
385 test_expect_success 'merge-msg two tags' '
386         cat >expected <<-EOF &&
387         Merge tags ${apos}tag-r3${apos} and ${apos}tag-l5${apos}
388
389         * tag ${apos}tag-r3${apos}:
390           Right #3
391           Common #2
392           Common #1
393
394         # By Another Author (3) and A U Thor (2)
395         # Via Another Committer
396         * tag ${apos}tag-l5${apos}:
397           Left #5
398           Left #4
399           Left #3
400           Common #2
401           Common #1
402         EOF
403
404         test_unconfig merge.log &&
405         test_config merge.summary yes &&
406
407         git checkout master &&
408         test_tick &&
409         git fetch . tag tag-r3 tag tag-l5 &&
410
411         git fmt-merge-msg <.git/FETCH_HEAD >actual &&
412         test_cmp expected actual
413 '
414
415 test_expect_success 'merge-msg tag and branch' '
416         cat >expected <<-EOF &&
417         Merge branch ${apos}left${apos}, tag ${apos}tag-r3${apos}
418
419         * tag ${apos}tag-r3${apos}:
420           Right #3
421           Common #2
422           Common #1
423
424         # By Another Author (3) and A U Thor (2)
425         # Via Another Committer
426         * left:
427           Left #5
428           Left #4
429           Left #3
430           Common #2
431           Common #1
432         EOF
433
434         test_unconfig merge.log &&
435         test_config merge.summary yes &&
436
437         git checkout master &&
438         test_tick &&
439         git fetch . tag tag-r3 left &&
440
441         git fmt-merge-msg <.git/FETCH_HEAD >actual &&
442         test_cmp expected actual
443 '
444
445 test_expect_success 'merge-msg lots of commits' '
446         {
447                 cat <<-EOF &&
448                 Merge branch ${apos}long${apos}
449
450                 * long: (35 commits)
451                 EOF
452
453                 i=29 &&
454                 while test $i -gt 9
455                 do
456                         echo "  $i" &&
457                         i=$(($i-1))
458                 done &&
459                 echo "  ..."
460         } >expected &&
461
462         test_config merge.summary yes &&
463
464         git checkout master &&
465         test_tick &&
466         git fetch . long &&
467
468         git fmt-merge-msg <.git/FETCH_HEAD >actual &&
469         test_cmp expected actual
470 '
471
472 test_expect_success 'merge-msg with "merging" an annotated tag' '
473         test_config merge.log true &&
474
475         git checkout master^0 &&
476         git commit --allow-empty -m "One step ahead" &&
477         git tag -a -m "An annotated one" annote HEAD &&
478
479         git checkout master &&
480         git fetch . annote &&
481
482         git fmt-merge-msg <.git/FETCH_HEAD >actual &&
483         {
484                 cat <<-\EOF
485                 Merge tag '\''annote'\''
486
487                 An annotated one
488
489                 * tag '\''annote'\'':
490                   One step ahead
491                 EOF
492         } >expected &&
493         test_cmp expected actual &&
494
495         test_when_finished "git reset --hard" &&
496         annote=$(git rev-parse annote) &&
497         git merge --no-commit $annote &&
498         {
499                 cat <<-EOF
500                 Merge tag '\''$annote'\''
501
502                 An annotated one
503
504                 * tag '\''$annote'\'':
505                   One step ahead
506                 EOF
507         } >expected &&
508         test_cmp expected .git/MERGE_MSG
509 '
510
511 test_done