]> git.ipfire.org Git - thirdparty/git.git/blob - t/t7004-tag.sh
sha1-file: split OBJECT_INFO_FOR_PREFETCH
[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 myhead &&
231 test_must_fail git tag -d mytag anothertag &&
232 ! tag_exists mytag &&
233 ! tag_exists myhead
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 echo "message file 2" >msgfile2 &&
521 ! tag_exists msgtag &&
522 test_must_fail git tag -m "message 1" -F msgfile1 msgtag &&
523 ! tag_exists msgtag &&
524 test_must_fail git tag -F msgfile1 -m "message 1" msgtag &&
525 ! tag_exists msgtag &&
526 test_must_fail git tag -m "message 1" -F msgfile1 \
527 -m "message 2" msgtag &&
528 ! tag_exists msgtag
529 '
530
531 # blank and empty messages:
532
533 get_tag_header empty-annotated-tag $commit commit $time >expect
534 test_expect_success \
535 'creating a tag with an empty -m message should succeed' '
536 git tag -m "" empty-annotated-tag &&
537 get_tag_msg empty-annotated-tag >actual &&
538 test_cmp expect actual
539 '
540
541 >emptyfile
542 get_tag_header emptyfile-annotated-tag $commit commit $time >expect
543 test_expect_success \
544 'creating a tag with an empty -F messagefile should succeed' '
545 git tag -F emptyfile emptyfile-annotated-tag &&
546 get_tag_msg emptyfile-annotated-tag >actual &&
547 test_cmp expect actual
548 '
549
550 printf '\n\n \n\t\nLeading blank lines\n' >blanksfile
551 printf '\n\t \t \nRepeated blank lines\n' >>blanksfile
552 printf '\n\n\nTrailing spaces \t \n' >>blanksfile
553 printf '\nTrailing blank lines\n\n\t \n\n' >>blanksfile
554 get_tag_header blanks-annotated-tag $commit commit $time >expect
555 cat >>expect <<EOF
556 Leading blank lines
557
558 Repeated blank lines
559
560 Trailing spaces
561
562 Trailing blank lines
563 EOF
564 test_expect_success \
565 'extra blanks in the message for an annotated tag should be removed' '
566 git tag -F blanksfile blanks-annotated-tag &&
567 get_tag_msg blanks-annotated-tag >actual &&
568 test_cmp expect actual
569 '
570
571 get_tag_header blank-annotated-tag $commit commit $time >expect
572 test_expect_success \
573 'creating a tag with blank -m message with spaces should succeed' '
574 git tag -m " " blank-annotated-tag &&
575 get_tag_msg blank-annotated-tag >actual &&
576 test_cmp expect actual
577 '
578
579 echo ' ' >blankfile
580 echo '' >>blankfile
581 echo ' ' >>blankfile
582 get_tag_header blankfile-annotated-tag $commit commit $time >expect
583 test_expect_success \
584 'creating a tag with blank -F messagefile with spaces should succeed' '
585 git tag -F blankfile blankfile-annotated-tag &&
586 get_tag_msg blankfile-annotated-tag >actual &&
587 test_cmp expect actual
588 '
589
590 printf ' ' >blanknonlfile
591 get_tag_header blanknonlfile-annotated-tag $commit commit $time >expect
592 test_expect_success \
593 'creating a tag with -F file of spaces and no newline should succeed' '
594 git tag -F blanknonlfile blanknonlfile-annotated-tag &&
595 get_tag_msg blanknonlfile-annotated-tag >actual &&
596 test_cmp expect actual
597 '
598
599 # messages with commented lines:
600
601 cat >commentsfile <<EOF
602 # A comment
603
604 ############
605 The message.
606 ############
607 One line.
608
609
610 # commented lines
611 # commented lines
612
613 Another line.
614 # comments
615
616 Last line.
617 EOF
618 get_tag_header comments-annotated-tag $commit commit $time >expect
619 cat >>expect <<EOF
620 The message.
621 One line.
622
623 Another line.
624
625 Last line.
626 EOF
627 test_expect_success \
628 'creating a tag using a -F messagefile with #comments should succeed' '
629 git tag -F commentsfile comments-annotated-tag &&
630 get_tag_msg comments-annotated-tag >actual &&
631 test_cmp expect actual
632 '
633
634 get_tag_header comment-annotated-tag $commit commit $time >expect
635 test_expect_success \
636 'creating a tag with a #comment in the -m message should succeed' '
637 git tag -m "#comment" comment-annotated-tag &&
638 get_tag_msg comment-annotated-tag >actual &&
639 test_cmp expect actual
640 '
641
642 echo '#comment' >commentfile
643 echo '' >>commentfile
644 echo '####' >>commentfile
645 get_tag_header commentfile-annotated-tag $commit commit $time >expect
646 test_expect_success \
647 'creating a tag with #comments in the -F messagefile should succeed' '
648 git tag -F commentfile commentfile-annotated-tag &&
649 get_tag_msg commentfile-annotated-tag >actual &&
650 test_cmp expect actual
651 '
652
653 printf '#comment' >commentnonlfile
654 get_tag_header commentnonlfile-annotated-tag $commit commit $time >expect
655 test_expect_success \
656 'creating a tag with a file of #comment and no newline should succeed' '
657 git tag -F commentnonlfile commentnonlfile-annotated-tag &&
658 get_tag_msg commentnonlfile-annotated-tag >actual &&
659 test_cmp expect actual
660 '
661
662 # listing messages for annotated non-signed tags:
663
664 test_expect_success \
665 'listing the one-line message of a non-signed tag should succeed' '
666 git tag -m "A msg" tag-one-line &&
667
668 echo "tag-one-line" >expect &&
669 git tag -l | grep "^tag-one-line" >actual &&
670 test_cmp expect actual &&
671 git tag -n0 -l | grep "^tag-one-line" >actual &&
672 test_cmp expect actual &&
673 git tag -n0 -l tag-one-line >actual &&
674 test_cmp expect actual &&
675
676 git tag -n0 | grep "^tag-one-line" >actual &&
677 test_cmp expect actual &&
678 git tag -n0 tag-one-line >actual &&
679 test_cmp expect actual &&
680
681 echo "tag-one-line A msg" >expect &&
682 git tag -n1 -l | grep "^tag-one-line" >actual &&
683 test_cmp expect actual &&
684 git tag -n -l | grep "^tag-one-line" >actual &&
685 test_cmp expect actual &&
686 git tag -n1 -l tag-one-line >actual &&
687 test_cmp expect actual &&
688 git tag -n2 -l tag-one-line >actual &&
689 test_cmp expect actual &&
690 git tag -n999 -l tag-one-line >actual &&
691 test_cmp expect actual
692 '
693
694 test_expect_success 'The -n 100 invocation means -n --list 100, not -n100' '
695 git tag -n 100 >actual &&
696 test_must_be_empty actual &&
697
698 git tag -m "A msg" 100 &&
699 echo "100 A msg" >expect &&
700 git tag -n 100 >actual &&
701 test_cmp expect actual
702 '
703
704 test_expect_success \
705 'listing the zero-lines message of a non-signed tag should succeed' '
706 git tag -m "" tag-zero-lines &&
707
708 echo "tag-zero-lines" >expect &&
709 git tag -l | grep "^tag-zero-lines" >actual &&
710 test_cmp expect actual &&
711 git tag -n0 -l | grep "^tag-zero-lines" >actual &&
712 test_cmp expect actual &&
713 git tag -n0 -l tag-zero-lines >actual &&
714 test_cmp expect actual &&
715
716 echo "tag-zero-lines " >expect &&
717 git tag -n1 -l | grep "^tag-zero-lines" >actual &&
718 test_cmp expect actual &&
719 git tag -n -l | grep "^tag-zero-lines" >actual &&
720 test_cmp expect actual &&
721 git tag -n1 -l tag-zero-lines >actual &&
722 test_cmp expect actual &&
723 git tag -n2 -l tag-zero-lines >actual &&
724 test_cmp expect actual &&
725 git tag -n999 -l tag-zero-lines >actual &&
726 test_cmp expect actual
727 '
728
729 echo 'tag line one' >annotagmsg
730 echo 'tag line two' >>annotagmsg
731 echo 'tag line three' >>annotagmsg
732 test_expect_success \
733 'listing many message lines of a non-signed tag should succeed' '
734 git tag -F annotagmsg tag-lines &&
735
736 echo "tag-lines" >expect &&
737 git tag -l | grep "^tag-lines" >actual &&
738 test_cmp expect actual &&
739 git tag -n0 -l | grep "^tag-lines" >actual &&
740 test_cmp expect actual &&
741 git tag -n0 -l tag-lines >actual &&
742 test_cmp expect actual &&
743
744 echo "tag-lines tag line one" >expect &&
745 git tag -n1 -l | grep "^tag-lines" >actual &&
746 test_cmp expect actual &&
747 git tag -n -l | grep "^tag-lines" >actual &&
748 test_cmp expect actual &&
749 git tag -n1 -l tag-lines >actual &&
750 test_cmp expect actual &&
751
752 echo " tag line two" >>expect &&
753 git tag -n2 -l | grep "^ *tag.line" >actual &&
754 test_cmp expect actual &&
755 git tag -n2 -l tag-lines >actual &&
756 test_cmp expect actual &&
757
758 echo " tag line three" >>expect &&
759 git tag -n3 -l | grep "^ *tag.line" >actual &&
760 test_cmp expect actual &&
761 git tag -n3 -l tag-lines >actual &&
762 test_cmp expect actual &&
763 git tag -n4 -l | grep "^ *tag.line" >actual &&
764 test_cmp expect actual &&
765 git tag -n4 -l tag-lines >actual &&
766 test_cmp expect actual &&
767 git tag -n99 -l | grep "^ *tag.line" >actual &&
768 test_cmp expect actual &&
769 git tag -n99 -l tag-lines >actual &&
770 test_cmp expect actual
771 '
772
773 test_expect_success 'annotations for blobs are empty' '
774 blob=$(git hash-object -w --stdin <<-\EOF
775 Blob paragraph 1.
776
777 Blob paragraph 2.
778 EOF
779 ) &&
780 git tag tag-blob $blob &&
781 echo "tag-blob " >expect &&
782 git tag -n1 -l tag-blob >actual &&
783 test_cmp expect actual
784 '
785
786 # trying to verify annotated non-signed tags:
787
788 test_expect_success GPG \
789 'trying to verify an annotated non-signed tag should fail' '
790 tag_exists annotated-tag &&
791 test_must_fail git tag -v annotated-tag
792 '
793
794 test_expect_success GPG \
795 'trying to verify a file-annotated non-signed tag should fail' '
796 tag_exists file-annotated-tag &&
797 test_must_fail git tag -v file-annotated-tag
798 '
799
800 test_expect_success GPG \
801 'trying to verify two annotated non-signed tags should fail' '
802 tag_exists annotated-tag file-annotated-tag &&
803 test_must_fail git tag -v annotated-tag file-annotated-tag
804 '
805
806 # creating and verifying signed tags:
807
808 get_tag_header signed-tag $commit commit $time >expect
809 echo 'A signed tag message' >>expect
810 echo '-----BEGIN PGP SIGNATURE-----' >>expect
811 test_expect_success GPG 'creating a signed tag with -m message should succeed' '
812 git tag -s -m "A signed tag message" signed-tag &&
813 get_tag_msg signed-tag >actual &&
814 test_cmp expect actual
815 '
816
817 get_tag_header u-signed-tag $commit commit $time >expect
818 echo 'Another message' >>expect
819 echo '-----BEGIN PGP SIGNATURE-----' >>expect
820 test_expect_success GPG 'sign with a given key id' '
821
822 git tag -u committer@example.com -m "Another message" u-signed-tag &&
823 get_tag_msg u-signed-tag >actual &&
824 test_cmp expect actual
825
826 '
827
828 test_expect_success GPG 'sign with an unknown id (1)' '
829
830 test_must_fail git tag -u author@example.com \
831 -m "Another message" o-signed-tag
832
833 '
834
835 test_expect_success GPG 'sign with an unknown id (2)' '
836
837 test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag
838
839 '
840
841 cat >fakeeditor <<'EOF'
842 #!/bin/sh
843 test -n "$1" && exec >"$1"
844 echo A signed tag message
845 echo from a fake editor.
846 EOF
847 chmod +x fakeeditor
848
849 get_tag_header implied-sign $commit commit $time >expect
850 ./fakeeditor >>expect
851 echo '-----BEGIN PGP SIGNATURE-----' >>expect
852 test_expect_success GPG '-u implies signed tag' '
853 GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign &&
854 get_tag_msg implied-sign >actual &&
855 test_cmp expect actual
856 '
857
858 cat >sigmsgfile <<EOF
859 Another signed tag
860 message in a file.
861 EOF
862 get_tag_header file-signed-tag $commit commit $time >expect
863 cat sigmsgfile >>expect
864 echo '-----BEGIN PGP SIGNATURE-----' >>expect
865 test_expect_success GPG \
866 'creating a signed tag with -F messagefile should succeed' '
867 git tag -s -F sigmsgfile file-signed-tag &&
868 get_tag_msg file-signed-tag >actual &&
869 test_cmp expect actual
870 '
871
872 cat >siginputmsg <<EOF
873 A signed tag message from
874 the standard input
875 EOF
876 get_tag_header stdin-signed-tag $commit commit $time >expect
877 cat siginputmsg >>expect
878 echo '-----BEGIN PGP SIGNATURE-----' >>expect
879 test_expect_success GPG 'creating a signed tag with -F - should succeed' '
880 git tag -s -F - stdin-signed-tag <siginputmsg &&
881 get_tag_msg stdin-signed-tag >actual &&
882 test_cmp expect actual
883 '
884
885 get_tag_header implied-annotate $commit commit $time >expect
886 ./fakeeditor >>expect
887 echo '-----BEGIN PGP SIGNATURE-----' >>expect
888 test_expect_success GPG '-s implies annotated tag' '
889 GIT_EDITOR=./fakeeditor git tag -s implied-annotate &&
890 get_tag_msg implied-annotate >actual &&
891 test_cmp expect actual
892 '
893
894 get_tag_header forcesignannotated-implied-sign $commit commit $time >expect
895 echo "A message" >>expect
896 echo '-----BEGIN PGP SIGNATURE-----' >>expect
897 test_expect_success GPG \
898 'git tag -s implied if configured with tag.forcesignannotated' \
899 'test_config tag.forcesignannotated true &&
900 git tag -m "A message" forcesignannotated-implied-sign &&
901 get_tag_msg forcesignannotated-implied-sign >actual &&
902 test_cmp expect actual
903 '
904
905 test_expect_success GPG \
906 'lightweight with no message when configured with tag.forcesignannotated' \
907 'test_config tag.forcesignannotated true &&
908 git tag forcesignannotated-lightweight &&
909 tag_exists forcesignannotated-lightweight &&
910 test_must_fail git tag -v forcesignannotated-no-message
911 '
912
913 get_tag_header forcesignannotated-annotate $commit commit $time >expect
914 echo "A message" >>expect
915 test_expect_success GPG \
916 'git tag -a disable configured tag.forcesignannotated' \
917 'test_config tag.forcesignannotated true &&
918 git tag -a -m "A message" forcesignannotated-annotate &&
919 get_tag_msg forcesignannotated-annotate >actual &&
920 test_cmp expect actual &&
921 test_must_fail git tag -v forcesignannotated-annotate
922 '
923
924 get_tag_header forcesignannotated-disabled $commit commit $time >expect
925 echo "A message" >>expect
926 echo '-----BEGIN PGP SIGNATURE-----' >>expect
927 test_expect_success GPG \
928 'git tag --sign enable GPG sign' \
929 'test_config tag.forcesignannotated false &&
930 git tag --sign -m "A message" forcesignannotated-disabled &&
931 get_tag_msg forcesignannotated-disabled >actual &&
932 test_cmp expect actual
933 '
934
935 test_expect_success GPG \
936 'trying to create a signed tag with non-existing -F file should fail' '
937 ! test -f nonexistingfile &&
938 ! tag_exists nosigtag &&
939 test_must_fail git tag -s -F nonexistingfile nosigtag &&
940 ! tag_exists nosigtag
941 '
942
943 test_expect_success GPG 'verifying a signed tag should succeed' \
944 'git tag -v signed-tag'
945
946 test_expect_success GPG 'verifying two signed tags in one command should succeed' \
947 'git tag -v signed-tag file-signed-tag'
948
949 test_expect_success GPG \
950 'verifying many signed and non-signed tags should fail' '
951 test_must_fail git tag -v signed-tag annotated-tag &&
952 test_must_fail git tag -v file-annotated-tag file-signed-tag &&
953 test_must_fail git tag -v annotated-tag \
954 file-signed-tag file-annotated-tag &&
955 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag
956 '
957
958 test_expect_success GPG 'verifying a forged tag should fail' '
959 forged=$(git cat-file tag signed-tag |
960 sed -e "s/signed-tag/forged-tag/" |
961 git mktag) &&
962 git tag forged-tag $forged &&
963 test_must_fail git tag -v forged-tag
964 '
965
966 test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly' '
967 cat >expect <<-\EOF &&
968 tagname : signed-tag
969 EOF
970 git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
971 test_cmp expect actual
972 '
973
974 test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
975 test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
976 test_must_be_empty actual
977 '
978
979 # blank and empty messages for signed tags:
980
981 get_tag_header empty-signed-tag $commit commit $time >expect
982 echo '-----BEGIN PGP SIGNATURE-----' >>expect
983 test_expect_success GPG \
984 'creating a signed tag with an empty -m message should succeed' '
985 git tag -s -m "" empty-signed-tag &&
986 get_tag_msg empty-signed-tag >actual &&
987 test_cmp expect actual &&
988 git tag -v empty-signed-tag
989 '
990
991 >sigemptyfile
992 get_tag_header emptyfile-signed-tag $commit commit $time >expect
993 echo '-----BEGIN PGP SIGNATURE-----' >>expect
994 test_expect_success GPG \
995 'creating a signed tag with an empty -F messagefile should succeed' '
996 git tag -s -F sigemptyfile emptyfile-signed-tag &&
997 get_tag_msg emptyfile-signed-tag >actual &&
998 test_cmp expect actual &&
999 git tag -v emptyfile-signed-tag
1000 '
1001
1002 printf '\n\n \n\t\nLeading blank lines\n' > sigblanksfile
1003 printf '\n\t \t \nRepeated blank lines\n' >>sigblanksfile
1004 printf '\n\n\nTrailing spaces \t \n' >>sigblanksfile
1005 printf '\nTrailing blank lines\n\n\t \n\n' >>sigblanksfile
1006 get_tag_header blanks-signed-tag $commit commit $time >expect
1007 cat >>expect <<EOF
1008 Leading blank lines
1009
1010 Repeated blank lines
1011
1012 Trailing spaces
1013
1014 Trailing blank lines
1015 EOF
1016 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1017 test_expect_success GPG \
1018 'extra blanks in the message for a signed tag should be removed' '
1019 git tag -s -F sigblanksfile blanks-signed-tag &&
1020 get_tag_msg blanks-signed-tag >actual &&
1021 test_cmp expect actual &&
1022 git tag -v blanks-signed-tag
1023 '
1024
1025 get_tag_header blank-signed-tag $commit commit $time >expect
1026 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1027 test_expect_success GPG \
1028 'creating a signed tag with a blank -m message should succeed' '
1029 git tag -s -m " " blank-signed-tag &&
1030 get_tag_msg blank-signed-tag >actual &&
1031 test_cmp expect actual &&
1032 git tag -v blank-signed-tag
1033 '
1034
1035 echo ' ' >sigblankfile
1036 echo '' >>sigblankfile
1037 echo ' ' >>sigblankfile
1038 get_tag_header blankfile-signed-tag $commit commit $time >expect
1039 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1040 test_expect_success GPG \
1041 'creating a signed tag with blank -F file with spaces should succeed' '
1042 git tag -s -F sigblankfile blankfile-signed-tag &&
1043 get_tag_msg blankfile-signed-tag >actual &&
1044 test_cmp expect actual &&
1045 git tag -v blankfile-signed-tag
1046 '
1047
1048 printf ' ' >sigblanknonlfile
1049 get_tag_header blanknonlfile-signed-tag $commit commit $time >expect
1050 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1051 test_expect_success GPG \
1052 'creating a signed tag with spaces and no newline should succeed' '
1053 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&
1054 get_tag_msg blanknonlfile-signed-tag >actual &&
1055 test_cmp expect actual &&
1056 git tag -v blanknonlfile-signed-tag
1057 '
1058
1059 test_expect_success GPG 'signed tag with embedded PGP message' '
1060 cat >msg <<-\EOF &&
1061 -----BEGIN PGP MESSAGE-----
1062
1063 this is not a real PGP message
1064 -----END PGP MESSAGE-----
1065 EOF
1066 git tag -s -F msg confusing-pgp-message &&
1067 git tag -v confusing-pgp-message
1068 '
1069
1070 # messages with commented lines for signed tags:
1071
1072 cat >sigcommentsfile <<EOF
1073 # A comment
1074
1075 ############
1076 The message.
1077 ############
1078 One line.
1079
1080
1081 # commented lines
1082 # commented lines
1083
1084 Another line.
1085 # comments
1086
1087 Last line.
1088 EOF
1089 get_tag_header comments-signed-tag $commit commit $time >expect
1090 cat >>expect <<EOF
1091 The message.
1092 One line.
1093
1094 Another line.
1095
1096 Last line.
1097 EOF
1098 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1099 test_expect_success GPG \
1100 'creating a signed tag with a -F file with #comments should succeed' '
1101 git tag -s -F sigcommentsfile comments-signed-tag &&
1102 get_tag_msg comments-signed-tag >actual &&
1103 test_cmp expect actual &&
1104 git tag -v comments-signed-tag
1105 '
1106
1107 get_tag_header comment-signed-tag $commit commit $time >expect
1108 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1109 test_expect_success GPG \
1110 'creating a signed tag with #commented -m message should succeed' '
1111 git tag -s -m "#comment" comment-signed-tag &&
1112 get_tag_msg comment-signed-tag >actual &&
1113 test_cmp expect actual &&
1114 git tag -v comment-signed-tag
1115 '
1116
1117 echo '#comment' >sigcommentfile
1118 echo '' >>sigcommentfile
1119 echo '####' >>sigcommentfile
1120 get_tag_header commentfile-signed-tag $commit commit $time >expect
1121 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1122 test_expect_success GPG \
1123 'creating a signed tag with #commented -F messagefile should succeed' '
1124 git tag -s -F sigcommentfile commentfile-signed-tag &&
1125 get_tag_msg commentfile-signed-tag >actual &&
1126 test_cmp expect actual &&
1127 git tag -v commentfile-signed-tag
1128 '
1129
1130 printf '#comment' >sigcommentnonlfile
1131 get_tag_header commentnonlfile-signed-tag $commit commit $time >expect
1132 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1133 test_expect_success GPG \
1134 'creating a signed tag with a #comment and no newline should succeed' '
1135 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&
1136 get_tag_msg commentnonlfile-signed-tag >actual &&
1137 test_cmp expect actual &&
1138 git tag -v commentnonlfile-signed-tag
1139 '
1140
1141 # listing messages for signed tags:
1142
1143 test_expect_success GPG \
1144 'listing the one-line message of a signed tag should succeed' '
1145 git tag -s -m "A message line signed" stag-one-line &&
1146
1147 echo "stag-one-line" >expect &&
1148 git tag -l | grep "^stag-one-line" >actual &&
1149 test_cmp expect actual &&
1150 git tag -n0 -l | grep "^stag-one-line" >actual &&
1151 test_cmp expect actual &&
1152 git tag -n0 -l stag-one-line >actual &&
1153 test_cmp expect actual &&
1154
1155 echo "stag-one-line A message line signed" >expect &&
1156 git tag -n1 -l | grep "^stag-one-line" >actual &&
1157 test_cmp expect actual &&
1158 git tag -n -l | grep "^stag-one-line" >actual &&
1159 test_cmp expect actual &&
1160 git tag -n1 -l stag-one-line >actual &&
1161 test_cmp expect actual &&
1162 git tag -n2 -l stag-one-line >actual &&
1163 test_cmp expect actual &&
1164 git tag -n999 -l stag-one-line >actual &&
1165 test_cmp expect actual
1166 '
1167
1168 test_expect_success GPG \
1169 'listing the zero-lines message of a signed tag should succeed' '
1170 git tag -s -m "" stag-zero-lines &&
1171
1172 echo "stag-zero-lines" >expect &&
1173 git tag -l | grep "^stag-zero-lines" >actual &&
1174 test_cmp expect actual &&
1175 git tag -n0 -l | grep "^stag-zero-lines" >actual &&
1176 test_cmp expect actual &&
1177 git tag -n0 -l stag-zero-lines >actual &&
1178 test_cmp expect actual &&
1179
1180 echo "stag-zero-lines " >expect &&
1181 git tag -n1 -l | grep "^stag-zero-lines" >actual &&
1182 test_cmp expect actual &&
1183 git tag -n -l | grep "^stag-zero-lines" >actual &&
1184 test_cmp expect actual &&
1185 git tag -n1 -l stag-zero-lines >actual &&
1186 test_cmp expect actual &&
1187 git tag -n2 -l stag-zero-lines >actual &&
1188 test_cmp expect actual &&
1189 git tag -n999 -l stag-zero-lines >actual &&
1190 test_cmp expect actual
1191 '
1192
1193 echo 'stag line one' >sigtagmsg
1194 echo 'stag line two' >>sigtagmsg
1195 echo 'stag line three' >>sigtagmsg
1196 test_expect_success GPG \
1197 'listing many message lines of a signed tag should succeed' '
1198 git tag -s -F sigtagmsg stag-lines &&
1199
1200 echo "stag-lines" >expect &&
1201 git tag -l | grep "^stag-lines" >actual &&
1202 test_cmp expect actual &&
1203 git tag -n0 -l | grep "^stag-lines" >actual &&
1204 test_cmp expect actual &&
1205 git tag -n0 -l stag-lines >actual &&
1206 test_cmp expect actual &&
1207
1208 echo "stag-lines stag line one" >expect &&
1209 git tag -n1 -l | grep "^stag-lines" >actual &&
1210 test_cmp expect actual &&
1211 git tag -n -l | grep "^stag-lines" >actual &&
1212 test_cmp expect actual &&
1213 git tag -n1 -l stag-lines >actual &&
1214 test_cmp expect actual &&
1215
1216 echo " stag line two" >>expect &&
1217 git tag -n2 -l | grep "^ *stag.line" >actual &&
1218 test_cmp expect actual &&
1219 git tag -n2 -l stag-lines >actual &&
1220 test_cmp expect actual &&
1221
1222 echo " stag line three" >>expect &&
1223 git tag -n3 -l | grep "^ *stag.line" >actual &&
1224 test_cmp expect actual &&
1225 git tag -n3 -l stag-lines >actual &&
1226 test_cmp expect actual &&
1227 git tag -n4 -l | grep "^ *stag.line" >actual &&
1228 test_cmp expect actual &&
1229 git tag -n4 -l stag-lines >actual &&
1230 test_cmp expect actual &&
1231 git tag -n99 -l | grep "^ *stag.line" >actual &&
1232 test_cmp expect actual &&
1233 git tag -n99 -l stag-lines >actual &&
1234 test_cmp expect actual
1235 '
1236
1237 # tags pointing to objects different from commits:
1238
1239 tree=$(git rev-parse HEAD^{tree})
1240 blob=$(git rev-parse HEAD:foo)
1241 tag=$(git rev-parse signed-tag 2>/dev/null)
1242
1243 get_tag_header tree-signed-tag $tree tree $time >expect
1244 echo "A message for a tree" >>expect
1245 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1246 test_expect_success GPG \
1247 'creating a signed tag pointing to a tree should succeed' '
1248 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&
1249 get_tag_msg tree-signed-tag >actual &&
1250 test_cmp expect actual
1251 '
1252
1253 get_tag_header blob-signed-tag $blob blob $time >expect
1254 echo "A message for a blob" >>expect
1255 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1256 test_expect_success GPG \
1257 'creating a signed tag pointing to a blob should succeed' '
1258 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&
1259 get_tag_msg blob-signed-tag >actual &&
1260 test_cmp expect actual
1261 '
1262
1263 get_tag_header tag-signed-tag $tag tag $time >expect
1264 echo "A message for another tag" >>expect
1265 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1266 test_expect_success GPG \
1267 'creating a signed tag pointing to another tag should succeed' '
1268 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&
1269 get_tag_msg tag-signed-tag >actual &&
1270 test_cmp expect actual
1271 '
1272
1273 # usage with rfc1991 signatures
1274 get_tag_header rfc1991-signed-tag $commit commit $time >expect
1275 echo "RFC1991 signed tag" >>expect
1276 echo '-----BEGIN PGP MESSAGE-----' >>expect
1277 test_expect_success GPG,RFC1991 \
1278 'creating a signed tag with rfc1991' '
1279 echo "rfc1991" >gpghome/gpg.conf &&
1280 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit &&
1281 get_tag_msg rfc1991-signed-tag >actual &&
1282 test_cmp expect actual
1283 '
1284
1285 cat >fakeeditor <<'EOF'
1286 #!/bin/sh
1287 cp "$1" actual
1288 EOF
1289 chmod +x fakeeditor
1290
1291 test_expect_success GPG,RFC1991 \
1292 'reediting a signed tag body omits signature' '
1293 echo "rfc1991" >gpghome/gpg.conf &&
1294 echo "RFC1991 signed tag" >expect &&
1295 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1296 test_cmp expect actual
1297 '
1298
1299 test_expect_success GPG,RFC1991 \
1300 'verifying rfc1991 signature' '
1301 echo "rfc1991" >gpghome/gpg.conf &&
1302 git tag -v rfc1991-signed-tag
1303 '
1304
1305 test_expect_success GPG,RFC1991 \
1306 'list tag with rfc1991 signature' '
1307 echo "rfc1991" >gpghome/gpg.conf &&
1308 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1309 git tag -l -n1 rfc1991-signed-tag >actual &&
1310 test_cmp expect actual &&
1311 git tag -l -n2 rfc1991-signed-tag >actual &&
1312 test_cmp expect actual &&
1313 git tag -l -n999 rfc1991-signed-tag >actual &&
1314 test_cmp expect actual
1315 '
1316
1317 rm -f gpghome/gpg.conf
1318
1319 test_expect_success GPG,RFC1991 \
1320 'verifying rfc1991 signature without --rfc1991' '
1321 git tag -v rfc1991-signed-tag
1322 '
1323
1324 test_expect_success GPG,RFC1991 \
1325 'list tag with rfc1991 signature without --rfc1991' '
1326 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1327 git tag -l -n1 rfc1991-signed-tag >actual &&
1328 test_cmp expect actual &&
1329 git tag -l -n2 rfc1991-signed-tag >actual &&
1330 test_cmp expect actual &&
1331 git tag -l -n999 rfc1991-signed-tag >actual &&
1332 test_cmp expect actual
1333 '
1334
1335 test_expect_success GPG,RFC1991 \
1336 'reediting a signed tag body omits signature' '
1337 echo "RFC1991 signed tag" >expect &&
1338 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1339 test_cmp expect actual
1340 '
1341
1342 # try to sign with bad user.signingkey
1343 test_expect_success GPG \
1344 'git tag -s fails if gpg is misconfigured (bad key)' \
1345 'test_config user.signingkey BobTheMouse &&
1346 test_must_fail git tag -s -m tail tag-gpg-failure'
1347
1348 # try to produce invalid signature
1349 test_expect_success GPG \
1350 'git tag -s fails if gpg is misconfigured (bad signature format)' \
1351 'test_config gpg.program echo &&
1352 test_must_fail git tag -s -m tail tag-gpg-failure'
1353
1354 # try to sign with bad user.signingkey
1355 test_expect_success GPGSM \
1356 'git tag -s fails if gpgsm is misconfigured (bad key)' \
1357 'test_config user.signingkey BobTheMouse &&
1358 test_config gpg.format x509 &&
1359 test_must_fail git tag -s -m tail tag-gpg-failure'
1360
1361 # try to produce invalid signature
1362 test_expect_success GPGSM \
1363 'git tag -s fails if gpgsm is misconfigured (bad signature format)' \
1364 'test_config gpg.x509.program echo &&
1365 test_config gpg.format x509 &&
1366 test_must_fail git tag -s -m tail tag-gpg-failure'
1367
1368 # try to verify without gpg:
1369
1370 rm -rf gpghome
1371 test_expect_success GPG \
1372 'verify signed tag fails when public key is not present' \
1373 'test_must_fail git tag -v signed-tag'
1374
1375 test_expect_success \
1376 'git tag -a fails if tag annotation is empty' '
1377 ! (GIT_EDITOR=cat git tag -a initial-comment)
1378 '
1379
1380 test_expect_success \
1381 'message in editor has initial comment' '
1382 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)
1383 '
1384
1385 test_expect_success 'message in editor has initial comment: first line' '
1386 # check the first line --- should be empty
1387 echo >first.expect &&
1388 sed -e 1q <actual >first.actual &&
1389 test_i18ncmp first.expect first.actual
1390 '
1391
1392 test_expect_success \
1393 'message in editor has initial comment: remainder' '
1394 # remove commented lines from the remainder -- should be empty
1395 sed -e 1d -e "/^#/d" <actual >rest.actual &&
1396 test_must_be_empty rest.actual
1397 '
1398
1399 get_tag_header reuse $commit commit $time >expect
1400 echo "An annotation to be reused" >> expect
1401 test_expect_success \
1402 'overwriting an annoted tag should use its previous body' '
1403 git tag -a -m "An annotation to be reused" reuse &&
1404 GIT_EDITOR=true git tag -f -a reuse &&
1405 get_tag_msg reuse >actual &&
1406 test_cmp expect actual
1407 '
1408
1409 test_expect_success 'filename for the message is relative to cwd' '
1410 mkdir subdir &&
1411 echo "Tag message in top directory" >msgfile-5 &&
1412 echo "Tag message in sub directory" >subdir/msgfile-5 &&
1413 (
1414 cd subdir &&
1415 git tag -a -F msgfile-5 tag-from-subdir
1416 ) &&
1417 git cat-file tag tag-from-subdir | grep "in sub directory"
1418 '
1419
1420 test_expect_success 'filename for the message is relative to cwd' '
1421 echo "Tag message in sub directory" >subdir/msgfile-6 &&
1422 (
1423 cd subdir &&
1424 git tag -a -F msgfile-6 tag-from-subdir-2
1425 ) &&
1426 git cat-file tag tag-from-subdir-2 | grep "in sub directory"
1427 '
1428
1429 # create a few more commits to test --contains
1430
1431 hash1=$(git rev-parse HEAD)
1432
1433 test_expect_success 'creating second commit and tag' '
1434 echo foo-2.0 >foo &&
1435 git add foo &&
1436 git commit -m second &&
1437 git tag v2.0
1438 '
1439
1440 hash2=$(git rev-parse HEAD)
1441
1442 test_expect_success 'creating third commit without tag' '
1443 echo foo-dev >foo &&
1444 git add foo &&
1445 git commit -m third
1446 '
1447
1448 hash3=$(git rev-parse HEAD)
1449
1450 # simple linear checks of --continue
1451
1452 cat > expected <<EOF
1453 v0.2.1
1454 v1.0
1455 v1.0.1
1456 v1.1.3
1457 v2.0
1458 EOF
1459
1460 test_expect_success 'checking that first commit is in all tags (hash)' "
1461 git tag -l --contains $hash1 v* >actual &&
1462 test_cmp expected actual
1463 "
1464
1465 # other ways of specifying the commit
1466 test_expect_success 'checking that first commit is in all tags (tag)' "
1467 git tag -l --contains v1.0 v* >actual &&
1468 test_cmp expected actual
1469 "
1470
1471 test_expect_success 'checking that first commit is in all tags (relative)' "
1472 git tag -l --contains HEAD~2 v* >actual &&
1473 test_cmp expected actual
1474 "
1475
1476 # All the --contains tests above, but with --no-contains
1477 test_expect_success 'checking that first commit is not listed in any tag with --no-contains (hash)' "
1478 git tag -l --no-contains $hash1 v* >actual &&
1479 test_must_be_empty actual
1480 "
1481
1482 test_expect_success 'checking that first commit is in all tags (tag)' "
1483 git tag -l --no-contains v1.0 v* >actual &&
1484 test_must_be_empty actual
1485 "
1486
1487 test_expect_success 'checking that first commit is in all tags (relative)' "
1488 git tag -l --no-contains HEAD~2 v* >actual &&
1489 test_must_be_empty actual
1490 "
1491
1492 cat > expected <<EOF
1493 v2.0
1494 EOF
1495
1496 test_expect_success 'checking that second commit only has one tag' "
1497 git tag -l --contains $hash2 v* >actual &&
1498 test_cmp expected actual
1499 "
1500
1501 cat > expected <<EOF
1502 v0.2.1
1503 v1.0
1504 v1.0.1
1505 v1.1.3
1506 EOF
1507
1508 test_expect_success 'inverse of the last test, with --no-contains' "
1509 git tag -l --no-contains $hash2 v* >actual &&
1510 test_cmp expected actual
1511 "
1512
1513 test_expect_success 'checking that third commit has no tags' "
1514 git tag -l --contains $hash3 v* >actual &&
1515 test_must_be_empty actual
1516 "
1517
1518 cat > expected <<EOF
1519 v0.2.1
1520 v1.0
1521 v1.0.1
1522 v1.1.3
1523 v2.0
1524 EOF
1525
1526 test_expect_success 'conversely --no-contains on the third commit lists all tags' "
1527 git tag -l --no-contains $hash3 v* >actual &&
1528 test_cmp expected actual
1529 "
1530
1531 # how about a simple merge?
1532
1533 test_expect_success 'creating simple branch' '
1534 git branch stable v2.0 &&
1535 git checkout stable &&
1536 echo foo-3.0 > foo &&
1537 git commit foo -m fourth &&
1538 git tag v3.0
1539 '
1540
1541 hash4=$(git rev-parse HEAD)
1542
1543 cat > expected <<EOF
1544 v3.0
1545 EOF
1546
1547 test_expect_success 'checking that branch head only has one tag' "
1548 git tag -l --contains $hash4 v* >actual &&
1549 test_cmp expected actual
1550 "
1551
1552 cat > expected <<EOF
1553 v0.2.1
1554 v1.0
1555 v1.0.1
1556 v1.1.3
1557 v2.0
1558 EOF
1559
1560 test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
1561 git tag -l --no-contains $hash4 v* >actual &&
1562 test_cmp expected actual
1563 "
1564
1565 test_expect_success 'merging original branch into this branch' '
1566 git merge --strategy=ours master &&
1567 git tag v4.0
1568 '
1569
1570 cat > expected <<EOF
1571 v4.0
1572 EOF
1573
1574 test_expect_success 'checking that original branch head has one tag now' "
1575 git tag -l --contains $hash3 v* >actual &&
1576 test_cmp expected actual
1577 "
1578
1579 cat > expected <<EOF
1580 v0.2.1
1581 v1.0
1582 v1.0.1
1583 v1.1.3
1584 v2.0
1585 v3.0
1586 EOF
1587
1588 test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
1589 git tag -l --no-contains $hash3 v* >actual &&
1590 test_cmp expected actual
1591 "
1592
1593 cat > expected <<EOF
1594 v0.2.1
1595 v1.0
1596 v1.0.1
1597 v1.1.3
1598 v2.0
1599 v3.0
1600 v4.0
1601 EOF
1602
1603 test_expect_success 'checking that initial commit is in all tags' "
1604 git tag -l --contains $hash1 v* >actual &&
1605 test_cmp expected actual
1606 "
1607
1608 test_expect_success 'checking that --contains can be used in non-list mode' '
1609 git tag --contains $hash1 v* >actual &&
1610 test_cmp expected actual
1611 '
1612
1613 test_expect_success 'checking that initial commit is in all tags with --no-contains' "
1614 git tag -l --no-contains $hash1 v* >actual &&
1615 test_must_be_empty actual
1616 "
1617
1618 # mixing modes and options:
1619
1620 test_expect_success 'mixing incompatibles modes and options is forbidden' '
1621 test_must_fail git tag -a &&
1622 test_must_fail git tag -a -l &&
1623 test_must_fail git tag -s &&
1624 test_must_fail git tag -s -l &&
1625 test_must_fail git tag -m &&
1626 test_must_fail git tag -m -l &&
1627 test_must_fail git tag -m "hlagh" &&
1628 test_must_fail git tag -m "hlagh" -l &&
1629 test_must_fail git tag -F &&
1630 test_must_fail git tag -F -l &&
1631 test_must_fail git tag -f &&
1632 test_must_fail git tag -f -l &&
1633 test_must_fail git tag -a -s -m -F &&
1634 test_must_fail git tag -a -s -m -F -l &&
1635 test_must_fail git tag -l -v &&
1636 test_must_fail git tag -l -d &&
1637 test_must_fail git tag -l -v -d &&
1638 test_must_fail git tag -n 100 -v &&
1639 test_must_fail git tag -l -m msg &&
1640 test_must_fail git tag -l -F some file &&
1641 test_must_fail git tag -v -s &&
1642 test_must_fail git tag --contains tag-tree &&
1643 test_must_fail git tag --contains tag-blob &&
1644 test_must_fail git tag --no-contains tag-tree &&
1645 test_must_fail git tag --no-contains tag-blob &&
1646 test_must_fail git tag --contains --no-contains &&
1647 test_must_fail git tag --no-with HEAD &&
1648 test_must_fail git tag --no-without HEAD
1649 '
1650
1651 for option in --contains --with --no-contains --without --merged --no-merged --points-at
1652 do
1653 test_expect_success "mixing incompatible modes with $option is forbidden" "
1654 test_must_fail git tag -d $option HEAD &&
1655 test_must_fail git tag -d $option HEAD some-tag &&
1656 test_must_fail git tag -v $option HEAD
1657 "
1658 test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
1659 git tag -n $option HEAD HEAD &&
1660 git tag $option HEAD HEAD &&
1661 git tag $option
1662 "
1663 done
1664
1665 # check points-at
1666
1667 test_expect_success '--points-at can be used in non-list mode' '
1668 echo v4.0 >expect &&
1669 git tag --points-at=v4.0 "v*" >actual &&
1670 test_cmp expect actual
1671 '
1672
1673 test_expect_success '--points-at is a synonym for --points-at HEAD' '
1674 echo v4.0 >expect &&
1675 git tag --points-at >actual &&
1676 test_cmp expect actual
1677 '
1678
1679 test_expect_success '--points-at finds lightweight tags' '
1680 echo v4.0 >expect &&
1681 git tag --points-at v4.0 >actual &&
1682 test_cmp expect actual
1683 '
1684
1685 test_expect_success '--points-at finds annotated tags of commits' '
1686 git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&
1687 echo annotated-v4.0 >expect &&
1688 git tag -l --points-at v4.0 "annotated*" >actual &&
1689 test_cmp expect actual
1690 '
1691
1692 test_expect_success '--points-at finds annotated tags of tags' '
1693 git tag -m "describing the v4.0 tag object" \
1694 annotated-again-v4.0 annotated-v4.0 &&
1695 cat >expect <<-\EOF &&
1696 annotated-again-v4.0
1697 annotated-v4.0
1698 EOF
1699 git tag --points-at=annotated-v4.0 >actual &&
1700 test_cmp expect actual
1701 '
1702
1703 test_expect_success 'multiple --points-at are OR-ed together' '
1704 cat >expect <<-\EOF &&
1705 v2.0
1706 v3.0
1707 EOF
1708 git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1709 test_cmp expect actual
1710 '
1711
1712 test_expect_success 'lexical sort' '
1713 git tag foo1.3 &&
1714 git tag foo1.6 &&
1715 git tag foo1.10 &&
1716 git tag -l --sort=refname "foo*" >actual &&
1717 cat >expect <<-\EOF &&
1718 foo1.10
1719 foo1.3
1720 foo1.6
1721 EOF
1722 test_cmp expect actual
1723 '
1724
1725 test_expect_success 'version sort' '
1726 git tag -l --sort=version:refname "foo*" >actual &&
1727 cat >expect <<-\EOF &&
1728 foo1.3
1729 foo1.6
1730 foo1.10
1731 EOF
1732 test_cmp expect actual
1733 '
1734
1735 test_expect_success 'reverse version sort' '
1736 git tag -l --sort=-version:refname "foo*" >actual &&
1737 cat >expect <<-\EOF &&
1738 foo1.10
1739 foo1.6
1740 foo1.3
1741 EOF
1742 test_cmp expect actual
1743 '
1744
1745 test_expect_success 'reverse lexical sort' '
1746 git tag -l --sort=-refname "foo*" >actual &&
1747 cat >expect <<-\EOF &&
1748 foo1.6
1749 foo1.3
1750 foo1.10
1751 EOF
1752 test_cmp expect actual
1753 '
1754
1755 test_expect_success 'configured lexical sort' '
1756 test_config tag.sort "v:refname" &&
1757 git tag -l "foo*" >actual &&
1758 cat >expect <<-\EOF &&
1759 foo1.3
1760 foo1.6
1761 foo1.10
1762 EOF
1763 test_cmp expect actual
1764 '
1765
1766 test_expect_success 'option override configured sort' '
1767 test_config tag.sort "v:refname" &&
1768 git tag -l --sort=-refname "foo*" >actual &&
1769 cat >expect <<-\EOF &&
1770 foo1.6
1771 foo1.3
1772 foo1.10
1773 EOF
1774 test_cmp expect actual
1775 '
1776
1777 test_expect_success 'invalid sort parameter on command line' '
1778 test_must_fail git tag -l --sort=notvalid "foo*" >actual
1779 '
1780
1781 test_expect_success 'invalid sort parameter in configuratoin' '
1782 test_config tag.sort "v:notvalid" &&
1783 test_must_fail git tag -l "foo*"
1784 '
1785
1786 test_expect_success 'version sort with prerelease reordering' '
1787 test_config versionsort.prereleaseSuffix -rc &&
1788 git tag foo1.6-rc1 &&
1789 git tag foo1.6-rc2 &&
1790 git tag -l --sort=version:refname "foo*" >actual &&
1791 cat >expect <<-\EOF &&
1792 foo1.3
1793 foo1.6-rc1
1794 foo1.6-rc2
1795 foo1.6
1796 foo1.10
1797 EOF
1798 test_cmp expect actual
1799 '
1800
1801 test_expect_success 'reverse version sort with prerelease reordering' '
1802 test_config versionsort.prereleaseSuffix -rc &&
1803 git tag -l --sort=-version:refname "foo*" >actual &&
1804 cat >expect <<-\EOF &&
1805 foo1.10
1806 foo1.6
1807 foo1.6-rc2
1808 foo1.6-rc1
1809 foo1.3
1810 EOF
1811 test_cmp expect actual
1812 '
1813
1814 test_expect_success 'version sort with prerelease reordering and common leading character' '
1815 test_config versionsort.prereleaseSuffix -before &&
1816 git tag foo1.7-before1 &&
1817 git tag foo1.7 &&
1818 git tag foo1.7-after1 &&
1819 git tag -l --sort=version:refname "foo1.7*" >actual &&
1820 cat >expect <<-\EOF &&
1821 foo1.7-before1
1822 foo1.7
1823 foo1.7-after1
1824 EOF
1825 test_cmp expect actual
1826 '
1827
1828 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1829 test_config versionsort.prereleaseSuffix -before &&
1830 git config --add versionsort.prereleaseSuffix -after &&
1831 git tag -l --sort=version:refname "foo1.7*" >actual &&
1832 cat >expect <<-\EOF &&
1833 foo1.7-before1
1834 foo1.7-after1
1835 foo1.7
1836 EOF
1837 test_cmp expect actual
1838 '
1839
1840 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1841 test_config versionsort.prereleaseSuffix -bar &&
1842 git config --add versionsort.prereleaseSuffix -foo-baz &&
1843 git config --add versionsort.prereleaseSuffix -foo-bar &&
1844 git tag foo1.8-foo-bar &&
1845 git tag foo1.8-foo-baz &&
1846 git tag foo1.8 &&
1847 git tag -l --sort=version:refname "foo1.8*" >actual &&
1848 cat >expect <<-\EOF &&
1849 foo1.8-foo-baz
1850 foo1.8-foo-bar
1851 foo1.8
1852 EOF
1853 test_cmp expect actual
1854 '
1855
1856 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1857 test_config versionsort.prereleaseSuffix -pre &&
1858 git config --add versionsort.prereleaseSuffix -prerelease &&
1859 git tag foo1.9-pre1 &&
1860 git tag foo1.9-pre2 &&
1861 git tag foo1.9-prerelease1 &&
1862 git tag -l --sort=version:refname "foo1.9*" >actual &&
1863 cat >expect <<-\EOF &&
1864 foo1.9-pre1
1865 foo1.9-pre2
1866 foo1.9-prerelease1
1867 EOF
1868 test_cmp expect actual
1869 '
1870
1871 test_expect_success 'version sort with general suffix reordering' '
1872 test_config versionsort.suffix -alpha &&
1873 git config --add versionsort.suffix -beta &&
1874 git config --add versionsort.suffix "" &&
1875 git config --add versionsort.suffix -gamma &&
1876 git config --add versionsort.suffix -delta &&
1877 git tag foo1.10-alpha &&
1878 git tag foo1.10-beta &&
1879 git tag foo1.10-gamma &&
1880 git tag foo1.10-delta &&
1881 git tag foo1.10-unlisted-suffix &&
1882 git tag -l --sort=version:refname "foo1.10*" >actual &&
1883 cat >expect <<-\EOF &&
1884 foo1.10-alpha
1885 foo1.10-beta
1886 foo1.10
1887 foo1.10-unlisted-suffix
1888 foo1.10-gamma
1889 foo1.10-delta
1890 EOF
1891 test_cmp expect actual
1892 '
1893
1894 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1895 test_config versionsort.suffix -before &&
1896 test_config versionsort.prereleaseSuffix -after &&
1897 git tag -l --sort=version:refname "foo1.7*" >actual &&
1898 cat >expect <<-\EOF &&
1899 foo1.7-before1
1900 foo1.7
1901 foo1.7-after1
1902 EOF
1903 test_cmp expect actual
1904 '
1905
1906 test_expect_success 'version sort with very long prerelease suffix' '
1907 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1908 git tag -l --sort=version:refname
1909 '
1910
1911 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1912 i=1 &&
1913 while test $i -lt 8000
1914 do
1915 echo "commit refs/heads/master
1916 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1917 data <<EOF
1918 commit #$i
1919 EOF"
1920 test $i = 1 && echo "from refs/heads/master^0"
1921 i=$(($i + 1))
1922 done | git fast-import &&
1923 git checkout master &&
1924 git tag far-far-away HEAD^ &&
1925 run_with_limited_stack git tag --contains HEAD >actual &&
1926 test_must_be_empty actual &&
1927 run_with_limited_stack git tag --no-contains HEAD >actual &&
1928 test_line_count "-gt" 10 actual
1929 '
1930
1931 test_expect_success '--format should list tags as per format given' '
1932 cat >expect <<-\EOF &&
1933 refname : refs/tags/v1.0
1934 refname : refs/tags/v1.0.1
1935 refname : refs/tags/v1.1.3
1936 EOF
1937 git tag -l --format="refname : %(refname)" "v1*" >actual &&
1938 test_cmp expect actual
1939 '
1940
1941 test_expect_success "set up color tests" '
1942 echo "<RED>v1.0<RESET>" >expect.color &&
1943 echo "v1.0" >expect.bare &&
1944 color_args="--format=%(color:red)%(refname:short) --list v1.0"
1945 '
1946
1947 test_expect_success '%(color) omitted without tty' '
1948 TERM=vt100 git tag $color_args >actual.raw &&
1949 test_decode_color <actual.raw >actual &&
1950 test_cmp expect.bare actual
1951 '
1952
1953 test_expect_success TTY '%(color) present with tty' '
1954 test_terminal git tag $color_args >actual.raw &&
1955 test_decode_color <actual.raw >actual &&
1956 test_cmp expect.color actual
1957 '
1958
1959 test_expect_success '--color overrides auto-color' '
1960 git tag --color $color_args >actual.raw &&
1961 test_decode_color <actual.raw >actual &&
1962 test_cmp expect.color actual
1963 '
1964
1965 test_expect_success 'color.ui=always overrides auto-color' '
1966 git -c color.ui=always tag $color_args >actual.raw &&
1967 test_decode_color <actual.raw >actual &&
1968 test_cmp expect.color actual
1969 '
1970
1971 test_expect_success 'setup --merged test tags' '
1972 git tag mergetest-1 HEAD~2 &&
1973 git tag mergetest-2 HEAD~1 &&
1974 git tag mergetest-3 HEAD
1975 '
1976
1977 test_expect_success '--merged can be used in non-list mode' '
1978 cat >expect <<-\EOF &&
1979 mergetest-1
1980 mergetest-2
1981 EOF
1982 git tag --merged=mergetest-2 "mergetest*" >actual &&
1983 test_cmp expect actual
1984 '
1985
1986 test_expect_success '--merged is incompatible with --no-merged' '
1987 test_must_fail git tag --merged HEAD --no-merged HEAD
1988 '
1989
1990 test_expect_success '--merged shows merged tags' '
1991 cat >expect <<-\EOF &&
1992 mergetest-1
1993 mergetest-2
1994 EOF
1995 git tag -l --merged=mergetest-2 mergetest-* >actual &&
1996 test_cmp expect actual
1997 '
1998
1999 test_expect_success '--no-merged show unmerged tags' '
2000 cat >expect <<-\EOF &&
2001 mergetest-3
2002 EOF
2003 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
2004 test_cmp expect actual
2005 '
2006
2007 test_expect_success '--no-merged can be used in non-list mode' '
2008 git tag --no-merged=mergetest-2 mergetest-* >actual &&
2009 test_cmp expect actual
2010 '
2011
2012 test_expect_success 'ambiguous branch/tags not marked' '
2013 git tag ambiguous &&
2014 git branch ambiguous &&
2015 echo ambiguous >expect &&
2016 git tag -l ambiguous >actual &&
2017 test_cmp expect actual
2018 '
2019
2020 test_expect_success '--contains combined with --no-contains' '
2021 (
2022 git init no-contains &&
2023 cd no-contains &&
2024 test_commit v0.1 &&
2025 test_commit v0.2 &&
2026 test_commit v0.3 &&
2027 test_commit v0.4 &&
2028 test_commit v0.5 &&
2029 cat >expected <<-\EOF &&
2030 v0.2
2031 v0.3
2032 v0.4
2033 EOF
2034 git tag --contains v0.2 --no-contains v0.5 >actual &&
2035 test_cmp expected actual
2036 )
2037 '
2038
2039 # As the docs say, list tags which contain a specified *commit*. We
2040 # don't recurse down to tags for trees or blobs pointed to by *those*
2041 # commits.
2042 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
2043 cd no-contains &&
2044 blob=$(git rev-parse v0.3:v0.3.t) &&
2045 tree=$(git rev-parse v0.3^{tree}) &&
2046 git tag tag-blob $blob &&
2047 git tag tag-tree $tree &&
2048 git tag --contains v0.3 >actual &&
2049 cat >expected <<-\EOF &&
2050 v0.3
2051 v0.4
2052 v0.5
2053 EOF
2054 test_cmp expected actual &&
2055 git tag --no-contains v0.3 >actual &&
2056 cat >expected <<-\EOF &&
2057 v0.1
2058 v0.2
2059 EOF
2060 test_cmp expected actual
2061 '
2062
2063 test_done