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