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