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