Merge branch 'jk/ref-filter-segfault-fix'
[git] / t / t7004-tag.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Carlos Rica
4 #
5
6 test_description='git tag
7
8 Tests for operations with tags.'
9
10 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
11 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
12
13 . ./test-lib.sh
14 . "$TEST_DIRECTORY"/lib-gpg.sh
15 . "$TEST_DIRECTORY"/lib-terminal.sh
16
17 # creating and listing lightweight tags:
18
19 tag_exists () {
20         git show-ref --quiet --verify refs/tags/"$1"
21 }
22
23 test_expect_success 'setup' '
24         test_oid_cache <<-EOM
25         othersigheader sha1:gpgsig-sha256
26         othersigheader sha256:gpgsig
27         EOM
28 '
29
30 test_expect_success 'listing all tags in an empty tree should succeed' '
31         git tag -l &&
32         git tag
33 '
34
35 test_expect_success 'listing all tags in an empty tree should output nothing' '
36         test $(git tag -l | wc -l) -eq 0 &&
37         test $(git tag | wc -l) -eq 0
38 '
39
40 test_expect_success 'sort tags, ignore case' '
41         (
42                 git init sort &&
43                 cd sort &&
44                 test_commit initial &&
45                 git tag tag-one &&
46                 git tag TAG-two &&
47                 git tag -l >actual &&
48                 cat >expected <<-\EOF &&
49                 TAG-two
50                 initial
51                 tag-one
52                 EOF
53                 test_cmp expected actual &&
54                 git tag -l -i >actual &&
55                 cat >expected <<-\EOF &&
56                 initial
57                 tag-one
58                 TAG-two
59                 EOF
60                 test_cmp expected actual
61         )
62 '
63
64 test_expect_success 'looking for a tag in an empty tree should fail' \
65         '! (tag_exists mytag)'
66
67 test_expect_success 'creating a tag in an empty tree should fail' '
68         test_must_fail git tag mynotag &&
69         ! tag_exists mynotag
70 '
71
72 test_expect_success 'creating a tag for HEAD in an empty tree should fail' '
73         test_must_fail git tag mytaghead HEAD &&
74         ! tag_exists mytaghead
75 '
76
77 test_expect_success 'creating a tag for an unknown revision should fail' '
78         test_must_fail git tag mytagnorev aaaaaaaaaaa &&
79         ! tag_exists mytagnorev
80 '
81
82 # commit used in the tests, test_tick is also called here to freeze the date:
83 test_expect_success 'creating a tag using default HEAD should succeed' '
84         test_config core.logAllRefUpdates true &&
85         test_tick &&
86         echo foo >foo &&
87         git add foo &&
88         git commit -m Foo &&
89         git tag mytag &&
90         test_must_fail git reflog exists refs/tags/mytag
91 '
92
93 test_expect_success 'creating a tag with --create-reflog should create reflog' '
94         git log -1 \
95                 --format="format:tag: tagging %h (%s, %cd)%n" \
96                 --date=format:%Y-%m-%d >expected &&
97         test_when_finished "git tag -d tag_with_reflog" &&
98         git tag --create-reflog tag_with_reflog &&
99         git reflog exists refs/tags/tag_with_reflog &&
100         sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
101         test_cmp expected actual
102 '
103
104 test_expect_success 'annotated tag with --create-reflog has correct message' '
105         git log -1 \
106                 --format="format:tag: tagging %h (%s, %cd)%n" \
107                 --date=format:%Y-%m-%d >expected &&
108         test_when_finished "git tag -d tag_with_reflog" &&
109         git tag -m "annotated tag" --create-reflog tag_with_reflog &&
110         git reflog exists refs/tags/tag_with_reflog &&
111         sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
112         test_cmp expected actual
113 '
114
115 test_expect_success '--create-reflog does not create reflog on failure' '
116         test_must_fail git tag --create-reflog mytag &&
117         test_must_fail git reflog exists refs/tags/mytag
118 '
119
120 test_expect_success 'option core.logAllRefUpdates=always creates reflog' '
121         test_when_finished "git tag -d tag_with_reflog" &&
122         test_config core.logAllRefUpdates always &&
123         git tag tag_with_reflog &&
124         git reflog exists refs/tags/tag_with_reflog
125 '
126
127 test_expect_success 'listing all tags if one exists should succeed' '
128         git tag -l &&
129         git tag
130 '
131
132 cat >expect <<EOF
133 mytag
134 EOF
135 test_expect_success 'Multiple -l or --list options are equivalent to one -l option' '
136         git tag -l -l >actual &&
137         test_cmp expect actual &&
138         git tag --list --list >actual &&
139         test_cmp expect actual &&
140         git tag --list -l --list >actual &&
141         test_cmp expect actual
142 '
143
144 test_expect_success 'listing all tags if one exists should output that tag' '
145         test $(git tag -l) = mytag &&
146         test $(git tag) = mytag
147 '
148
149 # pattern matching:
150
151 test_expect_success 'listing a tag using a matching pattern should succeed' \
152         'git tag -l mytag'
153
154 test_expect_success 'listing a tag with --ignore-case' \
155         'test $(git tag -l --ignore-case MYTAG) = mytag'
156
157 test_expect_success \
158         'listing a tag using a matching pattern should output that tag' \
159         'test $(git tag -l mytag) = mytag'
160
161 test_expect_success \
162         'listing tags using a non-matching pattern should succeed' \
163         'git tag -l xxx'
164
165 test_expect_success \
166         'listing tags using a non-matching pattern should output nothing' \
167         'test $(git tag -l xxx | wc -l) -eq 0'
168
169 # special cases for creating tags:
170
171 test_expect_success \
172         'trying to create a tag with the name of one existing should fail' \
173         'test_must_fail git tag mytag'
174
175 test_expect_success \
176         'trying to create a tag with a non-valid name should fail' '
177         test $(git tag -l | wc -l) -eq 1 &&
178         test_must_fail git tag "" &&
179         test_must_fail git tag .othertag &&
180         test_must_fail git tag "other tag" &&
181         test_must_fail git tag "othertag^" &&
182         test_must_fail git tag "other~tag" &&
183         test $(git tag -l | wc -l) -eq 1
184 '
185
186 test_expect_success 'creating a tag using HEAD directly should succeed' '
187         git tag myhead HEAD &&
188         tag_exists myhead
189 '
190
191 test_expect_success '--force can create a tag with the name of one existing' '
192         tag_exists mytag &&
193         git tag --force mytag &&
194         tag_exists mytag'
195
196 test_expect_success '--force is moot with a non-existing tag name' '
197         test_when_finished git tag -d newtag forcetag &&
198         git tag newtag >expect &&
199         git tag --force forcetag >actual &&
200         test_cmp expect actual
201 '
202
203 # deleting tags:
204
205 test_expect_success 'trying to delete an unknown tag should fail' '
206         ! tag_exists unknown-tag &&
207         test_must_fail git tag -d unknown-tag
208 '
209
210 cat >expect <<EOF
211 myhead
212 mytag
213 EOF
214 test_expect_success \
215         'trying to delete tags without params should succeed and do nothing' '
216         git tag -l > actual && test_cmp expect actual &&
217         git tag -d &&
218         git tag -l > actual && test_cmp expect actual
219 '
220
221 test_expect_success \
222         'deleting two existing tags in one command should succeed' '
223         tag_exists mytag &&
224         tag_exists myhead &&
225         git tag -d mytag myhead &&
226         ! tag_exists mytag &&
227         ! tag_exists myhead
228 '
229
230 test_expect_success \
231         'creating a tag with the name of another deleted one should succeed' '
232         ! tag_exists mytag &&
233         git tag mytag &&
234         tag_exists mytag
235 '
236
237 test_expect_success \
238         'trying to delete two tags, existing and not, should fail in the 2nd' '
239         tag_exists mytag &&
240         ! tag_exists nonexistingtag &&
241         test_must_fail git tag -d mytag nonexistingtag &&
242         ! tag_exists mytag &&
243         ! tag_exists nonexistingtag
244 '
245
246 test_expect_success 'trying to delete an already deleted tag should fail' \
247         'test_must_fail git tag -d mytag'
248
249 # listing various tags with pattern matching:
250
251 cat >expect <<EOF
252 a1
253 aa1
254 cba
255 t210
256 t211
257 v0.2.1
258 v1.0
259 v1.0.1
260 v1.1.3
261 EOF
262 test_expect_success 'listing all tags should print them ordered' '
263         git tag v1.0.1 &&
264         git tag t211 &&
265         git tag aa1 &&
266         git tag v0.2.1 &&
267         git tag v1.1.3 &&
268         git tag cba &&
269         git tag a1 &&
270         git tag v1.0 &&
271         git tag t210 &&
272         git tag -l > actual &&
273         test_cmp expect actual &&
274         git tag > actual &&
275         test_cmp expect actual
276 '
277
278 cat >expect <<EOF
279 a1
280 aa1
281 cba
282 EOF
283 test_expect_success \
284         'listing tags with substring as pattern must print those matching' '
285         rm *a* &&
286         git tag -l "*a*" > current &&
287         test_cmp expect current
288 '
289
290 cat >expect <<EOF
291 v0.2.1
292 v1.0.1
293 EOF
294 test_expect_success \
295         'listing tags with a suffix as pattern must print those matching' '
296         git tag -l "*.1" > actual &&
297         test_cmp expect actual
298 '
299
300 cat >expect <<EOF
301 t210
302 t211
303 EOF
304 test_expect_success \
305         'listing tags with a prefix as pattern must print those matching' '
306         git tag -l "t21*" > actual &&
307         test_cmp expect actual
308 '
309
310 cat >expect <<EOF
311 a1
312 EOF
313 test_expect_success \
314         'listing tags using a name as pattern must print that one matching' '
315         git tag -l a1 > actual &&
316         test_cmp expect actual
317 '
318
319 cat >expect <<EOF
320 v1.0
321 EOF
322 test_expect_success \
323         'listing tags using a name as pattern must print that one matching' '
324         git tag -l v1.0 > actual &&
325         test_cmp expect actual
326 '
327
328 cat >expect <<EOF
329 v1.0.1
330 v1.1.3
331 EOF
332 test_expect_success \
333         'listing tags with ? in the pattern should print those matching' '
334         git tag -l "v1.?.?" > actual &&
335         test_cmp expect actual
336 '
337
338 test_expect_success \
339         'listing tags using v.* should print nothing because none have v.' '
340         git tag -l "v.*" > actual &&
341         test_must_be_empty actual
342 '
343
344 cat >expect <<EOF
345 v0.2.1
346 v1.0
347 v1.0.1
348 v1.1.3
349 EOF
350 test_expect_success \
351         'listing tags using v* should print only those having v' '
352         git tag -l "v*" > actual &&
353         test_cmp expect actual
354 '
355
356 test_expect_success 'tag -l can accept multiple patterns' '
357         git tag -l "v1*" "v0*" >actual &&
358         test_cmp expect actual
359 '
360
361 # Between v1.7.7 & v2.13.0 a fair reading of the git-tag documentation
362 # could leave you with the impression that "-l <pattern> -l <pattern>"
363 # was how we wanted to accept multiple patterns.
364 #
365 # This test should not imply that this is a sane thing to support. but
366 # since the documentation was worded like it was let's at least find
367 # out if we're going to break this long-documented form of taking
368 # multiple patterns.
369 test_expect_success 'tag -l <pattern> -l <pattern> works, as our buggy documentation previously suggested' '
370         git tag -l "v1*" -l "v0*" >actual &&
371         test_cmp expect actual
372 '
373
374 test_expect_success 'listing tags in column' '
375         COLUMNS=41 git tag -l --column=row >actual &&
376         cat >expected <<\EOF &&
377 a1      aa1     cba     t210    t211
378 v0.2.1  v1.0    v1.0.1  v1.1.3
379 EOF
380         test_cmp expected actual
381 '
382
383 test_expect_success 'listing tags in column with column.*' '
384         test_config column.tag row &&
385         test_config column.ui dense &&
386         COLUMNS=40 git tag -l >actual &&
387         cat >expected <<\EOF &&
388 a1      aa1   cba     t210    t211
389 v0.2.1  v1.0  v1.0.1  v1.1.3
390 EOF
391         test_cmp expected actual
392 '
393
394 test_expect_success 'listing tag with -n --column should fail' '
395         test_must_fail git tag --column -n
396 '
397
398 test_expect_success 'listing tags -n in column with column.ui ignored' '
399         test_config column.ui "row dense" &&
400         COLUMNS=40 git tag -l -n >actual &&
401         cat >expected <<\EOF &&
402 a1              Foo
403 aa1             Foo
404 cba             Foo
405 t210            Foo
406 t211            Foo
407 v0.2.1          Foo
408 v1.0            Foo
409 v1.0.1          Foo
410 v1.1.3          Foo
411 EOF
412         test_cmp expected actual
413 '
414
415 # creating and verifying lightweight tags:
416
417 test_expect_success \
418         'a non-annotated tag created without parameters should point to HEAD' '
419         git tag non-annotated-tag &&
420         test $(git cat-file -t non-annotated-tag) = commit &&
421         test $(git rev-parse non-annotated-tag) = $(git rev-parse HEAD)
422 '
423
424 test_expect_success 'trying to verify an unknown tag should fail' \
425         'test_must_fail git tag -v unknown-tag'
426
427 test_expect_success \
428         'trying to verify a non-annotated and non-signed tag should fail' \
429         'test_must_fail git tag -v non-annotated-tag'
430
431 test_expect_success \
432         'trying to verify many non-annotated or unknown tags, should fail' \
433         'test_must_fail git tag -v unknown-tag1 non-annotated-tag unknown-tag2'
434
435 # creating annotated tags:
436
437 get_tag_msg () {
438         git cat-file tag "$1" | sed -e "/BEGIN PGP/q"
439 }
440
441 # run test_tick before committing always gives the time in that timezone
442 get_tag_header () {
443 cat <<EOF
444 object $2
445 type $3
446 tag $1
447 tagger C O Mitter <committer@example.com> $4 -0700
448
449 EOF
450 }
451
452 commit=$(git rev-parse HEAD)
453 time=$test_tick
454
455 get_tag_header annotated-tag $commit commit $time >expect
456 echo "A message" >>expect
457 test_expect_success \
458         'creating an annotated tag with -m message should succeed' '
459         git tag -m "A message" annotated-tag &&
460         get_tag_msg annotated-tag >actual &&
461         test_cmp expect actual
462 '
463
464 get_tag_header annotated-tag-edit $commit commit $time >expect
465 echo "An edited message" >>expect
466 test_expect_success 'set up editor' '
467         write_script fakeeditor <<-\EOF
468         sed -e "s/A message/An edited message/g" <"$1" >"$1-"
469         mv "$1-" "$1"
470         EOF
471 '
472 test_expect_success \
473         'creating an annotated tag with -m message --edit should succeed' '
474         GIT_EDITOR=./fakeeditor git tag -m "A message" --edit annotated-tag-edit &&
475         get_tag_msg annotated-tag-edit >actual &&
476         test_cmp expect actual
477 '
478
479 cat >msgfile <<EOF
480 Another message
481 in a file.
482 EOF
483 get_tag_header file-annotated-tag $commit commit $time >expect
484 cat msgfile >>expect
485 test_expect_success \
486         'creating an annotated tag with -F messagefile should succeed' '
487         git tag -F msgfile file-annotated-tag &&
488         get_tag_msg file-annotated-tag >actual &&
489         test_cmp expect actual
490 '
491
492 get_tag_header file-annotated-tag-edit $commit commit $time >expect
493 sed -e "s/Another message/Another edited message/g" msgfile >>expect
494 test_expect_success 'set up editor' '
495         write_script fakeeditor <<-\EOF
496         sed -e "s/Another message/Another edited message/g" <"$1" >"$1-"
497         mv "$1-" "$1"
498         EOF
499 '
500 test_expect_success \
501         'creating an annotated tag with -F messagefile --edit should succeed' '
502         GIT_EDITOR=./fakeeditor git tag -F msgfile --edit file-annotated-tag-edit &&
503         get_tag_msg file-annotated-tag-edit >actual &&
504         test_cmp expect actual
505 '
506
507 cat >inputmsg <<EOF
508 A message from the
509 standard input
510 EOF
511 get_tag_header stdin-annotated-tag $commit commit $time >expect
512 cat inputmsg >>expect
513 test_expect_success 'creating an annotated tag with -F - should succeed' '
514         git tag -F - stdin-annotated-tag <inputmsg &&
515         get_tag_msg stdin-annotated-tag >actual &&
516         test_cmp expect actual
517 '
518
519 test_expect_success \
520         'trying to create a tag with a non-existing -F file should fail' '
521         ! test -f nonexistingfile &&
522         ! tag_exists notag &&
523         test_must_fail git tag -F nonexistingfile notag &&
524         ! tag_exists notag
525 '
526
527 test_expect_success \
528         'trying to create tags giving both -m or -F options should fail' '
529         echo "message file 1" >msgfile1 &&
530         ! tag_exists msgtag &&
531         test_must_fail git tag -m "message 1" -F msgfile1 msgtag &&
532         ! tag_exists msgtag &&
533         test_must_fail git tag -F msgfile1 -m "message 1" msgtag &&
534         ! tag_exists msgtag &&
535         test_must_fail git tag -m "message 1" -F msgfile1 \
536                 -m "message 2" msgtag &&
537         ! tag_exists msgtag
538 '
539
540 # blank and empty messages:
541
542 get_tag_header empty-annotated-tag $commit commit $time >expect
543 test_expect_success \
544         'creating a tag with an empty -m message should succeed' '
545         git tag -m "" empty-annotated-tag &&
546         get_tag_msg empty-annotated-tag >actual &&
547         test_cmp expect actual
548 '
549
550 >emptyfile
551 get_tag_header emptyfile-annotated-tag $commit commit $time >expect
552 test_expect_success \
553         'creating a tag with an empty -F messagefile should succeed' '
554         git tag -F emptyfile emptyfile-annotated-tag &&
555         get_tag_msg emptyfile-annotated-tag >actual &&
556         test_cmp expect actual
557 '
558
559 printf '\n\n  \n\t\nLeading blank lines\n' >blanksfile
560 printf '\n\t \t  \nRepeated blank lines\n' >>blanksfile
561 printf '\n\n\nTrailing spaces      \t  \n' >>blanksfile
562 printf '\nTrailing blank lines\n\n\t \n\n' >>blanksfile
563 get_tag_header blanks-annotated-tag $commit commit $time >expect
564 cat >>expect <<EOF
565 Leading blank lines
566
567 Repeated blank lines
568
569 Trailing spaces
570
571 Trailing blank lines
572 EOF
573 test_expect_success \
574         'extra blanks in the message for an annotated tag should be removed' '
575         git tag -F blanksfile blanks-annotated-tag &&
576         get_tag_msg blanks-annotated-tag >actual &&
577         test_cmp expect actual
578 '
579
580 get_tag_header blank-annotated-tag $commit commit $time >expect
581 test_expect_success \
582         'creating a tag with blank -m message with spaces should succeed' '
583         git tag -m "     " blank-annotated-tag &&
584         get_tag_msg blank-annotated-tag >actual &&
585         test_cmp expect actual
586 '
587
588 echo '     ' >blankfile
589 echo ''      >>blankfile
590 echo '  '    >>blankfile
591 get_tag_header blankfile-annotated-tag $commit commit $time >expect
592 test_expect_success \
593         'creating a tag with blank -F messagefile with spaces should succeed' '
594         git tag -F blankfile blankfile-annotated-tag &&
595         get_tag_msg blankfile-annotated-tag >actual &&
596         test_cmp expect actual
597 '
598
599 printf '      ' >blanknonlfile
600 get_tag_header blanknonlfile-annotated-tag $commit commit $time >expect
601 test_expect_success \
602         'creating a tag with -F file of spaces and no newline should succeed' '
603         git tag -F blanknonlfile blanknonlfile-annotated-tag &&
604         get_tag_msg blanknonlfile-annotated-tag >actual &&
605         test_cmp expect actual
606 '
607
608 # messages with commented lines:
609
610 cat >commentsfile <<EOF
611 # A comment
612
613 ############
614 The message.
615 ############
616 One line.
617
618
619 # commented lines
620 # commented lines
621
622 Another line.
623 # comments
624
625 Last line.
626 EOF
627 get_tag_header comments-annotated-tag $commit commit $time >expect
628 cat >>expect <<EOF
629 The message.
630 One line.
631
632 Another line.
633
634 Last line.
635 EOF
636 test_expect_success \
637         'creating a tag using a -F messagefile with #comments should succeed' '
638         git tag -F commentsfile comments-annotated-tag &&
639         get_tag_msg comments-annotated-tag >actual &&
640         test_cmp expect actual
641 '
642
643 get_tag_header comment-annotated-tag $commit commit $time >expect
644 test_expect_success \
645         'creating a tag with a #comment in the -m message should succeed' '
646         git tag -m "#comment" comment-annotated-tag &&
647         get_tag_msg comment-annotated-tag >actual &&
648         test_cmp expect actual
649 '
650
651 echo '#comment' >commentfile
652 echo ''         >>commentfile
653 echo '####'     >>commentfile
654 get_tag_header commentfile-annotated-tag $commit commit $time >expect
655 test_expect_success \
656         'creating a tag with #comments in the -F messagefile should succeed' '
657         git tag -F commentfile commentfile-annotated-tag &&
658         get_tag_msg commentfile-annotated-tag >actual &&
659         test_cmp expect actual
660 '
661
662 printf '#comment' >commentnonlfile
663 get_tag_header commentnonlfile-annotated-tag $commit commit $time >expect
664 test_expect_success \
665         'creating a tag with a file of #comment and no newline should succeed' '
666         git tag -F commentnonlfile commentnonlfile-annotated-tag &&
667         get_tag_msg commentnonlfile-annotated-tag >actual &&
668         test_cmp expect actual
669 '
670
671 # listing messages for annotated non-signed tags:
672
673 test_expect_success \
674         'listing the one-line message of a non-signed tag should succeed' '
675         git tag -m "A msg" tag-one-line &&
676
677         echo "tag-one-line" >expect &&
678         git tag -l | grep "^tag-one-line" >actual &&
679         test_cmp expect actual &&
680         git tag -n0 -l | grep "^tag-one-line" >actual &&
681         test_cmp expect actual &&
682         git tag -n0 -l tag-one-line >actual &&
683         test_cmp expect actual &&
684
685         git tag -n0 | grep "^tag-one-line" >actual &&
686         test_cmp expect actual &&
687         git tag -n0 tag-one-line >actual &&
688         test_cmp expect actual &&
689
690         echo "tag-one-line    A msg" >expect &&
691         git tag -n1 -l | grep "^tag-one-line" >actual &&
692         test_cmp expect actual &&
693         git tag -n -l | grep "^tag-one-line" >actual &&
694         test_cmp expect actual &&
695         git tag -n1 -l tag-one-line >actual &&
696         test_cmp expect actual &&
697         git tag -n2 -l tag-one-line >actual &&
698         test_cmp expect actual &&
699         git tag -n999 -l tag-one-line >actual &&
700         test_cmp expect actual
701 '
702
703 test_expect_success 'The -n 100 invocation means -n --list 100, not -n100' '
704         git tag -n 100 >actual &&
705         test_must_be_empty actual &&
706
707         git tag -m "A msg" 100 &&
708         echo "100             A msg" >expect &&
709         git tag -n 100 >actual &&
710         test_cmp expect actual
711 '
712
713 test_expect_success \
714         'listing the zero-lines message of a non-signed tag should succeed' '
715         git tag -m "" tag-zero-lines &&
716
717         echo "tag-zero-lines" >expect &&
718         git tag -l | grep "^tag-zero-lines" >actual &&
719         test_cmp expect actual &&
720         git tag -n0 -l | grep "^tag-zero-lines" >actual &&
721         test_cmp expect actual &&
722         git tag -n0 -l tag-zero-lines >actual &&
723         test_cmp expect actual &&
724
725         echo "tag-zero-lines  " >expect &&
726         git tag -n1 -l | grep "^tag-zero-lines" >actual &&
727         test_cmp expect actual &&
728         git tag -n -l | grep "^tag-zero-lines" >actual &&
729         test_cmp expect actual &&
730         git tag -n1 -l tag-zero-lines >actual &&
731         test_cmp expect actual &&
732         git tag -n2 -l tag-zero-lines >actual &&
733         test_cmp expect actual &&
734         git tag -n999 -l tag-zero-lines >actual &&
735         test_cmp expect actual
736 '
737
738 echo 'tag line one' >annotagmsg
739 echo 'tag line two' >>annotagmsg
740 echo 'tag line three' >>annotagmsg
741 test_expect_success \
742         'listing many message lines of a non-signed tag should succeed' '
743         git tag -F annotagmsg tag-lines &&
744
745         echo "tag-lines" >expect &&
746         git tag -l | grep "^tag-lines" >actual &&
747         test_cmp expect actual &&
748         git tag -n0 -l | grep "^tag-lines" >actual &&
749         test_cmp expect actual &&
750         git tag -n0 -l tag-lines >actual &&
751         test_cmp expect actual &&
752
753         echo "tag-lines       tag line one" >expect &&
754         git tag -n1 -l | grep "^tag-lines" >actual &&
755         test_cmp expect actual &&
756         git tag -n -l | grep "^tag-lines" >actual &&
757         test_cmp expect actual &&
758         git tag -n1 -l tag-lines >actual &&
759         test_cmp expect actual &&
760
761         echo "    tag line two" >>expect &&
762         git tag -n2 -l | grep "^ *tag.line" >actual &&
763         test_cmp expect actual &&
764         git tag -n2 -l tag-lines >actual &&
765         test_cmp expect actual &&
766
767         echo "    tag line three" >>expect &&
768         git tag -n3 -l | grep "^ *tag.line" >actual &&
769         test_cmp expect actual &&
770         git tag -n3 -l tag-lines >actual &&
771         test_cmp expect actual &&
772         git tag -n4 -l | grep "^ *tag.line" >actual &&
773         test_cmp expect actual &&
774         git tag -n4 -l tag-lines >actual &&
775         test_cmp expect actual &&
776         git tag -n99 -l | grep "^ *tag.line" >actual &&
777         test_cmp expect actual &&
778         git tag -n99 -l tag-lines >actual &&
779         test_cmp expect actual
780 '
781
782 test_expect_success 'annotations for blobs are empty' '
783         blob=$(git hash-object -w --stdin <<-\EOF
784         Blob paragraph 1.
785
786         Blob paragraph 2.
787         EOF
788         ) &&
789         git tag tag-blob $blob &&
790         echo "tag-blob        " >expect &&
791         git tag -n1 -l tag-blob >actual &&
792         test_cmp expect actual
793 '
794
795 # trying to verify annotated non-signed tags:
796
797 test_expect_success GPG \
798         'trying to verify an annotated non-signed tag should fail' '
799         tag_exists annotated-tag &&
800         test_must_fail git tag -v annotated-tag
801 '
802
803 test_expect_success GPG \
804         'trying to verify a file-annotated non-signed tag should fail' '
805         tag_exists file-annotated-tag &&
806         test_must_fail git tag -v file-annotated-tag
807 '
808
809 test_expect_success GPG \
810         'trying to verify two annotated non-signed tags should fail' '
811         tag_exists annotated-tag file-annotated-tag &&
812         test_must_fail git tag -v annotated-tag file-annotated-tag
813 '
814
815 # creating and verifying signed tags:
816
817 get_tag_header signed-tag $commit commit $time >expect
818 echo 'A signed tag message' >>expect
819 echo '-----BEGIN PGP SIGNATURE-----' >>expect
820 test_expect_success GPG 'creating a signed tag with -m message should succeed' '
821         git tag -s -m "A signed tag message" signed-tag &&
822         get_tag_msg signed-tag >actual &&
823         test_cmp expect actual
824 '
825
826 get_tag_header u-signed-tag $commit commit $time >expect
827 echo 'Another message' >>expect
828 echo '-----BEGIN PGP SIGNATURE-----' >>expect
829 test_expect_success GPG 'sign with a given key id' '
830
831         git tag -u committer@example.com -m "Another message" u-signed-tag &&
832         get_tag_msg u-signed-tag >actual &&
833         test_cmp expect actual
834
835 '
836
837 test_expect_success GPG 'sign with an unknown id (1)' '
838
839         test_must_fail git tag -u author@example.com \
840                 -m "Another message" o-signed-tag
841
842 '
843
844 test_expect_success GPG 'sign with an unknown id (2)' '
845
846         test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag
847
848 '
849
850 cat >fakeeditor <<'EOF'
851 #!/bin/sh
852 test -n "$1" && exec >"$1"
853 echo A signed tag message
854 echo from a fake editor.
855 EOF
856 chmod +x fakeeditor
857
858 get_tag_header implied-sign $commit commit $time >expect
859 ./fakeeditor >>expect
860 echo '-----BEGIN PGP SIGNATURE-----' >>expect
861 test_expect_success GPG '-u implies signed tag' '
862         GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign &&
863         get_tag_msg implied-sign >actual &&
864         test_cmp expect actual
865 '
866
867 cat >sigmsgfile <<EOF
868 Another signed tag
869 message in a file.
870 EOF
871 get_tag_header file-signed-tag $commit commit $time >expect
872 cat sigmsgfile >>expect
873 echo '-----BEGIN PGP SIGNATURE-----' >>expect
874 test_expect_success GPG \
875         'creating a signed tag with -F messagefile should succeed' '
876         git tag -s -F sigmsgfile file-signed-tag &&
877         get_tag_msg file-signed-tag >actual &&
878         test_cmp expect actual
879 '
880
881 cat >siginputmsg <<EOF
882 A signed tag message from
883 the standard input
884 EOF
885 get_tag_header stdin-signed-tag $commit commit $time >expect
886 cat siginputmsg >>expect
887 echo '-----BEGIN PGP SIGNATURE-----' >>expect
888 test_expect_success GPG 'creating a signed tag with -F - should succeed' '
889         git tag -s -F - stdin-signed-tag <siginputmsg &&
890         get_tag_msg stdin-signed-tag >actual &&
891         test_cmp expect actual
892 '
893
894 get_tag_header implied-annotate $commit commit $time >expect
895 ./fakeeditor >>expect
896 echo '-----BEGIN PGP SIGNATURE-----' >>expect
897 test_expect_success GPG '-s implies annotated tag' '
898         GIT_EDITOR=./fakeeditor git tag -s implied-annotate &&
899         get_tag_msg implied-annotate >actual &&
900         test_cmp expect actual
901 '
902
903 get_tag_header forcesignannotated-implied-sign $commit commit $time >expect
904 echo "A message" >>expect
905 echo '-----BEGIN PGP SIGNATURE-----' >>expect
906 test_expect_success GPG \
907         'git tag -s implied if configured with tag.forcesignannotated' \
908         'test_config tag.forcesignannotated true &&
909         git tag -m "A message" forcesignannotated-implied-sign &&
910         get_tag_msg forcesignannotated-implied-sign >actual &&
911         test_cmp expect actual
912 '
913
914 test_expect_success GPG \
915         'lightweight with no message when configured with tag.forcesignannotated' \
916         'test_config tag.forcesignannotated true &&
917         git tag forcesignannotated-lightweight &&
918         tag_exists forcesignannotated-lightweight &&
919         test_must_fail git tag -v forcesignannotated-no-message
920 '
921
922 get_tag_header forcesignannotated-annotate $commit commit $time >expect
923 echo "A message" >>expect
924 test_expect_success GPG \
925         'git tag -a disable configured tag.forcesignannotated' \
926         'test_config tag.forcesignannotated true &&
927         git tag -a -m "A message" forcesignannotated-annotate &&
928         get_tag_msg forcesignannotated-annotate >actual &&
929         test_cmp expect actual &&
930         test_must_fail git tag -v forcesignannotated-annotate
931 '
932
933 get_tag_header forcesignannotated-disabled $commit commit $time >expect
934 echo "A message" >>expect
935 echo '-----BEGIN PGP SIGNATURE-----' >>expect
936 test_expect_success GPG \
937         'git tag --sign enable GPG sign' \
938         'test_config tag.forcesignannotated false &&
939         git tag --sign -m "A message" forcesignannotated-disabled &&
940         get_tag_msg forcesignannotated-disabled >actual &&
941         test_cmp expect actual
942 '
943
944 get_tag_header gpgsign-enabled $commit commit $time >expect
945 echo "A message" >>expect
946 echo '-----BEGIN PGP SIGNATURE-----' >>expect
947 test_expect_success GPG \
948         'git tag configured tag.gpgsign enables GPG sign' \
949         'test_config tag.gpgsign true &&
950         git tag -m "A message" gpgsign-enabled &&
951         get_tag_msg gpgsign-enabled>actual &&
952         test_cmp expect actual
953 '
954
955 get_tag_header no-sign $commit commit $time >expect
956 echo "A message" >>expect
957 test_expect_success GPG \
958         'git tag --no-sign configured tag.gpgsign skip GPG sign' \
959         'test_config tag.gpgsign true &&
960         git tag -a --no-sign -m "A message" no-sign &&
961         get_tag_msg no-sign>actual &&
962         test_cmp expect actual
963 '
964
965 test_expect_success GPG \
966         'trying to create a signed tag with non-existing -F file should fail' '
967         ! test -f nonexistingfile &&
968         ! tag_exists nosigtag &&
969         test_must_fail git tag -s -F nonexistingfile nosigtag &&
970         ! tag_exists nosigtag
971 '
972
973 test_expect_success GPG 'verifying a signed tag should succeed' \
974         'git tag -v signed-tag'
975
976 test_expect_success GPG 'verifying two signed tags in one command should succeed' \
977         'git tag -v signed-tag file-signed-tag'
978
979 test_expect_success GPG \
980         'verifying many signed and non-signed tags should fail' '
981         test_must_fail git tag -v signed-tag annotated-tag &&
982         test_must_fail git tag -v file-annotated-tag file-signed-tag &&
983         test_must_fail git tag -v annotated-tag \
984                 file-signed-tag file-annotated-tag &&
985         test_must_fail git tag -v signed-tag annotated-tag file-signed-tag
986 '
987
988 test_expect_success GPG 'verifying a forged tag should fail' '
989         forged=$(git cat-file tag signed-tag |
990                 sed -e "s/signed-tag/forged-tag/" |
991                 git mktag) &&
992         git tag forged-tag $forged &&
993         test_must_fail git tag -v forged-tag
994 '
995
996 test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly' '
997         cat >expect <<-\EOF &&
998         tagname : signed-tag
999         EOF
1000         git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
1001         test_cmp expect actual
1002 '
1003
1004 test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
1005         test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
1006         test_must_be_empty actual
1007 '
1008
1009 # blank and empty messages for signed tags:
1010
1011 get_tag_header empty-signed-tag $commit commit $time >expect
1012 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1013 test_expect_success GPG \
1014         'creating a signed tag with an empty -m message should succeed' '
1015         git tag -s -m "" empty-signed-tag &&
1016         get_tag_msg empty-signed-tag >actual &&
1017         test_cmp expect actual &&
1018         git tag -v empty-signed-tag
1019 '
1020
1021 >sigemptyfile
1022 get_tag_header emptyfile-signed-tag $commit commit $time >expect
1023 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1024 test_expect_success GPG \
1025         'creating a signed tag with an empty -F messagefile should succeed' '
1026         git tag -s -F sigemptyfile emptyfile-signed-tag &&
1027         get_tag_msg emptyfile-signed-tag >actual &&
1028         test_cmp expect actual &&
1029         git tag -v emptyfile-signed-tag
1030 '
1031
1032 printf '\n\n  \n\t\nLeading blank lines\n' > sigblanksfile
1033 printf '\n\t \t  \nRepeated blank lines\n' >>sigblanksfile
1034 printf '\n\n\nTrailing spaces      \t  \n' >>sigblanksfile
1035 printf '\nTrailing blank lines\n\n\t \n\n' >>sigblanksfile
1036 get_tag_header blanks-signed-tag $commit commit $time >expect
1037 cat >>expect <<EOF
1038 Leading blank lines
1039
1040 Repeated blank lines
1041
1042 Trailing spaces
1043
1044 Trailing blank lines
1045 EOF
1046 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1047 test_expect_success GPG \
1048         'extra blanks in the message for a signed tag should be removed' '
1049         git tag -s -F sigblanksfile blanks-signed-tag &&
1050         get_tag_msg blanks-signed-tag >actual &&
1051         test_cmp expect actual &&
1052         git tag -v blanks-signed-tag
1053 '
1054
1055 get_tag_header blank-signed-tag $commit commit $time >expect
1056 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1057 test_expect_success GPG \
1058         'creating a signed tag with a blank -m message should succeed' '
1059         git tag -s -m "     " blank-signed-tag &&
1060         get_tag_msg blank-signed-tag >actual &&
1061         test_cmp expect actual &&
1062         git tag -v blank-signed-tag
1063 '
1064
1065 echo '     ' >sigblankfile
1066 echo ''      >>sigblankfile
1067 echo '  '    >>sigblankfile
1068 get_tag_header blankfile-signed-tag $commit commit $time >expect
1069 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1070 test_expect_success GPG \
1071         'creating a signed tag with blank -F file with spaces should succeed' '
1072         git tag -s -F sigblankfile blankfile-signed-tag &&
1073         get_tag_msg blankfile-signed-tag >actual &&
1074         test_cmp expect actual &&
1075         git tag -v blankfile-signed-tag
1076 '
1077
1078 printf '      ' >sigblanknonlfile
1079 get_tag_header blanknonlfile-signed-tag $commit commit $time >expect
1080 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1081 test_expect_success GPG \
1082         'creating a signed tag with spaces and no newline should succeed' '
1083         git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&
1084         get_tag_msg blanknonlfile-signed-tag >actual &&
1085         test_cmp expect actual &&
1086         git tag -v blanknonlfile-signed-tag
1087 '
1088
1089 test_expect_success GPG 'signed tag with embedded PGP message' '
1090         cat >msg <<-\EOF &&
1091         -----BEGIN PGP MESSAGE-----
1092
1093         this is not a real PGP message
1094         -----END PGP MESSAGE-----
1095         EOF
1096         git tag -s -F msg confusing-pgp-message &&
1097         git tag -v confusing-pgp-message
1098 '
1099
1100 # messages with commented lines for signed tags:
1101
1102 cat >sigcommentsfile <<EOF
1103 # A comment
1104
1105 ############
1106 The message.
1107 ############
1108 One line.
1109
1110
1111 # commented lines
1112 # commented lines
1113
1114 Another line.
1115 # comments
1116
1117 Last line.
1118 EOF
1119 get_tag_header comments-signed-tag $commit commit $time >expect
1120 cat >>expect <<EOF
1121 The message.
1122 One line.
1123
1124 Another line.
1125
1126 Last line.
1127 EOF
1128 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1129 test_expect_success GPG \
1130         'creating a signed tag with a -F file with #comments should succeed' '
1131         git tag -s -F sigcommentsfile comments-signed-tag &&
1132         get_tag_msg comments-signed-tag >actual &&
1133         test_cmp expect actual &&
1134         git tag -v comments-signed-tag
1135 '
1136
1137 get_tag_header comment-signed-tag $commit commit $time >expect
1138 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1139 test_expect_success GPG \
1140         'creating a signed tag with #commented -m message should succeed' '
1141         git tag -s -m "#comment" comment-signed-tag &&
1142         get_tag_msg comment-signed-tag >actual &&
1143         test_cmp expect actual &&
1144         git tag -v comment-signed-tag
1145 '
1146
1147 echo '#comment' >sigcommentfile
1148 echo ''         >>sigcommentfile
1149 echo '####'     >>sigcommentfile
1150 get_tag_header commentfile-signed-tag $commit commit $time >expect
1151 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1152 test_expect_success GPG \
1153         'creating a signed tag with #commented -F messagefile should succeed' '
1154         git tag -s -F sigcommentfile commentfile-signed-tag &&
1155         get_tag_msg commentfile-signed-tag >actual &&
1156         test_cmp expect actual &&
1157         git tag -v commentfile-signed-tag
1158 '
1159
1160 printf '#comment' >sigcommentnonlfile
1161 get_tag_header commentnonlfile-signed-tag $commit commit $time >expect
1162 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1163 test_expect_success GPG \
1164         'creating a signed tag with a #comment and no newline should succeed' '
1165         git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&
1166         get_tag_msg commentnonlfile-signed-tag >actual &&
1167         test_cmp expect actual &&
1168         git tag -v commentnonlfile-signed-tag
1169 '
1170
1171 # listing messages for signed tags:
1172
1173 test_expect_success GPG \
1174         'listing the one-line message of a signed tag should succeed' '
1175         git tag -s -m "A message line signed" stag-one-line &&
1176
1177         echo "stag-one-line" >expect &&
1178         git tag -l | grep "^stag-one-line" >actual &&
1179         test_cmp expect actual &&
1180         git tag -n0 -l | grep "^stag-one-line" >actual &&
1181         test_cmp expect actual &&
1182         git tag -n0 -l stag-one-line >actual &&
1183         test_cmp expect actual &&
1184
1185         echo "stag-one-line   A message line signed" >expect &&
1186         git tag -n1 -l | grep "^stag-one-line" >actual &&
1187         test_cmp expect actual &&
1188         git tag -n -l | grep "^stag-one-line" >actual &&
1189         test_cmp expect actual &&
1190         git tag -n1 -l stag-one-line >actual &&
1191         test_cmp expect actual &&
1192         git tag -n2 -l stag-one-line >actual &&
1193         test_cmp expect actual &&
1194         git tag -n999 -l stag-one-line >actual &&
1195         test_cmp expect actual
1196 '
1197
1198 test_expect_success GPG \
1199         'listing the zero-lines message of a signed tag should succeed' '
1200         git tag -s -m "" stag-zero-lines &&
1201
1202         echo "stag-zero-lines" >expect &&
1203         git tag -l | grep "^stag-zero-lines" >actual &&
1204         test_cmp expect actual &&
1205         git tag -n0 -l | grep "^stag-zero-lines" >actual &&
1206         test_cmp expect actual &&
1207         git tag -n0 -l stag-zero-lines >actual &&
1208         test_cmp expect actual &&
1209
1210         echo "stag-zero-lines " >expect &&
1211         git tag -n1 -l | grep "^stag-zero-lines" >actual &&
1212         test_cmp expect actual &&
1213         git tag -n -l | grep "^stag-zero-lines" >actual &&
1214         test_cmp expect actual &&
1215         git tag -n1 -l stag-zero-lines >actual &&
1216         test_cmp expect actual &&
1217         git tag -n2 -l stag-zero-lines >actual &&
1218         test_cmp expect actual &&
1219         git tag -n999 -l stag-zero-lines >actual &&
1220         test_cmp expect actual
1221 '
1222
1223 echo 'stag line one' >sigtagmsg
1224 echo 'stag line two' >>sigtagmsg
1225 echo 'stag line three' >>sigtagmsg
1226 test_expect_success GPG \
1227         'listing many message lines of a signed tag should succeed' '
1228         git tag -s -F sigtagmsg stag-lines &&
1229
1230         echo "stag-lines" >expect &&
1231         git tag -l | grep "^stag-lines" >actual &&
1232         test_cmp expect actual &&
1233         git tag -n0 -l | grep "^stag-lines" >actual &&
1234         test_cmp expect actual &&
1235         git tag -n0 -l stag-lines >actual &&
1236         test_cmp expect actual &&
1237
1238         echo "stag-lines      stag line one" >expect &&
1239         git tag -n1 -l | grep "^stag-lines" >actual &&
1240         test_cmp expect actual &&
1241         git tag -n -l | grep "^stag-lines" >actual &&
1242         test_cmp expect actual &&
1243         git tag -n1 -l stag-lines >actual &&
1244         test_cmp expect actual &&
1245
1246         echo "    stag line two" >>expect &&
1247         git tag -n2 -l | grep "^ *stag.line" >actual &&
1248         test_cmp expect actual &&
1249         git tag -n2 -l stag-lines >actual &&
1250         test_cmp expect actual &&
1251
1252         echo "    stag line three" >>expect &&
1253         git tag -n3 -l | grep "^ *stag.line" >actual &&
1254         test_cmp expect actual &&
1255         git tag -n3 -l stag-lines >actual &&
1256         test_cmp expect actual &&
1257         git tag -n4 -l | grep "^ *stag.line" >actual &&
1258         test_cmp expect actual &&
1259         git tag -n4 -l stag-lines >actual &&
1260         test_cmp expect actual &&
1261         git tag -n99 -l | grep "^ *stag.line" >actual &&
1262         test_cmp expect actual &&
1263         git tag -n99 -l stag-lines >actual &&
1264         test_cmp expect actual
1265 '
1266
1267 # tags pointing to objects different from commits:
1268
1269 tree=$(git rev-parse HEAD^{tree})
1270 blob=$(git rev-parse HEAD:foo)
1271 tag=$(git rev-parse signed-tag 2>/dev/null)
1272
1273 get_tag_header tree-signed-tag $tree tree $time >expect
1274 echo "A message for a tree" >>expect
1275 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1276 test_expect_success GPG \
1277         'creating a signed tag pointing to a tree should succeed' '
1278         git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&
1279         get_tag_msg tree-signed-tag >actual &&
1280         test_cmp expect actual
1281 '
1282
1283 get_tag_header blob-signed-tag $blob blob $time >expect
1284 echo "A message for a blob" >>expect
1285 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1286 test_expect_success GPG \
1287         'creating a signed tag pointing to a blob should succeed' '
1288         git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&
1289         get_tag_msg blob-signed-tag >actual &&
1290         test_cmp expect actual
1291 '
1292
1293 get_tag_header tag-signed-tag $tag tag $time >expect
1294 echo "A message for another tag" >>expect
1295 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1296 test_expect_success GPG \
1297         'creating a signed tag pointing to another tag should succeed' '
1298         git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&
1299         get_tag_msg tag-signed-tag >actual &&
1300         test_cmp expect actual
1301 '
1302
1303 # usage with rfc1991 signatures
1304 get_tag_header rfc1991-signed-tag $commit commit $time >expect
1305 echo "RFC1991 signed tag" >>expect
1306 echo '-----BEGIN PGP MESSAGE-----' >>expect
1307 test_expect_success GPG,RFC1991 \
1308         'creating a signed tag with rfc1991' '
1309         echo "rfc1991" >gpghome/gpg.conf &&
1310         git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit &&
1311         get_tag_msg rfc1991-signed-tag >actual &&
1312         test_cmp expect actual
1313 '
1314
1315 cat >fakeeditor <<'EOF'
1316 #!/bin/sh
1317 cp "$1" actual
1318 EOF
1319 chmod +x fakeeditor
1320
1321 test_expect_success GPG,RFC1991 \
1322         'reediting a signed tag body omits signature' '
1323         echo "rfc1991" >gpghome/gpg.conf &&
1324         echo "RFC1991 signed tag" >expect &&
1325         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1326         test_cmp expect actual
1327 '
1328
1329 test_expect_success GPG,RFC1991 \
1330         'verifying rfc1991 signature' '
1331         echo "rfc1991" >gpghome/gpg.conf &&
1332         git tag -v rfc1991-signed-tag
1333 '
1334
1335 test_expect_success GPG,RFC1991 \
1336         'list tag with rfc1991 signature' '
1337         echo "rfc1991" >gpghome/gpg.conf &&
1338         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1339         git tag -l -n1 rfc1991-signed-tag >actual &&
1340         test_cmp expect actual &&
1341         git tag -l -n2 rfc1991-signed-tag >actual &&
1342         test_cmp expect actual &&
1343         git tag -l -n999 rfc1991-signed-tag >actual &&
1344         test_cmp expect actual
1345 '
1346
1347 rm -f gpghome/gpg.conf
1348
1349 test_expect_success GPG,RFC1991 \
1350         'verifying rfc1991 signature without --rfc1991' '
1351         git tag -v rfc1991-signed-tag
1352 '
1353
1354 test_expect_success GPG,RFC1991 \
1355         'list tag with rfc1991 signature without --rfc1991' '
1356         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1357         git tag -l -n1 rfc1991-signed-tag >actual &&
1358         test_cmp expect actual &&
1359         git tag -l -n2 rfc1991-signed-tag >actual &&
1360         test_cmp expect actual &&
1361         git tag -l -n999 rfc1991-signed-tag >actual &&
1362         test_cmp expect actual
1363 '
1364
1365 test_expect_success GPG,RFC1991 \
1366         'reediting a signed tag body omits signature' '
1367         echo "RFC1991 signed tag" >expect &&
1368         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1369         test_cmp expect actual
1370 '
1371
1372 # try to sign with bad user.signingkey
1373 test_expect_success GPG \
1374         'git tag -s fails if gpg is misconfigured (bad key)' \
1375         'test_config user.signingkey BobTheMouse &&
1376         test_must_fail git tag -s -m tail tag-gpg-failure'
1377
1378 # try to produce invalid signature
1379 test_expect_success GPG \
1380         'git tag -s fails if gpg is misconfigured (bad signature format)' \
1381         'test_config gpg.program echo &&
1382          test_must_fail git tag -s -m tail tag-gpg-failure'
1383
1384 # try to produce invalid signature
1385 test_expect_success GPG 'git verifies tag is valid with double signature' '
1386         git tag -s -m tail tag-gpg-double-sig &&
1387         git cat-file tag tag-gpg-double-sig >tag &&
1388         othersigheader=$(test_oid othersigheader) &&
1389         sed -ne "/^\$/q;p" tag >new-tag &&
1390         cat <<-EOM >>new-tag &&
1391         $othersigheader -----BEGIN PGP SIGNATURE-----
1392          someinvaliddata
1393          -----END PGP SIGNATURE-----
1394         EOM
1395         sed -e "1,/^tagger/d" tag >>new-tag &&
1396         new_tag=$(git hash-object -t tag -w new-tag) &&
1397         git update-ref refs/tags/tag-gpg-double-sig $new_tag &&
1398         git verify-tag tag-gpg-double-sig &&
1399         git fsck
1400 '
1401
1402 # try to sign with bad user.signingkey
1403 test_expect_success GPGSM \
1404         'git tag -s fails if gpgsm is misconfigured (bad key)' \
1405         'test_config user.signingkey BobTheMouse &&
1406          test_config gpg.format x509 &&
1407          test_must_fail git tag -s -m tail tag-gpg-failure'
1408
1409 # try to produce invalid signature
1410 test_expect_success GPGSM \
1411         'git tag -s fails if gpgsm is misconfigured (bad signature format)' \
1412         'test_config gpg.x509.program echo &&
1413          test_config gpg.format x509 &&
1414          test_must_fail git tag -s -m tail tag-gpg-failure'
1415
1416 # try to verify without gpg:
1417
1418 rm -rf gpghome
1419 test_expect_success GPG \
1420         'verify signed tag fails when public key is not present' \
1421         'test_must_fail git tag -v signed-tag'
1422
1423 test_expect_success \
1424         'git tag -a fails if tag annotation is empty' '
1425         ! (GIT_EDITOR=cat git tag -a initial-comment)
1426 '
1427
1428 test_expect_success \
1429         'message in editor has initial comment' '
1430         ! (GIT_EDITOR=cat git tag -a initial-comment > actual)
1431 '
1432
1433 test_expect_success 'message in editor has initial comment: first line' '
1434         # check the first line --- should be empty
1435         echo >first.expect &&
1436         sed -e 1q <actual >first.actual &&
1437         test_cmp first.expect first.actual
1438 '
1439
1440 test_expect_success \
1441         'message in editor has initial comment: remainder' '
1442         # remove commented lines from the remainder -- should be empty
1443         sed -e 1d -e "/^#/d" <actual >rest.actual &&
1444         test_must_be_empty rest.actual
1445 '
1446
1447 get_tag_header reuse $commit commit $time >expect
1448 echo "An annotation to be reused" >> expect
1449 test_expect_success \
1450         'overwriting an annotated tag should use its previous body' '
1451         git tag -a -m "An annotation to be reused" reuse &&
1452         GIT_EDITOR=true git tag -f -a reuse &&
1453         get_tag_msg reuse >actual &&
1454         test_cmp expect actual
1455 '
1456
1457 test_expect_success 'filename for the message is relative to cwd' '
1458         mkdir subdir &&
1459         echo "Tag message in top directory" >msgfile-5 &&
1460         echo "Tag message in sub directory" >subdir/msgfile-5 &&
1461         (
1462                 cd subdir &&
1463                 git tag -a -F msgfile-5 tag-from-subdir
1464         ) &&
1465         git cat-file tag tag-from-subdir | grep "in sub directory"
1466 '
1467
1468 test_expect_success 'filename for the message is relative to cwd' '
1469         echo "Tag message in sub directory" >subdir/msgfile-6 &&
1470         (
1471                 cd subdir &&
1472                 git tag -a -F msgfile-6 tag-from-subdir-2
1473         ) &&
1474         git cat-file tag tag-from-subdir-2 | grep "in sub directory"
1475 '
1476
1477 # create a few more commits to test --contains
1478
1479 hash1=$(git rev-parse HEAD)
1480
1481 test_expect_success 'creating second commit and tag' '
1482         echo foo-2.0 >foo &&
1483         git add foo &&
1484         git commit -m second &&
1485         git tag v2.0
1486 '
1487
1488 hash2=$(git rev-parse HEAD)
1489
1490 test_expect_success 'creating third commit without tag' '
1491         echo foo-dev >foo &&
1492         git add foo &&
1493         git commit -m third
1494 '
1495
1496 hash3=$(git rev-parse HEAD)
1497
1498 # simple linear checks of --continue
1499
1500 cat > expected <<EOF
1501 v0.2.1
1502 v1.0
1503 v1.0.1
1504 v1.1.3
1505 v2.0
1506 EOF
1507
1508 test_expect_success 'checking that first commit is in all tags (hash)' "
1509         git tag -l --contains $hash1 v* >actual &&
1510         test_cmp expected actual
1511 "
1512
1513 # other ways of specifying the commit
1514 test_expect_success 'checking that first commit is in all tags (tag)' "
1515         git tag -l --contains v1.0 v* >actual &&
1516         test_cmp expected actual
1517 "
1518
1519 test_expect_success 'checking that first commit is in all tags (relative)' "
1520         git tag -l --contains HEAD~2 v* >actual &&
1521         test_cmp expected actual
1522 "
1523
1524 # All the --contains tests above, but with --no-contains
1525 test_expect_success 'checking that first commit is not listed in any tag with --no-contains  (hash)' "
1526         git tag -l --no-contains $hash1 v* >actual &&
1527         test_must_be_empty actual
1528 "
1529
1530 test_expect_success 'checking that first commit is in all tags (tag)' "
1531         git tag -l --no-contains v1.0 v* >actual &&
1532         test_must_be_empty actual
1533 "
1534
1535 test_expect_success 'checking that first commit is in all tags (relative)' "
1536         git tag -l --no-contains HEAD~2 v* >actual &&
1537         test_must_be_empty actual
1538 "
1539
1540 cat > expected <<EOF
1541 v2.0
1542 EOF
1543
1544 test_expect_success 'checking that second commit only has one tag' "
1545         git tag -l --contains $hash2 v* >actual &&
1546         test_cmp expected actual
1547 "
1548
1549 cat > expected <<EOF
1550 v0.2.1
1551 v1.0
1552 v1.0.1
1553 v1.1.3
1554 EOF
1555
1556 test_expect_success 'inverse of the last test, with --no-contains' "
1557         git tag -l --no-contains $hash2 v* >actual &&
1558         test_cmp expected actual
1559 "
1560
1561 test_expect_success 'checking that third commit has no tags' "
1562         git tag -l --contains $hash3 v* >actual &&
1563         test_must_be_empty actual
1564 "
1565
1566 cat > expected <<EOF
1567 v0.2.1
1568 v1.0
1569 v1.0.1
1570 v1.1.3
1571 v2.0
1572 EOF
1573
1574 test_expect_success 'conversely --no-contains on the third commit lists all tags' "
1575         git tag -l --no-contains $hash3 v* >actual &&
1576         test_cmp expected actual
1577 "
1578
1579 # how about a simple merge?
1580
1581 test_expect_success 'creating simple branch' '
1582         git branch stable v2.0 &&
1583         git checkout stable &&
1584         echo foo-3.0 > foo &&
1585         git commit foo -m fourth &&
1586         git tag v3.0
1587 '
1588
1589 hash4=$(git rev-parse HEAD)
1590
1591 cat > expected <<EOF
1592 v3.0
1593 EOF
1594
1595 test_expect_success 'checking that branch head only has one tag' "
1596         git tag -l --contains $hash4 v* >actual &&
1597         test_cmp expected actual
1598 "
1599
1600 cat > expected <<EOF
1601 v0.2.1
1602 v1.0
1603 v1.0.1
1604 v1.1.3
1605 v2.0
1606 EOF
1607
1608 test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
1609         git tag -l --no-contains $hash4 v* >actual &&
1610         test_cmp expected actual
1611 "
1612
1613 test_expect_success 'merging original branch into this branch' '
1614         git merge --strategy=ours main &&
1615         git tag v4.0
1616 '
1617
1618 cat > expected <<EOF
1619 v4.0
1620 EOF
1621
1622 test_expect_success 'checking that original branch head has one tag now' "
1623         git tag -l --contains $hash3 v* >actual &&
1624         test_cmp expected actual
1625 "
1626
1627 cat > expected <<EOF
1628 v0.2.1
1629 v1.0
1630 v1.0.1
1631 v1.1.3
1632 v2.0
1633 v3.0
1634 EOF
1635
1636 test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
1637         git tag -l --no-contains $hash3 v* >actual &&
1638         test_cmp expected actual
1639 "
1640
1641 cat > expected <<EOF
1642 v0.2.1
1643 v1.0
1644 v1.0.1
1645 v1.1.3
1646 v2.0
1647 v3.0
1648 v4.0
1649 EOF
1650
1651 test_expect_success 'checking that initial commit is in all tags' "
1652         git tag -l --contains $hash1 v* >actual &&
1653         test_cmp expected actual
1654 "
1655
1656 test_expect_success 'checking that --contains can be used in non-list mode' '
1657         git tag --contains $hash1 v* >actual &&
1658         test_cmp expected actual
1659 '
1660
1661 test_expect_success 'checking that initial commit is in all tags with --no-contains' "
1662         git tag -l --no-contains $hash1 v* >actual &&
1663         test_must_be_empty actual
1664 "
1665
1666 # mixing modes and options:
1667
1668 test_expect_success 'mixing incompatibles modes and options is forbidden' '
1669         test_must_fail git tag -a &&
1670         test_must_fail git tag -a -l &&
1671         test_must_fail git tag -s &&
1672         test_must_fail git tag -s -l &&
1673         test_must_fail git tag -m &&
1674         test_must_fail git tag -m -l &&
1675         test_must_fail git tag -m "hlagh" &&
1676         test_must_fail git tag -m "hlagh" -l &&
1677         test_must_fail git tag -F &&
1678         test_must_fail git tag -F -l &&
1679         test_must_fail git tag -f &&
1680         test_must_fail git tag -f -l &&
1681         test_must_fail git tag -a -s -m -F &&
1682         test_must_fail git tag -a -s -m -F -l &&
1683         test_must_fail git tag -l -v &&
1684         test_must_fail git tag -l -d &&
1685         test_must_fail git tag -l -v -d &&
1686         test_must_fail git tag -n 100 -v &&
1687         test_must_fail git tag -l -m msg &&
1688         test_must_fail git tag -l -F some file &&
1689         test_must_fail git tag -v -s &&
1690         test_must_fail git tag --contains tag-tree &&
1691         test_must_fail git tag --contains tag-blob &&
1692         test_must_fail git tag --no-contains tag-tree &&
1693         test_must_fail git tag --no-contains tag-blob &&
1694         test_must_fail git tag --contains --no-contains &&
1695         test_must_fail git tag --no-with HEAD &&
1696         test_must_fail git tag --no-without HEAD
1697 '
1698
1699 for option in --contains --with --no-contains --without --merged --no-merged --points-at
1700 do
1701         test_expect_success "mixing incompatible modes with $option is forbidden" "
1702                 test_must_fail git tag -d $option HEAD &&
1703                 test_must_fail git tag -d $option HEAD some-tag &&
1704                 test_must_fail git tag -v $option HEAD
1705         "
1706         test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
1707                 git tag -n $option HEAD HEAD &&
1708                 git tag $option HEAD HEAD &&
1709                 git tag $option
1710         "
1711 done
1712
1713 # check points-at
1714
1715 test_expect_success '--points-at can be used in non-list mode' '
1716         echo v4.0 >expect &&
1717         git tag --points-at=v4.0 "v*" >actual &&
1718         test_cmp expect actual
1719 '
1720
1721 test_expect_success '--points-at is a synonym for --points-at HEAD' '
1722         echo v4.0 >expect &&
1723         git tag --points-at >actual &&
1724         test_cmp expect actual
1725 '
1726
1727 test_expect_success '--points-at finds lightweight tags' '
1728         echo v4.0 >expect &&
1729         git tag --points-at v4.0 >actual &&
1730         test_cmp expect actual
1731 '
1732
1733 test_expect_success '--points-at finds annotated tags of commits' '
1734         git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&
1735         echo annotated-v4.0 >expect &&
1736         git tag -l --points-at v4.0 "annotated*" >actual &&
1737         test_cmp expect actual
1738 '
1739
1740 test_expect_success '--points-at finds annotated tags of tags' '
1741         git tag -m "describing the v4.0 tag object" \
1742                 annotated-again-v4.0 annotated-v4.0 &&
1743         cat >expect <<-\EOF &&
1744         annotated-again-v4.0
1745         annotated-v4.0
1746         EOF
1747         git tag --points-at=annotated-v4.0 >actual &&
1748         test_cmp expect actual
1749 '
1750
1751 test_expect_success 'recursive tagging should give advice' '
1752         sed -e "s/|$//" <<-EOF >expect &&
1753         hint: You have created a nested tag. The object referred to by your new tag is
1754         hint: already a tag. If you meant to tag the object that it points to, use:
1755         hint: |
1756         hint:   git tag -f nested annotated-v4.0^{}
1757         hint: Disable this message with "git config advice.nestedTag false"
1758         EOF
1759         git tag -m nested nested annotated-v4.0 2>actual &&
1760         test_cmp expect actual
1761 '
1762
1763 test_expect_success 'multiple --points-at are OR-ed together' '
1764         cat >expect <<-\EOF &&
1765         v2.0
1766         v3.0
1767         EOF
1768         git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1769         test_cmp expect actual
1770 '
1771
1772 test_expect_success 'lexical sort' '
1773         git tag foo1.3 &&
1774         git tag foo1.6 &&
1775         git tag foo1.10 &&
1776         git tag -l --sort=refname "foo*" >actual &&
1777         cat >expect <<-\EOF &&
1778         foo1.10
1779         foo1.3
1780         foo1.6
1781         EOF
1782         test_cmp expect actual
1783 '
1784
1785 test_expect_success 'version sort' '
1786         git tag -l --sort=version:refname "foo*" >actual &&
1787         cat >expect <<-\EOF &&
1788         foo1.3
1789         foo1.6
1790         foo1.10
1791         EOF
1792         test_cmp expect actual
1793 '
1794
1795 test_expect_success 'reverse version sort' '
1796         git tag -l --sort=-version:refname "foo*" >actual &&
1797         cat >expect <<-\EOF &&
1798         foo1.10
1799         foo1.6
1800         foo1.3
1801         EOF
1802         test_cmp expect actual
1803 '
1804
1805 test_expect_success 'reverse lexical sort' '
1806         git tag -l --sort=-refname "foo*" >actual &&
1807         cat >expect <<-\EOF &&
1808         foo1.6
1809         foo1.3
1810         foo1.10
1811         EOF
1812         test_cmp expect actual
1813 '
1814
1815 test_expect_success 'configured lexical sort' '
1816         test_config tag.sort "v:refname" &&
1817         git tag -l "foo*" >actual &&
1818         cat >expect <<-\EOF &&
1819         foo1.3
1820         foo1.6
1821         foo1.10
1822         EOF
1823         test_cmp expect actual
1824 '
1825
1826 test_expect_success 'option override configured sort' '
1827         test_config tag.sort "v:refname" &&
1828         git tag -l --sort=-refname "foo*" >actual &&
1829         cat >expect <<-\EOF &&
1830         foo1.6
1831         foo1.3
1832         foo1.10
1833         EOF
1834         test_cmp expect actual
1835 '
1836
1837 test_expect_success 'invalid sort parameter on command line' '
1838         test_must_fail git tag -l --sort=notvalid "foo*" >actual
1839 '
1840
1841 test_expect_success 'invalid sort parameter in configuratoin' '
1842         test_config tag.sort "v:notvalid" &&
1843         test_must_fail git tag -l "foo*"
1844 '
1845
1846 test_expect_success 'version sort with prerelease reordering' '
1847         test_config versionsort.prereleaseSuffix -rc &&
1848         git tag foo1.6-rc1 &&
1849         git tag foo1.6-rc2 &&
1850         git tag -l --sort=version:refname "foo*" >actual &&
1851         cat >expect <<-\EOF &&
1852         foo1.3
1853         foo1.6-rc1
1854         foo1.6-rc2
1855         foo1.6
1856         foo1.10
1857         EOF
1858         test_cmp expect actual
1859 '
1860
1861 test_expect_success 'reverse version sort with prerelease reordering' '
1862         test_config versionsort.prereleaseSuffix -rc &&
1863         git tag -l --sort=-version:refname "foo*" >actual &&
1864         cat >expect <<-\EOF &&
1865         foo1.10
1866         foo1.6
1867         foo1.6-rc2
1868         foo1.6-rc1
1869         foo1.3
1870         EOF
1871         test_cmp expect actual
1872 '
1873
1874 test_expect_success 'version sort with prerelease reordering and common leading character' '
1875         test_config versionsort.prereleaseSuffix -before &&
1876         git tag foo1.7-before1 &&
1877         git tag foo1.7 &&
1878         git tag foo1.7-after1 &&
1879         git tag -l --sort=version:refname "foo1.7*" >actual &&
1880         cat >expect <<-\EOF &&
1881         foo1.7-before1
1882         foo1.7
1883         foo1.7-after1
1884         EOF
1885         test_cmp expect actual
1886 '
1887
1888 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1889         test_config versionsort.prereleaseSuffix -before &&
1890         git config --add versionsort.prereleaseSuffix -after &&
1891         git tag -l --sort=version:refname "foo1.7*" >actual &&
1892         cat >expect <<-\EOF &&
1893         foo1.7-before1
1894         foo1.7-after1
1895         foo1.7
1896         EOF
1897         test_cmp expect actual
1898 '
1899
1900 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1901         test_config versionsort.prereleaseSuffix -bar &&
1902         git config --add versionsort.prereleaseSuffix -foo-baz &&
1903         git config --add versionsort.prereleaseSuffix -foo-bar &&
1904         git tag foo1.8-foo-bar &&
1905         git tag foo1.8-foo-baz &&
1906         git tag foo1.8 &&
1907         git tag -l --sort=version:refname "foo1.8*" >actual &&
1908         cat >expect <<-\EOF &&
1909         foo1.8-foo-baz
1910         foo1.8-foo-bar
1911         foo1.8
1912         EOF
1913         test_cmp expect actual
1914 '
1915
1916 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1917         test_config versionsort.prereleaseSuffix -pre &&
1918         git config --add versionsort.prereleaseSuffix -prerelease &&
1919         git tag foo1.9-pre1 &&
1920         git tag foo1.9-pre2 &&
1921         git tag foo1.9-prerelease1 &&
1922         git tag -l --sort=version:refname "foo1.9*" >actual &&
1923         cat >expect <<-\EOF &&
1924         foo1.9-pre1
1925         foo1.9-pre2
1926         foo1.9-prerelease1
1927         EOF
1928         test_cmp expect actual
1929 '
1930
1931 test_expect_success 'version sort with general suffix reordering' '
1932         test_config versionsort.suffix -alpha &&
1933         git config --add versionsort.suffix -beta &&
1934         git config --add versionsort.suffix ""  &&
1935         git config --add versionsort.suffix -gamma &&
1936         git config --add versionsort.suffix -delta &&
1937         git tag foo1.10-alpha &&
1938         git tag foo1.10-beta &&
1939         git tag foo1.10-gamma &&
1940         git tag foo1.10-delta &&
1941         git tag foo1.10-unlisted-suffix &&
1942         git tag -l --sort=version:refname "foo1.10*" >actual &&
1943         cat >expect <<-\EOF &&
1944         foo1.10-alpha
1945         foo1.10-beta
1946         foo1.10
1947         foo1.10-unlisted-suffix
1948         foo1.10-gamma
1949         foo1.10-delta
1950         EOF
1951         test_cmp expect actual
1952 '
1953
1954 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1955         test_config versionsort.suffix -before &&
1956         test_config versionsort.prereleaseSuffix -after &&
1957         git tag -l --sort=version:refname "foo1.7*" >actual &&
1958         cat >expect <<-\EOF &&
1959         foo1.7-before1
1960         foo1.7
1961         foo1.7-after1
1962         EOF
1963         test_cmp expect actual
1964 '
1965
1966 test_expect_success 'version sort with very long prerelease suffix' '
1967         test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1968         git tag -l --sort=version:refname
1969 '
1970
1971 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1972         i=1 &&
1973         while test $i -lt 8000
1974         do
1975                 echo "commit refs/heads/main
1976 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1977 data <<EOF
1978 commit #$i
1979 EOF"
1980                 test $i = 1 && echo "from refs/heads/main^0"
1981                 i=$(($i + 1))
1982         done | git fast-import &&
1983         git checkout main &&
1984         git tag far-far-away HEAD^ &&
1985         run_with_limited_stack git tag --contains HEAD >actual &&
1986         test_must_be_empty actual &&
1987         run_with_limited_stack git tag --no-contains HEAD >actual &&
1988         test_line_count "-gt" 10 actual
1989 '
1990
1991 test_expect_success '--format should list tags as per format given' '
1992         cat >expect <<-\EOF &&
1993         refname : refs/tags/v1.0
1994         refname : refs/tags/v1.0.1
1995         refname : refs/tags/v1.1.3
1996         EOF
1997         git tag -l --format="refname : %(refname)" "v1*" >actual &&
1998         test_cmp expect actual
1999 '
2000
2001 test_expect_success "set up color tests" '
2002         echo "<RED>v1.0<RESET>" >expect.color &&
2003         echo "v1.0" >expect.bare &&
2004         color_args="--format=%(color:red)%(refname:short) --list v1.0"
2005 '
2006
2007 test_expect_success '%(color) omitted without tty' '
2008         TERM=vt100 git tag $color_args >actual.raw &&
2009         test_decode_color <actual.raw >actual &&
2010         test_cmp expect.bare actual
2011 '
2012
2013 test_expect_success TTY '%(color) present with tty' '
2014         test_terminal git tag $color_args >actual.raw &&
2015         test_decode_color <actual.raw >actual &&
2016         test_cmp expect.color actual
2017 '
2018
2019 test_expect_success '--color overrides auto-color' '
2020         git tag --color $color_args >actual.raw &&
2021         test_decode_color <actual.raw >actual &&
2022         test_cmp expect.color actual
2023 '
2024
2025 test_expect_success 'color.ui=always overrides auto-color' '
2026         git -c color.ui=always tag $color_args >actual.raw &&
2027         test_decode_color <actual.raw >actual &&
2028         test_cmp expect.color actual
2029 '
2030
2031 test_expect_success 'setup --merged test tags' '
2032         git tag mergetest-1 HEAD~2 &&
2033         git tag mergetest-2 HEAD~1 &&
2034         git tag mergetest-3 HEAD
2035 '
2036
2037 test_expect_success '--merged can be used in non-list mode' '
2038         cat >expect <<-\EOF &&
2039         mergetest-1
2040         mergetest-2
2041         EOF
2042         git tag --merged=mergetest-2 "mergetest*" >actual &&
2043         test_cmp expect actual
2044 '
2045
2046 test_expect_success '--merged is compatible with --no-merged' '
2047         git tag --merged HEAD --no-merged HEAD
2048 '
2049
2050 test_expect_success '--merged shows merged tags' '
2051         cat >expect <<-\EOF &&
2052         mergetest-1
2053         mergetest-2
2054         EOF
2055         git tag -l --merged=mergetest-2 mergetest-* >actual &&
2056         test_cmp expect actual
2057 '
2058
2059 test_expect_success '--no-merged show unmerged tags' '
2060         cat >expect <<-\EOF &&
2061         mergetest-3
2062         EOF
2063         git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
2064         test_cmp expect actual
2065 '
2066
2067 test_expect_success '--no-merged can be used in non-list mode' '
2068         git tag --no-merged=mergetest-2 mergetest-* >actual &&
2069         test_cmp expect actual
2070 '
2071
2072 test_expect_success 'ambiguous branch/tags not marked' '
2073         git tag ambiguous &&
2074         git branch ambiguous &&
2075         echo ambiguous >expect &&
2076         git tag -l ambiguous >actual &&
2077         test_cmp expect actual
2078 '
2079
2080 test_expect_success '--contains combined with --no-contains' '
2081         (
2082                 git init no-contains &&
2083                 cd no-contains &&
2084                 test_commit v0.1 &&
2085                 test_commit v0.2 &&
2086                 test_commit v0.3 &&
2087                 test_commit v0.4 &&
2088                 test_commit v0.5 &&
2089                 cat >expected <<-\EOF &&
2090                 v0.2
2091                 v0.3
2092                 v0.4
2093                 EOF
2094                 git tag --contains v0.2 --no-contains v0.5 >actual &&
2095                 test_cmp expected actual
2096         )
2097 '
2098
2099 # As the docs say, list tags which contain a specified *commit*. We
2100 # don't recurse down to tags for trees or blobs pointed to by *those*
2101 # commits.
2102 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
2103         cd no-contains &&
2104         blob=$(git rev-parse v0.3:v0.3.t) &&
2105         tree=$(git rev-parse v0.3^{tree}) &&
2106         git tag tag-blob $blob &&
2107         git tag tag-tree $tree &&
2108         git tag --contains v0.3 >actual &&
2109         cat >expected <<-\EOF &&
2110         v0.3
2111         v0.4
2112         v0.5
2113         EOF
2114         test_cmp expected actual &&
2115         git tag --no-contains v0.3 >actual &&
2116         cat >expected <<-\EOF &&
2117         v0.1
2118         v0.2
2119         EOF
2120         test_cmp expected actual
2121 '
2122
2123 test_done