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