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