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