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