t2026: rename worktree prune test
[git] / t / t7513-interpret-trailers.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2013, 2014 Christian Couder
4 #
5
6 test_description='git interpret-trailers'
7
8 . ./test-lib.sh
9
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.
12
13 test_expect_success 'setup' '
14         : >empty &&
15         cat >basic_message <<-\EOF &&
16                 subject
17
18                 body
19         EOF
20         cat >complex_message_body <<-\EOF &&
21                 my subject
22
23                 my body which is long
24                 and contains some special
25                 chars like : = ? !
26
27         EOF
28         sed -e "s/ Z\$/ /" >complex_message_trailers <<-\EOF &&
29                 Fixes: Z
30                 Acked-by: Z
31                 Reviewed-by: Z
32                 Signed-off-by: Z
33         EOF
34         cat >basic_patch <<-\EOF
35                 ---
36                  foo.txt | 2 +-
37                  1 file changed, 1 insertion(+), 1 deletion(-)
38
39                 diff --git a/foo.txt b/foo.txt
40                 index 0353767..1d91aa1 100644
41                 --- a/foo.txt
42                 +++ b/foo.txt
43                 @@ -1,3 +1,3 @@
44
45                 -bar
46                 +baz
47
48                 --
49                 1.9.rc0.11.ga562ddc
50
51         EOF
52 '
53
54 test_expect_success 'without config' '
55         sed -e "s/ Z\$/ /" >expected <<-\EOF &&
56
57                 ack: Peff
58                 Reviewed-by: Z
59                 Acked-by: Johan
60         EOF
61         git interpret-trailers --trailer "ack = Peff" --trailer "Reviewed-by" \
62                 --trailer "Acked-by: Johan" empty >actual &&
63         test_cmp expected actual
64 '
65
66 test_expect_success 'without config in another order' '
67         sed -e "s/ Z\$/ /" >expected <<-\EOF &&
68
69                 Acked-by: Johan
70                 Reviewed-by: Z
71                 ack: Peff
72         EOF
73         git interpret-trailers --trailer "Acked-by: Johan" --trailer "Reviewed-by" \
74                 --trailer "ack = Peff" empty >actual &&
75         test_cmp expected actual
76 '
77
78 test_expect_success '--trim-empty without config' '
79         cat >expected <<-\EOF &&
80
81                 ack: Peff
82                 Acked-by: Johan
83         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
88 '
89
90 test_expect_success 'with config option on the command line' '
91         cat >expected <<-\EOF &&
92
93                 Acked-by: Johan
94                 Reviewed-by: Peff
95         EOF
96         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
100 '
101
102 test_expect_success 'with config setup' '
103         git config trailer.ack.key "Acked-by: " &&
104         cat >expected <<-\EOF &&
105
106                 Acked-by: Peff
107         EOF
108         git interpret-trailers --trim-empty --trailer "ack = Peff" empty >actual &&
109         test_cmp expected actual &&
110         git interpret-trailers --trim-empty --trailer "Acked-by = Peff" empty >actual &&
111         test_cmp expected actual &&
112         git interpret-trailers --trim-empty --trailer "Acked-by :Peff" empty >actual &&
113         test_cmp expected actual
114 '
115
116 test_expect_success 'with config setup and ":=" as separators' '
117         git config trailer.separators ":=" &&
118         git config trailer.ack.key "Acked-by= " &&
119         cat >expected <<-\EOF &&
120
121                 Acked-by= Peff
122         EOF
123         git interpret-trailers --trim-empty --trailer "ack = 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 &&
127         git interpret-trailers --trim-empty --trailer "Acked-by : Peff" empty >actual &&
128         test_cmp expected actual
129 '
130
131 test_expect_success 'with config setup and "%" as separators' '
132         git config trailer.separators "%" &&
133         cat >expected <<-\EOF &&
134
135                 bug% 42
136                 count% 10
137                 bug% 422
138         EOF
139         git interpret-trailers --trim-empty --trailer "bug = 42" \
140                 --trailer count%10 --trailer "test: stuff" \
141                 --trailer "bug % 422" empty >actual &&
142         test_cmp expected actual
143 '
144
145 test_expect_success 'with "%" as separators and a message with trailers' '
146         cat >special_message <<-\EOF &&
147                 Special Message
148
149                 bug% 42
150                 count% 10
151                 bug% 422
152         EOF
153         cat >expected <<-\EOF &&
154                 Special Message
155
156                 bug% 42
157                 count% 10
158                 bug% 422
159                 count% 100
160         EOF
161         git interpret-trailers --trailer count%100 \
162                 special_message >actual &&
163         test_cmp expected actual
164 '
165
166 test_expect_success 'with config setup and ":=#" as separators' '
167         git config trailer.separators ":=#" &&
168         git config trailer.bug.key "Bug #" &&
169         cat >expected <<-\EOF &&
170
171                 Bug #42
172         EOF
173         git interpret-trailers --trim-empty --trailer "bug = 42" empty >actual &&
174         test_cmp expected actual
175 '
176
177 test_expect_success 'with commit basic message' '
178         cat basic_message >expected &&
179         echo >>expected &&
180         git interpret-trailers <basic_message >actual &&
181         test_cmp expected actual
182 '
183
184 test_expect_success 'with basic patch' '
185         cat basic_message >input &&
186         cat basic_patch >>input &&
187         cat basic_message >expected &&
188         echo >>expected &&
189         cat basic_patch >>expected &&
190         git interpret-trailers <input >actual &&
191         test_cmp expected actual
192 '
193
194 test_expect_success 'with commit complex message as argument' '
195         cat complex_message_body complex_message_trailers >complex_message &&
196         cat complex_message_body >expected &&
197         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
198                 Fixes: Z
199                 Acked-by= Z
200                 Reviewed-by: Z
201                 Signed-off-by: Z
202         EOF
203         git interpret-trailers complex_message >actual &&
204         test_cmp expected actual
205 '
206
207 test_expect_success 'with 2 files arguments' '
208         cat basic_message >>expected &&
209         echo >>expected &&
210         cat basic_patch >>expected &&
211         git interpret-trailers complex_message input >actual &&
212         test_cmp expected actual
213 '
214
215 test_expect_success 'with message that has comments' '
216         cat basic_message >>message_with_comments &&
217         sed -e "s/ Z\$/ /" >>message_with_comments <<-\EOF &&
218                 # comment
219
220                 # other comment
221                 Cc: Z
222                 # yet another comment
223                 Reviewed-by: Johan
224                 Reviewed-by: Z
225                 # last comment
226
227         EOF
228         cat basic_patch >>message_with_comments &&
229         cat basic_message >expected &&
230         cat >>expected <<-\EOF &&
231                 # comment
232
233                 Reviewed-by: Johan
234                 Cc: Peff
235         EOF
236         cat basic_patch >>expected &&
237         git interpret-trailers --trim-empty --trailer "Cc: Peff" message_with_comments >actual &&
238         test_cmp expected actual
239 '
240
241 test_expect_success 'with commit complex message and trailer args' '
242         cat complex_message_body >expected &&
243         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
244                 Fixes: Z
245                 Acked-by= Z
246                 Reviewed-by: Z
247                 Signed-off-by: Z
248                 Acked-by= Peff
249                 Bug #42
250         EOF
251         git interpret-trailers --trailer "ack: Peff" \
252                 --trailer "bug: 42" <complex_message >actual &&
253         test_cmp expected actual
254 '
255
256 test_expect_success 'with complex patch, args and --trim-empty' '
257         cat complex_message >complex_patch &&
258         cat basic_patch >>complex_patch &&
259         cat complex_message_body >expected &&
260         cat >>expected <<-\EOF &&
261                 Acked-by= Peff
262                 Bug #42
263         EOF
264         cat basic_patch >>expected &&
265         git interpret-trailers --trim-empty --trailer "ack: Peff" \
266                 --trailer "bug: 42" <complex_patch >actual &&
267         test_cmp expected actual
268 '
269
270 test_expect_success 'using "where = before"' '
271         git config trailer.bug.where "before" &&
272         cat complex_message_body >expected &&
273         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
274                 Bug #42
275                 Fixes: Z
276                 Acked-by= Z
277                 Reviewed-by: Z
278                 Signed-off-by: Z
279                 Acked-by= Peff
280         EOF
281         git interpret-trailers --trailer "ack: Peff" \
282                 --trailer "bug: 42" complex_message >actual &&
283         test_cmp expected actual
284 '
285
286 test_expect_success 'using "where = after"' '
287         git config trailer.ack.where "after" &&
288         cat complex_message_body >expected &&
289         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
290                 Bug #42
291                 Fixes: Z
292                 Acked-by= Z
293                 Acked-by= Peff
294                 Reviewed-by: Z
295                 Signed-off-by: Z
296         EOF
297         git interpret-trailers --trailer "ack: Peff" \
298                 --trailer "bug: 42" complex_message >actual &&
299         test_cmp expected actual
300 '
301
302 test_expect_success 'using "where = end"' '
303         git config trailer.review.key "Reviewed-by" &&
304         git config trailer.review.where "end" &&
305         cat complex_message_body >expected &&
306         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
307                 Fixes: Z
308                 Acked-by= Z
309                 Acked-by= Peff
310                 Reviewed-by: Z
311                 Signed-off-by: Z
312                 Reviewed-by: Junio
313                 Reviewed-by: Johannes
314         EOF
315         git interpret-trailers --trailer "ack: Peff" \
316                 --trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
317                 complex_message >actual &&
318         test_cmp expected actual
319 '
320
321 test_expect_success 'using "where = start"' '
322         git config trailer.review.key "Reviewed-by" &&
323         git config trailer.review.where "start" &&
324         cat complex_message_body >expected &&
325         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
326                 Reviewed-by: Johannes
327                 Reviewed-by: Junio
328                 Fixes: Z
329                 Acked-by= Z
330                 Acked-by= Peff
331                 Reviewed-by: Z
332                 Signed-off-by: Z
333         EOF
334         git interpret-trailers --trailer "ack: Peff" \
335                 --trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
336                 complex_message >actual &&
337         test_cmp expected actual
338 '
339
340 test_expect_success 'using "where = before" for a token in the middle of the message' '
341         git config trailer.review.key "Reviewed-by:" &&
342         git config trailer.review.where "before" &&
343         cat complex_message_body >expected &&
344         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
345                 Bug #42
346                 Fixes: Z
347                 Acked-by= Z
348                 Acked-by= Peff
349                 Reviewed-by:Johan
350                 Reviewed-by:
351                 Signed-off-by: Z
352         EOF
353         git interpret-trailers --trailer "ack: Peff" --trailer "bug: 42" \
354                 --trailer "review: Johan" <complex_message >actual &&
355         test_cmp expected actual
356 '
357
358 test_expect_success 'using "where = before" and --trim-empty' '
359         cat complex_message_body >expected &&
360         cat >>expected <<-\EOF &&
361                 Bug #46
362                 Bug #42
363                 Acked-by= Peff
364                 Reviewed-by:Johan
365         EOF
366         git interpret-trailers --trim-empty --trailer "ack: Peff" \
367                 --trailer "bug: 42" --trailer "review: Johan" \
368                 --trailer "Bug: 46" <complex_message >actual &&
369         test_cmp expected actual
370 '
371
372 test_expect_success 'the default is "ifExists = addIfDifferentNeighbor"' '
373         cat complex_message_body >expected &&
374         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
375                 Bug #42
376                 Fixes: Z
377                 Acked-by= Z
378                 Acked-by= Peff
379                 Acked-by= Junio
380                 Acked-by= Peff
381                 Reviewed-by:
382                 Signed-off-by: Z
383         EOF
384         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
385                 --trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
386                 --trailer "ack: Peff" <complex_message >actual &&
387         test_cmp expected actual
388 '
389
390 test_expect_success 'default "ifExists" is now "addIfDifferent"' '
391         git config trailer.ifexists "addIfDifferent" &&
392         cat complex_message_body >expected &&
393         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
394                 Bug #42
395                 Fixes: Z
396                 Acked-by= Z
397                 Acked-by= Peff
398                 Acked-by= Junio
399                 Reviewed-by:
400                 Signed-off-by: Z
401         EOF
402         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
403                 --trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
404                 --trailer "ack: Peff" <complex_message >actual &&
405         test_cmp expected actual
406 '
407
408 test_expect_success 'using "ifExists = addIfDifferent" with "where = end"' '
409         git config trailer.ack.ifExists "addIfDifferent" &&
410         git config trailer.ack.where "end" &&
411         cat complex_message_body >expected &&
412         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
413                 Bug #42
414                 Fixes: Z
415                 Acked-by= Z
416                 Reviewed-by:
417                 Signed-off-by: Z
418                 Acked-by= Peff
419         EOF
420         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
421                 --trailer "bug: 42" --trailer "ack: Peff" \
422                 <complex_message >actual &&
423         test_cmp expected actual
424 '
425
426 test_expect_success 'using "ifExists = addIfDifferent" with "where = before"' '
427         git config trailer.ack.ifExists "addIfDifferent" &&
428         git config trailer.ack.where "before" &&
429         cat complex_message_body >expected &&
430         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
431                 Bug #42
432                 Fixes: Z
433                 Acked-by= Peff
434                 Acked-by= Z
435                 Reviewed-by:
436                 Signed-off-by: Z
437         EOF
438         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
439                 --trailer "bug: 42" --trailer "ack: Peff" \
440                 <complex_message >actual &&
441         test_cmp expected actual
442 '
443
444 test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = end"' '
445         git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
446         git config trailer.ack.where "end" &&
447         cat complex_message_body >expected &&
448         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
449                 Bug #42
450                 Fixes: Z
451                 Acked-by= Z
452                 Reviewed-by:
453                 Signed-off-by: Z
454                 Acked-by= Peff
455                 Acked-by= Junio
456                 Tested-by: Jakub
457                 Acked-by= Junio
458                 Acked-by= Peff
459         EOF
460         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
461                 --trailer "ack: Junio" --trailer "bug: 42" \
462                 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
463                 --trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
464         test_cmp expected actual
465 '
466
467 test_expect_success 'using "ifExists = addIfDifferentNeighbor"  with "where = after"' '
468         git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
469         git config trailer.ack.where "after" &&
470         cat complex_message_body >expected &&
471         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
472                 Bug #42
473                 Fixes: Z
474                 Acked-by= Z
475                 Acked-by= Peff
476                 Acked-by= Junio
477                 Acked-by= Peff
478                 Reviewed-by:
479                 Signed-off-by: Z
480                 Tested-by: Jakub
481         EOF
482         git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
483                 --trailer "ack: Junio" --trailer "bug: 42" \
484                 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
485                 --trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
486         test_cmp expected actual
487 '
488
489 test_expect_success 'using "ifExists = addIfDifferentNeighbor" and --trim-empty' '
490         git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
491         cat complex_message_body >expected &&
492         cat >>expected <<-\EOF &&
493                 Bug #42
494                 Acked-by= Peff
495                 Acked-by= Junio
496                 Acked-by= Peff
497         EOF
498         git interpret-trailers --trim-empty --trailer "ack: Peff" \
499                 --trailer "Acked-by= Peff" --trailer "review:" \
500                 --trailer "ack: Junio" --trailer "bug: 42" \
501                 --trailer "ack: Peff" <complex_message >actual &&
502         test_cmp expected actual
503 '
504
505 test_expect_success 'using "ifExists = add" with "where = end"' '
506         git config trailer.ack.ifExists "add" &&
507         git config trailer.ack.where "end" &&
508         cat complex_message_body >expected &&
509         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
510                 Bug #42
511                 Fixes: Z
512                 Acked-by= Z
513                 Reviewed-by:
514                 Signed-off-by: Z
515                 Acked-by= Peff
516                 Acked-by= Peff
517                 Tested-by: Jakub
518                 Acked-by= Junio
519                 Tested-by: Johannes
520                 Acked-by= Peff
521         EOF
522         git interpret-trailers --trailer "ack: Peff" \
523                 --trailer "Acked-by= Peff" --trailer "review:" \
524                 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
525                 --trailer "bug: 42" --trailer "Tested-by: Johannes" \
526                 --trailer "ack: Peff" <complex_message >actual &&
527         test_cmp expected actual
528 '
529
530 test_expect_success 'using "ifExists = add" with "where = after"' '
531         git config trailer.ack.ifExists "add" &&
532         git config trailer.ack.where "after" &&
533         cat complex_message_body >expected &&
534         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
535                 Bug #42
536                 Fixes: Z
537                 Acked-by= Z
538                 Acked-by= Peff
539                 Acked-by= Peff
540                 Acked-by= Junio
541                 Acked-by= Peff
542                 Reviewed-by:
543                 Signed-off-by: Z
544         EOF
545         git interpret-trailers --trailer "ack: Peff" \
546                 --trailer "Acked-by= Peff" --trailer "review:" \
547                 --trailer "ack: Junio" --trailer "bug: 42" \
548                 --trailer "ack: Peff" <complex_message >actual &&
549         test_cmp expected actual
550 '
551
552 test_expect_success 'using "ifExists = replace"' '
553         git config trailer.fix.key "Fixes: " &&
554         git config trailer.fix.ifExists "replace" &&
555         cat complex_message_body >expected &&
556         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
557                 Bug #42
558                 Acked-by= Z
559                 Acked-by= Junio
560                 Acked-by= Peff
561                 Reviewed-by:
562                 Signed-off-by: Z
563                 Fixes: 22
564         EOF
565         git interpret-trailers --trailer "review:" \
566                 --trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
567                 --trailer "bug: 42" --trailer "ack: Peff" \
568                 <complex_message >actual &&
569         test_cmp expected actual
570 '
571
572 test_expect_success 'using "ifExists = replace" with "where = after"' '
573         git config trailer.fix.where "after" &&
574         cat complex_message_body >expected &&
575         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
576                 Bug #42
577                 Fixes: 22
578                 Acked-by= Z
579                 Acked-by= Junio
580                 Acked-by= Peff
581                 Reviewed-by:
582                 Signed-off-by: Z
583         EOF
584         git interpret-trailers --trailer "review:" \
585                 --trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
586                 --trailer "bug: 42" --trailer "ack: Peff" \
587                 <complex_message >actual &&
588         test_cmp expected actual
589 '
590
591 test_expect_success 'using "ifExists = doNothing"' '
592         git config trailer.fix.ifExists "doNothing" &&
593         cat complex_message_body >expected &&
594         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
595                 Bug #42
596                 Fixes: Z
597                 Acked-by= Z
598                 Acked-by= Junio
599                 Acked-by= Peff
600                 Reviewed-by:
601                 Signed-off-by: Z
602         EOF
603         git interpret-trailers --trailer "review:" --trailer "fix=53" \
604                 --trailer "ack: Junio" --trailer "fix=22" \
605                 --trailer "bug: 42" --trailer "ack: Peff" \
606                 <complex_message >actual &&
607         test_cmp expected actual
608 '
609
610 test_expect_success 'the default is "ifMissing = add"' '
611         git config trailer.cc.key "Cc: " &&
612         git config trailer.cc.where "before" &&
613         cat complex_message_body >expected &&
614         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
615                 Bug #42
616                 Cc: Linus
617                 Fixes: Z
618                 Acked-by= Z
619                 Acked-by= Junio
620                 Acked-by= Peff
621                 Reviewed-by:
622                 Signed-off-by: Z
623         EOF
624         git interpret-trailers --trailer "review:" --trailer "fix=53" \
625                 --trailer "cc=Linus" --trailer "ack: Junio" \
626                 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
627                 <complex_message >actual &&
628         test_cmp expected actual
629 '
630
631 test_expect_success 'when default "ifMissing" is "doNothing"' '
632         git config trailer.ifmissing "doNothing" &&
633         cat complex_message_body >expected &&
634         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
635                 Fixes: Z
636                 Acked-by= Z
637                 Acked-by= Junio
638                 Acked-by= Peff
639                 Reviewed-by:
640                 Signed-off-by: Z
641         EOF
642         git interpret-trailers --trailer "review:" --trailer "fix=53" \
643                 --trailer "cc=Linus" --trailer "ack: Junio" \
644                 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
645                 <complex_message >actual &&
646         test_cmp expected actual &&
647         git config trailer.ifmissing "add"
648 '
649
650 test_expect_success 'using "ifMissing = add" with "where = end"' '
651         git config trailer.cc.key "Cc: " &&
652         git config trailer.cc.where "end" &&
653         git config trailer.cc.ifMissing "add" &&
654         cat complex_message_body >expected &&
655         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
656                 Bug #42
657                 Fixes: Z
658                 Acked-by= Z
659                 Acked-by= Junio
660                 Acked-by= Peff
661                 Reviewed-by:
662                 Signed-off-by: Z
663                 Cc: Linus
664         EOF
665         git interpret-trailers --trailer "review:" --trailer "fix=53" \
666                 --trailer "ack: Junio" --trailer "fix=22" \
667                 --trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
668                 <complex_message >actual &&
669         test_cmp expected actual
670 '
671
672 test_expect_success 'using "ifMissing = add" with "where = before"' '
673         git config trailer.cc.key "Cc: " &&
674         git config trailer.cc.where "before" &&
675         git config trailer.cc.ifMissing "add" &&
676         cat complex_message_body >expected &&
677         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
678                 Cc: Linus
679                 Bug #42
680                 Fixes: Z
681                 Acked-by= Z
682                 Acked-by= Junio
683                 Acked-by= Peff
684                 Reviewed-by:
685                 Signed-off-by: Z
686         EOF
687         git interpret-trailers --trailer "review:" --trailer "fix=53" \
688                 --trailer "ack: Junio" --trailer "fix=22" \
689                 --trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
690                 <complex_message >actual &&
691         test_cmp expected actual
692 '
693
694 test_expect_success 'using "ifMissing = doNothing"' '
695         git config trailer.cc.ifMissing "doNothing" &&
696         cat complex_message_body >expected &&
697         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
698                 Bug #42
699                 Fixes: Z
700                 Acked-by= Z
701                 Acked-by= Junio
702                 Acked-by= Peff
703                 Reviewed-by:
704                 Signed-off-by: Z
705         EOF
706         git interpret-trailers --trailer "review:" --trailer "fix=53" \
707                 --trailer "cc=Linus" --trailer "ack: Junio" \
708                 --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
709                 <complex_message >actual &&
710         test_cmp expected actual
711 '
712
713 test_expect_success 'default "where" is now "after"' '
714         git config trailer.where "after" &&
715         git config --unset trailer.ack.where &&
716         cat complex_message_body >expected &&
717         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
718                 Bug #42
719                 Fixes: Z
720                 Acked-by= Z
721                 Acked-by= Peff
722                 Acked-by= Peff
723                 Acked-by= Junio
724                 Acked-by= Peff
725                 Reviewed-by:
726                 Signed-off-by: Z
727                 Tested-by: Jakub
728                 Tested-by: Johannes
729         EOF
730         git interpret-trailers --trailer "ack: Peff" \
731                 --trailer "Acked-by= Peff" --trailer "review:" \
732                 --trailer "Tested-by: Jakub" --trailer "ack: Junio" \
733                 --trailer "bug: 42" --trailer "Tested-by: Johannes" \
734                 --trailer "ack: Peff" <complex_message >actual &&
735         test_cmp expected actual
736 '
737
738 test_expect_success 'with simple command' '
739         git config trailer.sign.key "Signed-off-by: " &&
740         git config trailer.sign.where "after" &&
741         git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
742         git config trailer.sign.command "echo \"A U Thor <author@example.com>\"" &&
743         cat complex_message_body >expected &&
744         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
745                 Fixes: Z
746                 Acked-by= Z
747                 Reviewed-by:
748                 Signed-off-by: Z
749                 Signed-off-by: A U Thor <author@example.com>
750         EOF
751         git interpret-trailers --trailer "review:" --trailer "fix=22" \
752                 <complex_message >actual &&
753         test_cmp expected actual
754 '
755
756 test_expect_success 'with command using commiter information' '
757         git config trailer.sign.ifExists "addIfDifferent" &&
758         git config trailer.sign.command "echo \"\$GIT_COMMITTER_NAME <\$GIT_COMMITTER_EMAIL>\"" &&
759         cat complex_message_body >expected &&
760         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
761                 Fixes: Z
762                 Acked-by= Z
763                 Reviewed-by:
764                 Signed-off-by: Z
765                 Signed-off-by: C O Mitter <committer@example.com>
766         EOF
767         git interpret-trailers --trailer "review:" --trailer "fix=22" \
768                 <complex_message >actual &&
769         test_cmp expected actual
770 '
771
772 test_expect_success 'with command using author information' '
773         git config trailer.sign.key "Signed-off-by: " &&
774         git config trailer.sign.where "after" &&
775         git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
776         git config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" &&
777         cat complex_message_body >expected &&
778         sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
779                 Fixes: Z
780                 Acked-by= Z
781                 Reviewed-by:
782                 Signed-off-by: Z
783                 Signed-off-by: A U Thor <author@example.com>
784         EOF
785         git interpret-trailers --trailer "review:" --trailer "fix=22" \
786                 <complex_message >actual &&
787         test_cmp expected actual
788 '
789
790 test_expect_success 'setup a commit' '
791         echo "Content of the first commit." > a.txt &&
792         git add a.txt &&
793         git commit -m "Add file a.txt"
794 '
795
796 test_expect_success 'with command using $ARG' '
797         git config trailer.fix.ifExists "replace" &&
798         git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" &&
799         FIXED=$(git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14 HEAD) &&
800         cat complex_message_body >expected &&
801         sed -e "s/ Z\$/ /" >>expected <<-EOF &&
802                 Fixes: $FIXED
803                 Acked-by= Z
804                 Reviewed-by:
805                 Signed-off-by: Z
806                 Signed-off-by: A U Thor <author@example.com>
807         EOF
808         git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
809                 <complex_message >actual &&
810         test_cmp expected actual
811 '
812
813 test_expect_success 'with failing command using $ARG' '
814         git config trailer.fix.ifExists "replace" &&
815         git config trailer.fix.command "false \$ARG" &&
816         cat complex_message_body >expected &&
817         sed -e "s/ Z\$/ /" >>expected <<-EOF &&
818                 Fixes: Z
819                 Acked-by= Z
820                 Reviewed-by:
821                 Signed-off-by: Z
822                 Signed-off-by: A U Thor <author@example.com>
823         EOF
824         git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
825                 <complex_message >actual &&
826         test_cmp expected actual
827 '
828
829 test_expect_success 'with empty tokens' '
830         git config --unset trailer.fix.command &&
831         cat >expected <<-EOF &&
832
833                 Signed-off-by: A U Thor <author@example.com>
834         EOF
835         git interpret-trailers --trailer ":" --trailer ":test" >actual <<-EOF &&
836         EOF
837         test_cmp expected actual
838 '
839
840 test_expect_success 'with command but no key' '
841         git config --unset trailer.sign.key &&
842         cat >expected <<-EOF &&
843
844                 sign: A U Thor <author@example.com>
845         EOF
846         git interpret-trailers >actual <<-EOF &&
847         EOF
848         test_cmp expected actual
849 '
850
851 test_expect_success 'with no command and no key' '
852         git config --unset trailer.review.key &&
853         cat >expected <<-EOF &&
854
855                 review: Junio
856                 sign: A U Thor <author@example.com>
857         EOF
858         git interpret-trailers --trailer "review:Junio" >actual <<-EOF &&
859         EOF
860         test_cmp expected actual
861 '
862
863 test_done