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