tests: don't give unportable ">" to "test" built-in, use -gt
[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 '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 'verifying a forged tag with --format fail and format accordingly' '
946         cat >expect <<-\EOF
947         tagname : forged-tag
948         EOF &&
949         test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
950         test_cmp expect actual
951 '
952
953 # blank and empty messages for signed tags:
954
955 get_tag_header empty-signed-tag $commit commit $time >expect
956 echo '-----BEGIN PGP SIGNATURE-----' >>expect
957 test_expect_success GPG \
958         'creating a signed tag with an empty -m message should succeed' '
959         git tag -s -m "" empty-signed-tag &&
960         get_tag_msg empty-signed-tag >actual &&
961         test_cmp expect actual &&
962         git tag -v empty-signed-tag
963 '
964
965 >sigemptyfile
966 get_tag_header emptyfile-signed-tag $commit commit $time >expect
967 echo '-----BEGIN PGP SIGNATURE-----' >>expect
968 test_expect_success GPG \
969         'creating a signed tag with an empty -F messagefile should succeed' '
970         git tag -s -F sigemptyfile emptyfile-signed-tag &&
971         get_tag_msg emptyfile-signed-tag >actual &&
972         test_cmp expect actual &&
973         git tag -v emptyfile-signed-tag
974 '
975
976 printf '\n\n  \n\t\nLeading blank lines\n' > sigblanksfile
977 printf '\n\t \t  \nRepeated blank lines\n' >>sigblanksfile
978 printf '\n\n\nTrailing spaces      \t  \n' >>sigblanksfile
979 printf '\nTrailing blank lines\n\n\t \n\n' >>sigblanksfile
980 get_tag_header blanks-signed-tag $commit commit $time >expect
981 cat >>expect <<EOF
982 Leading blank lines
983
984 Repeated blank lines
985
986 Trailing spaces
987
988 Trailing blank lines
989 EOF
990 echo '-----BEGIN PGP SIGNATURE-----' >>expect
991 test_expect_success GPG \
992         'extra blanks in the message for a signed tag should be removed' '
993         git tag -s -F sigblanksfile blanks-signed-tag &&
994         get_tag_msg blanks-signed-tag >actual &&
995         test_cmp expect actual &&
996         git tag -v blanks-signed-tag
997 '
998
999 get_tag_header blank-signed-tag $commit commit $time >expect
1000 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1001 test_expect_success GPG \
1002         'creating a signed tag with a blank -m message should succeed' '
1003         git tag -s -m "     " blank-signed-tag &&
1004         get_tag_msg blank-signed-tag >actual &&
1005         test_cmp expect actual &&
1006         git tag -v blank-signed-tag
1007 '
1008
1009 echo '     ' >sigblankfile
1010 echo ''      >>sigblankfile
1011 echo '  '    >>sigblankfile
1012 get_tag_header blankfile-signed-tag $commit commit $time >expect
1013 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1014 test_expect_success GPG \
1015         'creating a signed tag with blank -F file with spaces should succeed' '
1016         git tag -s -F sigblankfile blankfile-signed-tag &&
1017         get_tag_msg blankfile-signed-tag >actual &&
1018         test_cmp expect actual &&
1019         git tag -v blankfile-signed-tag
1020 '
1021
1022 printf '      ' >sigblanknonlfile
1023 get_tag_header blanknonlfile-signed-tag $commit commit $time >expect
1024 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1025 test_expect_success GPG \
1026         'creating a signed tag with spaces and no newline should succeed' '
1027         git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&
1028         get_tag_msg blanknonlfile-signed-tag >actual &&
1029         test_cmp expect actual &&
1030         git tag -v signed-tag
1031 '
1032
1033 # messages with commented lines for signed tags:
1034
1035 cat >sigcommentsfile <<EOF
1036 # A comment
1037
1038 ############
1039 The message.
1040 ############
1041 One line.
1042
1043
1044 # commented lines
1045 # commented lines
1046
1047 Another line.
1048 # comments
1049
1050 Last line.
1051 EOF
1052 get_tag_header comments-signed-tag $commit commit $time >expect
1053 cat >>expect <<EOF
1054 The message.
1055 One line.
1056
1057 Another line.
1058
1059 Last line.
1060 EOF
1061 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1062 test_expect_success GPG \
1063         'creating a signed tag with a -F file with #comments should succeed' '
1064         git tag -s -F sigcommentsfile comments-signed-tag &&
1065         get_tag_msg comments-signed-tag >actual &&
1066         test_cmp expect actual &&
1067         git tag -v comments-signed-tag
1068 '
1069
1070 get_tag_header comment-signed-tag $commit commit $time >expect
1071 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1072 test_expect_success GPG \
1073         'creating a signed tag with #commented -m message should succeed' '
1074         git tag -s -m "#comment" comment-signed-tag &&
1075         get_tag_msg comment-signed-tag >actual &&
1076         test_cmp expect actual &&
1077         git tag -v comment-signed-tag
1078 '
1079
1080 echo '#comment' >sigcommentfile
1081 echo ''         >>sigcommentfile
1082 echo '####'     >>sigcommentfile
1083 get_tag_header commentfile-signed-tag $commit commit $time >expect
1084 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1085 test_expect_success GPG \
1086         'creating a signed tag with #commented -F messagefile should succeed' '
1087         git tag -s -F sigcommentfile commentfile-signed-tag &&
1088         get_tag_msg commentfile-signed-tag >actual &&
1089         test_cmp expect actual &&
1090         git tag -v commentfile-signed-tag
1091 '
1092
1093 printf '#comment' >sigcommentnonlfile
1094 get_tag_header commentnonlfile-signed-tag $commit commit $time >expect
1095 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1096 test_expect_success GPG \
1097         'creating a signed tag with a #comment and no newline should succeed' '
1098         git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&
1099         get_tag_msg commentnonlfile-signed-tag >actual &&
1100         test_cmp expect actual &&
1101         git tag -v commentnonlfile-signed-tag
1102 '
1103
1104 # listing messages for signed tags:
1105
1106 test_expect_success GPG \
1107         'listing the one-line message of a signed tag should succeed' '
1108         git tag -s -m "A message line signed" stag-one-line &&
1109
1110         echo "stag-one-line" >expect &&
1111         git tag -l | grep "^stag-one-line" >actual &&
1112         test_cmp expect actual &&
1113         git tag -n0 -l | grep "^stag-one-line" >actual &&
1114         test_cmp expect actual &&
1115         git tag -n0 -l stag-one-line >actual &&
1116         test_cmp expect actual &&
1117
1118         echo "stag-one-line   A message line signed" >expect &&
1119         git tag -n1 -l | grep "^stag-one-line" >actual &&
1120         test_cmp expect actual &&
1121         git tag -n -l | grep "^stag-one-line" >actual &&
1122         test_cmp expect actual &&
1123         git tag -n1 -l stag-one-line >actual &&
1124         test_cmp expect actual &&
1125         git tag -n2 -l stag-one-line >actual &&
1126         test_cmp expect actual &&
1127         git tag -n999 -l stag-one-line >actual &&
1128         test_cmp expect actual
1129 '
1130
1131 test_expect_success GPG \
1132         'listing the zero-lines message of a signed tag should succeed' '
1133         git tag -s -m "" stag-zero-lines &&
1134
1135         echo "stag-zero-lines" >expect &&
1136         git tag -l | grep "^stag-zero-lines" >actual &&
1137         test_cmp expect actual &&
1138         git tag -n0 -l | grep "^stag-zero-lines" >actual &&
1139         test_cmp expect actual &&
1140         git tag -n0 -l stag-zero-lines >actual &&
1141         test_cmp expect actual &&
1142
1143         echo "stag-zero-lines " >expect &&
1144         git tag -n1 -l | grep "^stag-zero-lines" >actual &&
1145         test_cmp expect actual &&
1146         git tag -n -l | grep "^stag-zero-lines" >actual &&
1147         test_cmp expect actual &&
1148         git tag -n1 -l stag-zero-lines >actual &&
1149         test_cmp expect actual &&
1150         git tag -n2 -l stag-zero-lines >actual &&
1151         test_cmp expect actual &&
1152         git tag -n999 -l stag-zero-lines >actual &&
1153         test_cmp expect actual
1154 '
1155
1156 echo 'stag line one' >sigtagmsg
1157 echo 'stag line two' >>sigtagmsg
1158 echo 'stag line three' >>sigtagmsg
1159 test_expect_success GPG \
1160         'listing many message lines of a signed tag should succeed' '
1161         git tag -s -F sigtagmsg stag-lines &&
1162
1163         echo "stag-lines" >expect &&
1164         git tag -l | grep "^stag-lines" >actual &&
1165         test_cmp expect actual &&
1166         git tag -n0 -l | grep "^stag-lines" >actual &&
1167         test_cmp expect actual &&
1168         git tag -n0 -l stag-lines >actual &&
1169         test_cmp expect actual &&
1170
1171         echo "stag-lines      stag line one" >expect &&
1172         git tag -n1 -l | grep "^stag-lines" >actual &&
1173         test_cmp expect actual &&
1174         git tag -n -l | grep "^stag-lines" >actual &&
1175         test_cmp expect actual &&
1176         git tag -n1 -l stag-lines >actual &&
1177         test_cmp expect actual &&
1178
1179         echo "    stag line two" >>expect &&
1180         git tag -n2 -l | grep "^ *stag.line" >actual &&
1181         test_cmp expect actual &&
1182         git tag -n2 -l stag-lines >actual &&
1183         test_cmp expect actual &&
1184
1185         echo "    stag line three" >>expect &&
1186         git tag -n3 -l | grep "^ *stag.line" >actual &&
1187         test_cmp expect actual &&
1188         git tag -n3 -l stag-lines >actual &&
1189         test_cmp expect actual &&
1190         git tag -n4 -l | grep "^ *stag.line" >actual &&
1191         test_cmp expect actual &&
1192         git tag -n4 -l stag-lines >actual &&
1193         test_cmp expect actual &&
1194         git tag -n99 -l | grep "^ *stag.line" >actual &&
1195         test_cmp expect actual &&
1196         git tag -n99 -l stag-lines >actual &&
1197         test_cmp expect actual
1198 '
1199
1200 # tags pointing to objects different from commits:
1201
1202 tree=$(git rev-parse HEAD^{tree})
1203 blob=$(git rev-parse HEAD:foo)
1204 tag=$(git rev-parse signed-tag 2>/dev/null)
1205
1206 get_tag_header tree-signed-tag $tree tree $time >expect
1207 echo "A message for a tree" >>expect
1208 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1209 test_expect_success GPG \
1210         'creating a signed tag pointing to a tree should succeed' '
1211         git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&
1212         get_tag_msg tree-signed-tag >actual &&
1213         test_cmp expect actual
1214 '
1215
1216 get_tag_header blob-signed-tag $blob blob $time >expect
1217 echo "A message for a blob" >>expect
1218 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1219 test_expect_success GPG \
1220         'creating a signed tag pointing to a blob should succeed' '
1221         git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&
1222         get_tag_msg blob-signed-tag >actual &&
1223         test_cmp expect actual
1224 '
1225
1226 get_tag_header tag-signed-tag $tag tag $time >expect
1227 echo "A message for another tag" >>expect
1228 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1229 test_expect_success GPG \
1230         'creating a signed tag pointing to another tag should succeed' '
1231         git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&
1232         get_tag_msg tag-signed-tag >actual &&
1233         test_cmp expect actual
1234 '
1235
1236 # usage with rfc1991 signatures
1237 get_tag_header rfc1991-signed-tag $commit commit $time >expect
1238 echo "RFC1991 signed tag" >>expect
1239 echo '-----BEGIN PGP MESSAGE-----' >>expect
1240 test_expect_success GPG,RFC1991 \
1241         'creating a signed tag with rfc1991' '
1242         echo "rfc1991" >gpghome/gpg.conf &&
1243         git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit &&
1244         get_tag_msg rfc1991-signed-tag >actual &&
1245         test_cmp expect actual
1246 '
1247
1248 cat >fakeeditor <<'EOF'
1249 #!/bin/sh
1250 cp "$1" actual
1251 EOF
1252 chmod +x fakeeditor
1253
1254 test_expect_success GPG,RFC1991 \
1255         'reediting a signed tag body omits signature' '
1256         echo "rfc1991" >gpghome/gpg.conf &&
1257         echo "RFC1991 signed tag" >expect &&
1258         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1259         test_cmp expect actual
1260 '
1261
1262 test_expect_success GPG,RFC1991 \
1263         'verifying rfc1991 signature' '
1264         echo "rfc1991" >gpghome/gpg.conf &&
1265         git tag -v rfc1991-signed-tag
1266 '
1267
1268 test_expect_success GPG,RFC1991 \
1269         'list tag with rfc1991 signature' '
1270         echo "rfc1991" >gpghome/gpg.conf &&
1271         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1272         git tag -l -n1 rfc1991-signed-tag >actual &&
1273         test_cmp expect actual &&
1274         git tag -l -n2 rfc1991-signed-tag >actual &&
1275         test_cmp expect actual &&
1276         git tag -l -n999 rfc1991-signed-tag >actual &&
1277         test_cmp expect actual
1278 '
1279
1280 rm -f gpghome/gpg.conf
1281
1282 test_expect_success GPG,RFC1991 \
1283         'verifying rfc1991 signature without --rfc1991' '
1284         git tag -v rfc1991-signed-tag
1285 '
1286
1287 test_expect_success GPG,RFC1991 \
1288         'list tag with rfc1991 signature without --rfc1991' '
1289         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1290         git tag -l -n1 rfc1991-signed-tag >actual &&
1291         test_cmp expect actual &&
1292         git tag -l -n2 rfc1991-signed-tag >actual &&
1293         test_cmp expect actual &&
1294         git tag -l -n999 rfc1991-signed-tag >actual &&
1295         test_cmp expect actual
1296 '
1297
1298 test_expect_success GPG,RFC1991 \
1299         'reediting a signed tag body omits signature' '
1300         echo "RFC1991 signed tag" >expect &&
1301         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1302         test_cmp expect actual
1303 '
1304
1305 # try to sign with bad user.signingkey
1306 test_expect_success GPG \
1307         'git tag -s fails if gpg is misconfigured (bad key)' \
1308         'test_config user.signingkey BobTheMouse &&
1309         test_must_fail git tag -s -m tail tag-gpg-failure'
1310
1311 # try to produce invalid signature
1312 test_expect_success GPG \
1313         'git tag -s fails if gpg is misconfigured (bad signature format)' \
1314         'test_config gpg.program echo &&
1315          test_must_fail git tag -s -m tail tag-gpg-failure'
1316
1317
1318 # try to verify without gpg:
1319
1320 rm -rf gpghome
1321 test_expect_success GPG \
1322         'verify signed tag fails when public key is not present' \
1323         'test_must_fail git tag -v signed-tag'
1324
1325 test_expect_success \
1326         'git tag -a fails if tag annotation is empty' '
1327         ! (GIT_EDITOR=cat git tag -a initial-comment)
1328 '
1329
1330 test_expect_success \
1331         'message in editor has initial comment' '
1332         ! (GIT_EDITOR=cat git tag -a initial-comment > actual)
1333 '
1334
1335 test_expect_success 'message in editor has initial comment: first line' '
1336         # check the first line --- should be empty
1337         echo >first.expect &&
1338         sed -e 1q <actual >first.actual &&
1339         test_i18ncmp first.expect first.actual
1340 '
1341
1342 test_expect_success \
1343         'message in editor has initial comment: remainder' '
1344         # remove commented lines from the remainder -- should be empty
1345         >rest.expect &&
1346         sed -e 1d -e "/^#/d" <actual >rest.actual &&
1347         test_cmp rest.expect rest.actual
1348 '
1349
1350 get_tag_header reuse $commit commit $time >expect
1351 echo "An annotation to be reused" >> expect
1352 test_expect_success \
1353         'overwriting an annoted tag should use its previous body' '
1354         git tag -a -m "An annotation to be reused" reuse &&
1355         GIT_EDITOR=true git tag -f -a reuse &&
1356         get_tag_msg reuse >actual &&
1357         test_cmp expect actual
1358 '
1359
1360 test_expect_success 'filename for the message is relative to cwd' '
1361         mkdir subdir &&
1362         echo "Tag message in top directory" >msgfile-5 &&
1363         echo "Tag message in sub directory" >subdir/msgfile-5 &&
1364         (
1365                 cd subdir &&
1366                 git tag -a -F msgfile-5 tag-from-subdir
1367         ) &&
1368         git cat-file tag tag-from-subdir | grep "in sub directory"
1369 '
1370
1371 test_expect_success 'filename for the message is relative to cwd' '
1372         echo "Tag message in sub directory" >subdir/msgfile-6 &&
1373         (
1374                 cd subdir &&
1375                 git tag -a -F msgfile-6 tag-from-subdir-2
1376         ) &&
1377         git cat-file tag tag-from-subdir-2 | grep "in sub directory"
1378 '
1379
1380 # create a few more commits to test --contains
1381
1382 hash1=$(git rev-parse HEAD)
1383
1384 test_expect_success 'creating second commit and tag' '
1385         echo foo-2.0 >foo &&
1386         git add foo &&
1387         git commit -m second &&
1388         git tag v2.0
1389 '
1390
1391 hash2=$(git rev-parse HEAD)
1392
1393 test_expect_success 'creating third commit without tag' '
1394         echo foo-dev >foo &&
1395         git add foo &&
1396         git commit -m third
1397 '
1398
1399 hash3=$(git rev-parse HEAD)
1400
1401 # simple linear checks of --continue
1402
1403 cat > expected <<EOF
1404 v0.2.1
1405 v1.0
1406 v1.0.1
1407 v1.1.3
1408 v2.0
1409 EOF
1410
1411 test_expect_success 'checking that first commit is in all tags (hash)' "
1412         git tag -l --contains $hash1 v* >actual &&
1413         test_cmp expected actual
1414 "
1415
1416 # other ways of specifying the commit
1417 test_expect_success 'checking that first commit is in all tags (tag)' "
1418         git tag -l --contains v1.0 v* >actual &&
1419         test_cmp expected actual
1420 "
1421
1422 test_expect_success 'checking that first commit is in all tags (relative)' "
1423         git tag -l --contains HEAD~2 v* >actual &&
1424         test_cmp expected actual
1425 "
1426
1427 # All the --contains tests above, but with --no-contains
1428 test_expect_success 'checking that first commit is not listed in any tag with --no-contains  (hash)' "
1429         >expected &&
1430         git tag -l --no-contains $hash1 v* >actual &&
1431         test_cmp expected actual
1432 "
1433
1434 test_expect_success 'checking that first commit is in all tags (tag)' "
1435         git tag -l --no-contains v1.0 v* >actual &&
1436         test_cmp expected actual
1437 "
1438
1439 test_expect_success 'checking that first commit is in all tags (relative)' "
1440         git tag -l --no-contains HEAD~2 v* >actual &&
1441         test_cmp expected actual
1442 "
1443
1444 cat > expected <<EOF
1445 v2.0
1446 EOF
1447
1448 test_expect_success 'checking that second commit only has one tag' "
1449         git tag -l --contains $hash2 v* >actual &&
1450         test_cmp expected actual
1451 "
1452
1453 cat > expected <<EOF
1454 v0.2.1
1455 v1.0
1456 v1.0.1
1457 v1.1.3
1458 EOF
1459
1460 test_expect_success 'inverse of the last test, with --no-contains' "
1461         git tag -l --no-contains $hash2 v* >actual &&
1462         test_cmp expected actual
1463 "
1464
1465 cat > expected <<EOF
1466 EOF
1467
1468 test_expect_success 'checking that third commit has no tags' "
1469         git tag -l --contains $hash3 v* >actual &&
1470         test_cmp expected actual
1471 "
1472
1473 cat > expected <<EOF
1474 v0.2.1
1475 v1.0
1476 v1.0.1
1477 v1.1.3
1478 v2.0
1479 EOF
1480
1481 test_expect_success 'conversely --no-contains on the third commit lists all tags' "
1482         git tag -l --no-contains $hash3 v* >actual &&
1483         test_cmp expected actual
1484 "
1485
1486 # how about a simple merge?
1487
1488 test_expect_success 'creating simple branch' '
1489         git branch stable v2.0 &&
1490         git checkout stable &&
1491         echo foo-3.0 > foo &&
1492         git commit foo -m fourth &&
1493         git tag v3.0
1494 '
1495
1496 hash4=$(git rev-parse HEAD)
1497
1498 cat > expected <<EOF
1499 v3.0
1500 EOF
1501
1502 test_expect_success 'checking that branch head only has one tag' "
1503         git tag -l --contains $hash4 v* >actual &&
1504         test_cmp expected actual
1505 "
1506
1507 cat > expected <<EOF
1508 v0.2.1
1509 v1.0
1510 v1.0.1
1511 v1.1.3
1512 v2.0
1513 EOF
1514
1515 test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
1516         git tag -l --no-contains $hash4 v* >actual &&
1517         test_cmp expected actual
1518 "
1519
1520 test_expect_success 'merging original branch into this branch' '
1521         git merge --strategy=ours master &&
1522         git tag v4.0
1523 '
1524
1525 cat > expected <<EOF
1526 v4.0
1527 EOF
1528
1529 test_expect_success 'checking that original branch head has one tag now' "
1530         git tag -l --contains $hash3 v* >actual &&
1531         test_cmp expected actual
1532 "
1533
1534 cat > expected <<EOF
1535 v0.2.1
1536 v1.0
1537 v1.0.1
1538 v1.1.3
1539 v2.0
1540 v3.0
1541 EOF
1542
1543 test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
1544         git tag -l --no-contains $hash3 v* >actual &&
1545         test_cmp expected actual
1546 "
1547
1548 cat > expected <<EOF
1549 v0.2.1
1550 v1.0
1551 v1.0.1
1552 v1.1.3
1553 v2.0
1554 v3.0
1555 v4.0
1556 EOF
1557
1558 test_expect_success 'checking that initial commit is in all tags' "
1559         git tag -l --contains $hash1 v* >actual &&
1560         test_cmp expected actual
1561 "
1562
1563 test_expect_success 'checking that --contains can be used in non-list mode' '
1564         git tag --contains $hash1 v* >actual &&
1565         test_cmp expected actual
1566 '
1567
1568 test_expect_success 'checking that initial commit is in all tags with --no-contains' "
1569         >expected &&
1570         git tag -l --no-contains $hash1 v* >actual &&
1571         test_cmp expected actual
1572 "
1573
1574 # mixing modes and options:
1575
1576 test_expect_success 'mixing incompatibles modes and options is forbidden' '
1577         test_must_fail git tag -a &&
1578         test_must_fail git tag -a -l &&
1579         test_must_fail git tag -s &&
1580         test_must_fail git tag -s -l &&
1581         test_must_fail git tag -m &&
1582         test_must_fail git tag -m -l &&
1583         test_must_fail git tag -m "hlagh" &&
1584         test_must_fail git tag -m "hlagh" -l &&
1585         test_must_fail git tag -F &&
1586         test_must_fail git tag -F -l &&
1587         test_must_fail git tag -f &&
1588         test_must_fail git tag -f -l &&
1589         test_must_fail git tag -a -s -m -F &&
1590         test_must_fail git tag -a -s -m -F -l &&
1591         test_must_fail git tag -l -v &&
1592         test_must_fail git tag -l -d &&
1593         test_must_fail git tag -l -v -d &&
1594         test_must_fail git tag -n 100 -v &&
1595         test_must_fail git tag -l -m msg &&
1596         test_must_fail git tag -l -F some file &&
1597         test_must_fail git tag -v -s &&
1598         test_must_fail git tag --contains tag-tree &&
1599         test_must_fail git tag --contains tag-blob &&
1600         test_must_fail git tag --no-contains tag-tree &&
1601         test_must_fail git tag --no-contains tag-blob &&
1602         test_must_fail git tag --contains --no-contains &&
1603         test_must_fail git tag --no-with HEAD &&
1604         test_must_fail git tag --no-without HEAD
1605 '
1606
1607 for option in --contains --with --no-contains --without --merged --no-merged --points-at
1608 do
1609         test_expect_success "mixing incompatible modes with $option is forbidden" "
1610                 test_must_fail git tag -d $option HEAD &&
1611                 test_must_fail git tag -d $option HEAD some-tag &&
1612                 test_must_fail git tag -v $option HEAD
1613         "
1614         test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
1615                 git tag -n $option HEAD HEAD &&
1616                 git tag $option HEAD HEAD &&
1617                 git tag $option
1618         "
1619 done
1620
1621 # check points-at
1622
1623 test_expect_success '--points-at can be used in non-list mode' '
1624         echo v4.0 >expect &&
1625         git tag --points-at=v4.0 "v*" >actual &&
1626         test_cmp expect actual
1627 '
1628
1629 test_expect_success '--points-at is a synonym for --points-at HEAD' '
1630         echo v4.0 >expect &&
1631         git tag --points-at >actual &&
1632         test_cmp expect actual
1633 '
1634
1635 test_expect_success '--points-at finds lightweight tags' '
1636         echo v4.0 >expect &&
1637         git tag --points-at v4.0 >actual &&
1638         test_cmp expect actual
1639 '
1640
1641 test_expect_success '--points-at finds annotated tags of commits' '
1642         git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&
1643         echo annotated-v4.0 >expect &&
1644         git tag -l --points-at v4.0 "annotated*" >actual &&
1645         test_cmp expect actual
1646 '
1647
1648 test_expect_success '--points-at finds annotated tags of tags' '
1649         git tag -m "describing the v4.0 tag object" \
1650                 annotated-again-v4.0 annotated-v4.0 &&
1651         cat >expect <<-\EOF &&
1652         annotated-again-v4.0
1653         annotated-v4.0
1654         EOF
1655         git tag --points-at=annotated-v4.0 >actual &&
1656         test_cmp expect actual
1657 '
1658
1659 test_expect_success 'multiple --points-at are OR-ed together' '
1660         cat >expect <<-\EOF &&
1661         v2.0
1662         v3.0
1663         EOF
1664         git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1665         test_cmp expect actual
1666 '
1667
1668 test_expect_success 'lexical sort' '
1669         git tag foo1.3 &&
1670         git tag foo1.6 &&
1671         git tag foo1.10 &&
1672         git tag -l --sort=refname "foo*" >actual &&
1673         cat >expect <<-\EOF &&
1674         foo1.10
1675         foo1.3
1676         foo1.6
1677         EOF
1678         test_cmp expect actual
1679 '
1680
1681 test_expect_success 'version sort' '
1682         git tag -l --sort=version:refname "foo*" >actual &&
1683         cat >expect <<-\EOF &&
1684         foo1.3
1685         foo1.6
1686         foo1.10
1687         EOF
1688         test_cmp expect actual
1689 '
1690
1691 test_expect_success 'reverse version sort' '
1692         git tag -l --sort=-version:refname "foo*" >actual &&
1693         cat >expect <<-\EOF &&
1694         foo1.10
1695         foo1.6
1696         foo1.3
1697         EOF
1698         test_cmp expect actual
1699 '
1700
1701 test_expect_success 'reverse lexical sort' '
1702         git tag -l --sort=-refname "foo*" >actual &&
1703         cat >expect <<-\EOF &&
1704         foo1.6
1705         foo1.3
1706         foo1.10
1707         EOF
1708         test_cmp expect actual
1709 '
1710
1711 test_expect_success 'configured lexical sort' '
1712         test_config tag.sort "v:refname" &&
1713         git tag -l "foo*" >actual &&
1714         cat >expect <<-\EOF &&
1715         foo1.3
1716         foo1.6
1717         foo1.10
1718         EOF
1719         test_cmp expect actual
1720 '
1721
1722 test_expect_success 'option override configured sort' '
1723         test_config tag.sort "v:refname" &&
1724         git tag -l --sort=-refname "foo*" >actual &&
1725         cat >expect <<-\EOF &&
1726         foo1.6
1727         foo1.3
1728         foo1.10
1729         EOF
1730         test_cmp expect actual
1731 '
1732
1733 test_expect_success 'invalid sort parameter on command line' '
1734         test_must_fail git tag -l --sort=notvalid "foo*" >actual
1735 '
1736
1737 test_expect_success 'invalid sort parameter in configuratoin' '
1738         test_config tag.sort "v:notvalid" &&
1739         test_must_fail git tag -l "foo*"
1740 '
1741
1742 test_expect_success 'version sort with prerelease reordering' '
1743         test_config versionsort.prereleaseSuffix -rc &&
1744         git tag foo1.6-rc1 &&
1745         git tag foo1.6-rc2 &&
1746         git tag -l --sort=version:refname "foo*" >actual &&
1747         cat >expect <<-\EOF &&
1748         foo1.3
1749         foo1.6-rc1
1750         foo1.6-rc2
1751         foo1.6
1752         foo1.10
1753         EOF
1754         test_cmp expect actual
1755 '
1756
1757 test_expect_success 'reverse version sort with prerelease reordering' '
1758         test_config versionsort.prereleaseSuffix -rc &&
1759         git tag -l --sort=-version:refname "foo*" >actual &&
1760         cat >expect <<-\EOF &&
1761         foo1.10
1762         foo1.6
1763         foo1.6-rc2
1764         foo1.6-rc1
1765         foo1.3
1766         EOF
1767         test_cmp expect actual
1768 '
1769
1770 test_expect_success 'version sort with prerelease reordering and common leading character' '
1771         test_config versionsort.prereleaseSuffix -before &&
1772         git tag foo1.7-before1 &&
1773         git tag foo1.7 &&
1774         git tag foo1.7-after1 &&
1775         git tag -l --sort=version:refname "foo1.7*" >actual &&
1776         cat >expect <<-\EOF &&
1777         foo1.7-before1
1778         foo1.7
1779         foo1.7-after1
1780         EOF
1781         test_cmp expect actual
1782 '
1783
1784 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1785         test_config versionsort.prereleaseSuffix -before &&
1786         git config --add versionsort.prereleaseSuffix -after &&
1787         git tag -l --sort=version:refname "foo1.7*" >actual &&
1788         cat >expect <<-\EOF &&
1789         foo1.7-before1
1790         foo1.7-after1
1791         foo1.7
1792         EOF
1793         test_cmp expect actual
1794 '
1795
1796 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1797         test_config versionsort.prereleaseSuffix -bar &&
1798         git config --add versionsort.prereleaseSuffix -foo-baz &&
1799         git config --add versionsort.prereleaseSuffix -foo-bar &&
1800         git tag foo1.8-foo-bar &&
1801         git tag foo1.8-foo-baz &&
1802         git tag foo1.8 &&
1803         git tag -l --sort=version:refname "foo1.8*" >actual &&
1804         cat >expect <<-\EOF &&
1805         foo1.8-foo-baz
1806         foo1.8-foo-bar
1807         foo1.8
1808         EOF
1809         test_cmp expect actual
1810 '
1811
1812 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1813         test_config versionsort.prereleaseSuffix -pre &&
1814         git config --add versionsort.prereleaseSuffix -prerelease &&
1815         git tag foo1.9-pre1 &&
1816         git tag foo1.9-pre2 &&
1817         git tag foo1.9-prerelease1 &&
1818         git tag -l --sort=version:refname "foo1.9*" >actual &&
1819         cat >expect <<-\EOF &&
1820         foo1.9-pre1
1821         foo1.9-pre2
1822         foo1.9-prerelease1
1823         EOF
1824         test_cmp expect actual
1825 '
1826
1827 test_expect_success 'version sort with general suffix reordering' '
1828         test_config versionsort.suffix -alpha &&
1829         git config --add versionsort.suffix -beta &&
1830         git config --add versionsort.suffix ""  &&
1831         git config --add versionsort.suffix -gamma &&
1832         git config --add versionsort.suffix -delta &&
1833         git tag foo1.10-alpha &&
1834         git tag foo1.10-beta &&
1835         git tag foo1.10-gamma &&
1836         git tag foo1.10-delta &&
1837         git tag foo1.10-unlisted-suffix &&
1838         git tag -l --sort=version:refname "foo1.10*" >actual &&
1839         cat >expect <<-\EOF &&
1840         foo1.10-alpha
1841         foo1.10-beta
1842         foo1.10
1843         foo1.10-unlisted-suffix
1844         foo1.10-gamma
1845         foo1.10-delta
1846         EOF
1847         test_cmp expect actual
1848 '
1849
1850 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1851         test_config versionsort.suffix -before &&
1852         test_config versionsort.prereleaseSuffix -after &&
1853         git tag -l --sort=version:refname "foo1.7*" >actual &&
1854         cat >expect <<-\EOF &&
1855         foo1.7-before1
1856         foo1.7
1857         foo1.7-after1
1858         EOF
1859         test_cmp expect actual
1860 '
1861
1862 test_expect_success 'version sort with very long prerelease suffix' '
1863         test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1864         git tag -l --sort=version:refname
1865 '
1866
1867 run_with_limited_stack () {
1868         (ulimit -s 128 && "$@")
1869 }
1870
1871 test_lazy_prereq ULIMIT_STACK_SIZE 'run_with_limited_stack true'
1872
1873 # we require ulimit, this excludes Windows
1874 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1875         >expect &&
1876         i=1 &&
1877         while test $i -lt 8000
1878         do
1879                 echo "commit refs/heads/master
1880 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1881 data <<EOF
1882 commit #$i
1883 EOF"
1884                 test $i = 1 && echo "from refs/heads/master^0"
1885                 i=$(($i + 1))
1886         done | git fast-import &&
1887         git checkout master &&
1888         git tag far-far-away HEAD^ &&
1889         run_with_limited_stack git tag --contains HEAD >actual &&
1890         test_cmp expect actual &&
1891         run_with_limited_stack git tag --no-contains HEAD >actual &&
1892         test_line_count "-gt" 10 actual
1893 '
1894
1895 test_expect_success '--format should list tags as per format given' '
1896         cat >expect <<-\EOF &&
1897         refname : refs/tags/v1.0
1898         refname : refs/tags/v1.0.1
1899         refname : refs/tags/v1.1.3
1900         EOF
1901         git tag -l --format="refname : %(refname)" "v1*" >actual &&
1902         test_cmp expect actual
1903 '
1904
1905 test_expect_success 'setup --merged test tags' '
1906         git tag mergetest-1 HEAD~2 &&
1907         git tag mergetest-2 HEAD~1 &&
1908         git tag mergetest-3 HEAD
1909 '
1910
1911 test_expect_success '--merged can be used in non-list mode' '
1912         cat >expect <<-\EOF &&
1913         mergetest-1
1914         mergetest-2
1915         EOF
1916         git tag --merged=mergetest-2 "mergetest*" >actual &&
1917         test_cmp expect actual
1918 '
1919
1920 test_expect_success '--merged is incompatible with --no-merged' '
1921         test_must_fail git tag --merged HEAD --no-merged HEAD
1922 '
1923
1924 test_expect_success '--merged shows merged tags' '
1925         cat >expect <<-\EOF &&
1926         mergetest-1
1927         mergetest-2
1928         EOF
1929         git tag -l --merged=mergetest-2 mergetest-* >actual &&
1930         test_cmp expect actual
1931 '
1932
1933 test_expect_success '--no-merged show unmerged tags' '
1934         cat >expect <<-\EOF &&
1935         mergetest-3
1936         EOF
1937         git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
1938         test_cmp expect actual
1939 '
1940
1941 test_expect_success '--no-merged can be used in non-list mode' '
1942         git tag --no-merged=mergetest-2 mergetest-* >actual &&
1943         test_cmp expect actual
1944 '
1945
1946 test_expect_success 'ambiguous branch/tags not marked' '
1947         git tag ambiguous &&
1948         git branch ambiguous &&
1949         echo ambiguous >expect &&
1950         git tag -l ambiguous >actual &&
1951         test_cmp expect actual
1952 '
1953
1954 test_expect_success '--contains combined with --no-contains' '
1955         (
1956                 git init no-contains &&
1957                 cd no-contains &&
1958                 test_commit v0.1 &&
1959                 test_commit v0.2 &&
1960                 test_commit v0.3 &&
1961                 test_commit v0.4 &&
1962                 test_commit v0.5 &&
1963                 cat >expected <<-\EOF &&
1964                 v0.2
1965                 v0.3
1966                 v0.4
1967                 EOF
1968                 git tag --contains v0.2 --no-contains v0.5 >actual &&
1969                 test_cmp expected actual
1970         )
1971 '
1972
1973 # As the docs say, list tags which contain a specified *commit*. We
1974 # don't recurse down to tags for trees or blobs pointed to by *those*
1975 # commits.
1976 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
1977         cd no-contains &&
1978         blob=$(git rev-parse v0.3:v0.3.t) &&
1979         tree=$(git rev-parse v0.3^{tree}) &&
1980         git tag tag-blob $blob &&
1981         git tag tag-tree $tree &&
1982         git tag --contains v0.3 >actual &&
1983         cat >expected <<-\EOF &&
1984         v0.3
1985         v0.4
1986         v0.5
1987         EOF
1988         test_cmp expected actual &&
1989         git tag --no-contains v0.3 >actual &&
1990         cat >expected <<-\EOF &&
1991         v0.1
1992         v0.2
1993         EOF
1994         test_cmp expected actual
1995 '
1996
1997 test_done