rebase --merge: optionally skip upstreamed commits
[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         test_commit_bulk --start=0 --message=%s --filename=one 30 &&
70
71         git show-branch &&
72
73         apos="'\''"
74 '
75
76 test_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
86 test_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
96 test_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
132 test_expect_success 'setup FETCH_HEAD' '
133         git checkout master &&
134         test_tick &&
135         git fetch . left
136 '
137
138 test_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
155 test_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
173 test_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
191 test_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
197 test_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
214 test_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
232 test_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
238 test_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
244 test_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
278 test_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
300 test_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
335 test_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
345 test_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
360 test_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
375 test_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
396 test_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
426 test_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
456 test_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
483 test_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
522 test_done