3 # Copyright (c) 2013, 2014 Christian Couder
6 test_description='git interpret-trailers'
10 # When we want one trailing space at the end of each line, let's use sed
11 # to make sure that these spaces are not removed by any automatic tool.
13 test_expect_success 'setup' '
15 cat >basic_message <<-\EOF &&
20 cat >complex_message_body <<-\EOF &&
24 and contains some special
28 sed -e "s/ Z\$/ /" >complex_message_trailers <<-\EOF &&
34 cat >basic_patch <<-\EOF
37 1 file changed, 1 insertion(+), 1 deletion(-)
39 diff --git a/foo.txt b/foo.txt
40 index 0353767..1d91aa1 100644
54 test_expect_success 'without config' '
55 sed -e "s/ Z\$/ /" >expected <<-\EOF &&
61 git interpret-trailers --trailer "ack = Peff" --trailer "Reviewed-by" \
62 --trailer "Acked-by: Johan" empty >actual &&
63 test_cmp expected actual
66 test_expect_success 'without config in another order' '
67 sed -e "s/ Z\$/ /" >expected <<-\EOF &&
73 git interpret-trailers --trailer "Acked-by: Johan" --trailer "Reviewed-by" \
74 --trailer "ack = Peff" empty >actual &&
75 test_cmp expected actual
78 test_expect_success '--trim-empty without config' '
79 cat >expected <<-\EOF &&
84 git interpret-trailers --trim-empty --trailer ack=Peff \
85 --trailer "Reviewed-by" --trailer "Acked-by: Johan" \
86 --trailer "sob:" empty >actual &&
87 test_cmp expected actual
90 test_expect_success 'with config option on the command line' '
91 cat >expected <<-\EOF &&
96 { echo; echo "Acked-by: Johan"; } |
97 git -c "trailer.Acked-by.ifexists=addifdifferent" interpret-trailers \
98 --trailer "Reviewed-by: Peff" --trailer "Acked-by: Johan" >actual &&
99 test_cmp expected actual
102 test_expect_success 'with only a title in the message' '
103 cat >expected <<-\EOF &&
109 echo "area: change" |
110 git interpret-trailers --trailer "Reviewed-by: Peff" \
111 --trailer "Acked-by: Johan" >actual &&
112 test_cmp expected actual
115 test_expect_success 'with config setup' '
116 git config trailer.ack.key "Acked-by: " &&
117 cat >expected <<-\EOF &&
121 git interpret-trailers --trim-empty --trailer "ack = Peff" empty >actual &&
122 test_cmp expected actual &&
123 git interpret-trailers --trim-empty --trailer "Acked-by = Peff" empty >actual &&
124 test_cmp expected actual &&
125 git interpret-trailers --trim-empty --trailer "Acked-by :Peff" empty >actual &&
126 test_cmp expected actual
129 test_expect_success 'with config setup and ":=" as separators' '
130 git config trailer.separators ":=" &&
131 git config trailer.ack.key "Acked-by= " &&
132 cat >expected <<-\EOF &&
136 git interpret-trailers --trim-empty --trailer "ack = Peff" empty >actual &&
137 test_cmp expected actual &&
138 git interpret-trailers --trim-empty --trailer "Acked-by= Peff" empty >actual &&
139 test_cmp expected actual &&
140 git interpret-trailers --trim-empty --trailer "Acked-by : Peff" empty >actual &&
141 test_cmp expected actual
144 test_expect_success 'with config setup and "%" as separators' '
145 git config trailer.separators "%" &&
146 cat >expected <<-\EOF &&
152 git interpret-trailers --trim-empty --trailer "bug = 42" \
153 --trailer count%10 --trailer "test: stuff" \
154 --trailer "bug % 422" empty >actual &&
155 test_cmp expected actual
158 test_expect_success 'with "%" as separators and a message with trailers' '
159 cat >special_message <<-\EOF &&
166 cat >expected <<-\EOF &&
174 git interpret-trailers --trailer count%100 \
175 special_message >actual &&
176 test_cmp expected actual
179 test_expect_success 'with config setup and ":=#" as separators' '
180 git config trailer.separators ":=#" &&
181 git config trailer.bug.key "Bug #" &&
182 cat >expected <<-\EOF &&
186 git interpret-trailers --trim-empty --trailer "bug = 42" empty >actual &&
187 test_cmp expected actual
190 test_expect_success 'with commit basic message' '
191 cat basic_message >expected &&
193 git interpret-trailers <basic_message >actual &&
194 test_cmp expected actual
197 test_expect_success 'with basic patch' '
198 cat basic_message >input &&
199 cat basic_patch >>input &&
200 cat basic_message >expected &&
202 cat basic_patch >>expected &&
203 git interpret-trailers <input >actual &&
204 test_cmp expected actual
207 test_expect_success 'with commit complex message as argument' '
208 cat complex_message_body complex_message_trailers >complex_message &&
209 cat complex_message_body >expected &&
210 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
216 git interpret-trailers complex_message >actual &&
217 test_cmp expected actual
220 test_expect_success 'with 2 files arguments' '
221 cat basic_message >>expected &&
223 cat basic_patch >>expected &&
224 git interpret-trailers complex_message input >actual &&
225 test_cmp expected actual
228 test_expect_success 'with message that has comments' '
229 cat basic_message >>message_with_comments &&
230 sed -e "s/ Z\$/ /" >>message_with_comments <<-\EOF &&
235 # yet another comment
241 cat basic_patch >>message_with_comments &&
242 cat basic_message >expected &&
243 cat >>expected <<-\EOF &&
249 cat basic_patch >>expected &&
250 git interpret-trailers --trim-empty --trailer "Cc: Peff" message_with_comments >actual &&
251 test_cmp expected actual
254 test_expect_success 'with commit complex message and trailer args' '
255 cat complex_message_body >expected &&
256 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
264 git interpret-trailers --trailer "ack: Peff" \
265 --trailer "bug: 42" <complex_message >actual &&
266 test_cmp expected actual
269 test_expect_success 'with complex patch, args and --trim-empty' '
270 cat complex_message >complex_patch &&
271 cat basic_patch >>complex_patch &&
272 cat complex_message_body >expected &&
273 cat >>expected <<-\EOF &&
277 cat basic_patch >>expected &&
278 git interpret-trailers --trim-empty --trailer "ack: Peff" \
279 --trailer "bug: 42" <complex_patch >actual &&
280 test_cmp expected actual
283 test_expect_success 'using "where = before"' '
284 git config trailer.bug.where "before" &&
285 cat complex_message_body >expected &&
286 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
294 git interpret-trailers --trailer "ack: Peff" \
295 --trailer "bug: 42" complex_message >actual &&
296 test_cmp expected actual
299 test_expect_success 'using "where = after"' '
300 git config trailer.ack.where "after" &&
301 cat complex_message_body >expected &&
302 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
310 git interpret-trailers --trailer "ack: Peff" \
311 --trailer "bug: 42" complex_message >actual &&
312 test_cmp expected actual
315 test_expect_success 'using "where = end"' '
316 git config trailer.review.key "Reviewed-by" &&
317 git config trailer.review.where "end" &&
318 cat complex_message_body >expected &&
319 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
326 Reviewed-by: Johannes
328 git interpret-trailers --trailer "ack: Peff" \
329 --trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
330 complex_message >actual &&
331 test_cmp expected actual
334 test_expect_success 'using "where = start"' '
335 git config trailer.review.key "Reviewed-by" &&
336 git config trailer.review.where "start" &&
337 cat complex_message_body >expected &&
338 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
339 Reviewed-by: Johannes
347 git interpret-trailers --trailer "ack: Peff" \
348 --trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
349 complex_message >actual &&
350 test_cmp expected actual
353 test_expect_success 'using "where = before" for a token in the middle of the message' '
354 git config trailer.review.key "Reviewed-by:" &&
355 git config trailer.review.where "before" &&
356 cat complex_message_body >expected &&
357 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
366 git interpret-trailers --trailer "ack: Peff" --trailer "bug: 42" \
367 --trailer "review: Johan" <complex_message >actual &&
368 test_cmp expected actual
371 test_expect_success 'using "where = before" and --trim-empty' '
372 cat complex_message_body >expected &&
373 cat >>expected <<-\EOF &&
379 git interpret-trailers --trim-empty --trailer "ack: Peff" \
380 --trailer "bug: 42" --trailer "review: Johan" \
381 --trailer "Bug: 46" <complex_message >actual &&
382 test_cmp expected actual
385 test_expect_success 'the default is "ifExists = addIfDifferentNeighbor"' '
386 cat complex_message_body >expected &&
387 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
397 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
398 --trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
399 --trailer "ack: Peff" <complex_message >actual &&
400 test_cmp expected actual
403 test_expect_success 'default "ifExists" is now "addIfDifferent"' '
404 git config trailer.ifexists "addIfDifferent" &&
405 cat complex_message_body >expected &&
406 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
415 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
416 --trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
417 --trailer "ack: Peff" <complex_message >actual &&
418 test_cmp expected actual
421 test_expect_success 'using "ifExists = addIfDifferent" with "where = end"' '
422 git config trailer.ack.ifExists "addIfDifferent" &&
423 git config trailer.ack.where "end" &&
424 cat complex_message_body >expected &&
425 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
433 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
434 --trailer "bug: 42" --trailer "ack: Peff" \
435 <complex_message >actual &&
436 test_cmp expected actual
439 test_expect_success 'using "ifExists = addIfDifferent" with "where = before"' '
440 git config trailer.ack.ifExists "addIfDifferent" &&
441 git config trailer.ack.where "before" &&
442 cat complex_message_body >expected &&
443 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
451 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
452 --trailer "bug: 42" --trailer "ack: Peff" \
453 <complex_message >actual &&
454 test_cmp expected actual
457 test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = end"' '
458 git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
459 git config trailer.ack.where "end" &&
460 cat complex_message_body >expected &&
461 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
473 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
474 --trailer "ack: Junio" --trailer "bug: 42" \
475 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
476 --trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
477 test_cmp expected actual
480 test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = after"' '
481 git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
482 git config trailer.ack.where "after" &&
483 cat complex_message_body >expected &&
484 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
495 git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
496 --trailer "ack: Junio" --trailer "bug: 42" \
497 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
498 --trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
499 test_cmp expected actual
502 test_expect_success 'using "ifExists = addIfDifferentNeighbor" and --trim-empty' '
503 git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
504 cat complex_message_body >expected &&
505 cat >>expected <<-\EOF &&
511 git interpret-trailers --trim-empty --trailer "ack: Peff" \
512 --trailer "Acked-by= Peff" --trailer "review:" \
513 --trailer "ack: Junio" --trailer "bug: 42" \
514 --trailer "ack: Peff" <complex_message >actual &&
515 test_cmp expected actual
518 test_expect_success 'using "ifExists = add" with "where = end"' '
519 git config trailer.ack.ifExists "add" &&
520 git config trailer.ack.where "end" &&
521 cat complex_message_body >expected &&
522 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
535 git interpret-trailers --trailer "ack: Peff" \
536 --trailer "Acked-by= Peff" --trailer "review:" \
537 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
538 --trailer "bug: 42" --trailer "Tested-by: Johannes" \
539 --trailer "ack: Peff" <complex_message >actual &&
540 test_cmp expected actual
543 test_expect_success 'using "ifExists = add" with "where = after"' '
544 git config trailer.ack.ifExists "add" &&
545 git config trailer.ack.where "after" &&
546 cat complex_message_body >expected &&
547 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
558 git interpret-trailers --trailer "ack: Peff" \
559 --trailer "Acked-by= Peff" --trailer "review:" \
560 --trailer "ack: Junio" --trailer "bug: 42" \
561 --trailer "ack: Peff" <complex_message >actual &&
562 test_cmp expected actual
565 test_expect_success 'using "ifExists = replace"' '
566 git config trailer.fix.key "Fixes: " &&
567 git config trailer.fix.ifExists "replace" &&
568 cat complex_message_body >expected &&
569 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
578 git interpret-trailers --trailer "review:" \
579 --trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
580 --trailer "bug: 42" --trailer "ack: Peff" \
581 <complex_message >actual &&
582 test_cmp expected actual
585 test_expect_success 'using "ifExists = replace" with "where = after"' '
586 git config trailer.fix.where "after" &&
587 cat complex_message_body >expected &&
588 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
597 git interpret-trailers --trailer "review:" \
598 --trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
599 --trailer "bug: 42" --trailer "ack: Peff" \
600 <complex_message >actual &&
601 test_cmp expected actual
604 test_expect_success 'using "ifExists = doNothing"' '
605 git config trailer.fix.ifExists "doNothing" &&
606 cat complex_message_body >expected &&
607 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
616 git interpret-trailers --trailer "review:" --trailer "fix=53" \
617 --trailer "ack: Junio" --trailer "fix=22" \
618 --trailer "bug: 42" --trailer "ack: Peff" \
619 <complex_message >actual &&
620 test_cmp expected actual
623 test_expect_success 'the default is "ifMissing = add"' '
624 git config trailer.cc.key "Cc: " &&
625 git config trailer.cc.where "before" &&
626 cat complex_message_body >expected &&
627 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
637 git interpret-trailers --trailer "review:" --trailer "fix=53" \
638 --trailer "cc=Linus" --trailer "ack: Junio" \
639 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
640 <complex_message >actual &&
641 test_cmp expected actual
644 test_expect_success 'when default "ifMissing" is "doNothing"' '
645 git config trailer.ifmissing "doNothing" &&
646 cat complex_message_body >expected &&
647 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
655 git interpret-trailers --trailer "review:" --trailer "fix=53" \
656 --trailer "cc=Linus" --trailer "ack: Junio" \
657 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
658 <complex_message >actual &&
659 test_cmp expected actual &&
660 git config trailer.ifmissing "add"
663 test_expect_success 'using "ifMissing = add" with "where = end"' '
664 git config trailer.cc.key "Cc: " &&
665 git config trailer.cc.where "end" &&
666 git config trailer.cc.ifMissing "add" &&
667 cat complex_message_body >expected &&
668 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
678 git interpret-trailers --trailer "review:" --trailer "fix=53" \
679 --trailer "ack: Junio" --trailer "fix=22" \
680 --trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
681 <complex_message >actual &&
682 test_cmp expected actual
685 test_expect_success 'using "ifMissing = add" with "where = before"' '
686 git config trailer.cc.key "Cc: " &&
687 git config trailer.cc.where "before" &&
688 git config trailer.cc.ifMissing "add" &&
689 cat complex_message_body >expected &&
690 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
700 git interpret-trailers --trailer "review:" --trailer "fix=53" \
701 --trailer "ack: Junio" --trailer "fix=22" \
702 --trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
703 <complex_message >actual &&
704 test_cmp expected actual
707 test_expect_success 'using "ifMissing = doNothing"' '
708 git config trailer.cc.ifMissing "doNothing" &&
709 cat complex_message_body >expected &&
710 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
719 git interpret-trailers --trailer "review:" --trailer "fix=53" \
720 --trailer "cc=Linus" --trailer "ack: Junio" \
721 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
722 <complex_message >actual &&
723 test_cmp expected actual
726 test_expect_success 'default "where" is now "after"' '
727 git config trailer.where "after" &&
728 git config --unset trailer.ack.where &&
729 cat complex_message_body >expected &&
730 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
743 git interpret-trailers --trailer "ack: Peff" \
744 --trailer "Acked-by= Peff" --trailer "review:" \
745 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
746 --trailer "bug: 42" --trailer "Tested-by: Johannes" \
747 --trailer "ack: Peff" <complex_message >actual &&
748 test_cmp expected actual
751 test_expect_success 'with simple command' '
752 git config trailer.sign.key "Signed-off-by: " &&
753 git config trailer.sign.where "after" &&
754 git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
755 git config trailer.sign.command "echo \"A U Thor <author@example.com>\"" &&
756 cat complex_message_body >expected &&
757 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
762 Signed-off-by: A U Thor <author@example.com>
764 git interpret-trailers --trailer "review:" --trailer "fix=22" \
765 <complex_message >actual &&
766 test_cmp expected actual
769 test_expect_success 'with command using commiter information' '
770 git config trailer.sign.ifExists "addIfDifferent" &&
771 git config trailer.sign.command "echo \"\$GIT_COMMITTER_NAME <\$GIT_COMMITTER_EMAIL>\"" &&
772 cat complex_message_body >expected &&
773 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
778 Signed-off-by: C O Mitter <committer@example.com>
780 git interpret-trailers --trailer "review:" --trailer "fix=22" \
781 <complex_message >actual &&
782 test_cmp expected actual
785 test_expect_success 'with command using author information' '
786 git config trailer.sign.key "Signed-off-by: " &&
787 git config trailer.sign.where "after" &&
788 git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
789 git config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" &&
790 cat complex_message_body >expected &&
791 sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
796 Signed-off-by: A U Thor <author@example.com>
798 git interpret-trailers --trailer "review:" --trailer "fix=22" \
799 <complex_message >actual &&
800 test_cmp expected actual
803 test_expect_success 'setup a commit' '
804 echo "Content of the first commit." > a.txt &&
806 git commit -m "Add file a.txt"
809 test_expect_success 'with command using $ARG' '
810 git config trailer.fix.ifExists "replace" &&
811 git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" &&
812 FIXED=$(git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14 HEAD) &&
813 cat complex_message_body >expected &&
814 sed -e "s/ Z\$/ /" >>expected <<-EOF &&
819 Signed-off-by: A U Thor <author@example.com>
821 git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
822 <complex_message >actual &&
823 test_cmp expected actual
826 test_expect_success 'with failing command using $ARG' '
827 git config trailer.fix.ifExists "replace" &&
828 git config trailer.fix.command "false \$ARG" &&
829 cat complex_message_body >expected &&
830 sed -e "s/ Z\$/ /" >>expected <<-EOF &&
835 Signed-off-by: A U Thor <author@example.com>
837 git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
838 <complex_message >actual &&
839 test_cmp expected actual
842 test_expect_success 'with empty tokens' '
843 git config --unset trailer.fix.command &&
844 cat >expected <<-EOF &&
846 Signed-off-by: A U Thor <author@example.com>
848 git interpret-trailers --trailer ":" --trailer ":test" >actual <<-EOF &&
850 test_cmp expected actual
853 test_expect_success 'with command but no key' '
854 git config --unset trailer.sign.key &&
855 cat >expected <<-EOF &&
857 sign: A U Thor <author@example.com>
859 git interpret-trailers >actual <<-EOF &&
861 test_cmp expected actual
864 test_expect_success 'with no command and no key' '
865 git config --unset trailer.review.key &&
866 cat >expected <<-EOF &&
869 sign: A U Thor <author@example.com>
871 git interpret-trailers --trailer "review:Junio" >actual <<-EOF &&
873 test_cmp expected actual