]> git.ipfire.org Git - thirdparty/git.git/blob - t/t7004-tag.sh
Merge branch 'fc/fetch-with-import-fix' into maint
[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 'recursive tagging should give advice' '
1704 sed -e "s/|$//" <<-EOF >expect &&
1705 hint: You have created a nested tag. The object referred to by your new tag is
1706 hint: already a tag. If you meant to tag the object that it points to, use:
1707 hint: |
1708 hint: git tag -f nested annotated-v4.0^{}
1709 EOF
1710 git tag -m nested nested annotated-v4.0 2>actual &&
1711 test_i18ncmp expect actual
1712 '
1713
1714 test_expect_success 'multiple --points-at are OR-ed together' '
1715 cat >expect <<-\EOF &&
1716 v2.0
1717 v3.0
1718 EOF
1719 git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1720 test_cmp expect actual
1721 '
1722
1723 test_expect_success 'lexical sort' '
1724 git tag foo1.3 &&
1725 git tag foo1.6 &&
1726 git tag foo1.10 &&
1727 git tag -l --sort=refname "foo*" >actual &&
1728 cat >expect <<-\EOF &&
1729 foo1.10
1730 foo1.3
1731 foo1.6
1732 EOF
1733 test_cmp expect actual
1734 '
1735
1736 test_expect_success 'version sort' '
1737 git tag -l --sort=version:refname "foo*" >actual &&
1738 cat >expect <<-\EOF &&
1739 foo1.3
1740 foo1.6
1741 foo1.10
1742 EOF
1743 test_cmp expect actual
1744 '
1745
1746 test_expect_success 'reverse version sort' '
1747 git tag -l --sort=-version:refname "foo*" >actual &&
1748 cat >expect <<-\EOF &&
1749 foo1.10
1750 foo1.6
1751 foo1.3
1752 EOF
1753 test_cmp expect actual
1754 '
1755
1756 test_expect_success 'reverse lexical sort' '
1757 git tag -l --sort=-refname "foo*" >actual &&
1758 cat >expect <<-\EOF &&
1759 foo1.6
1760 foo1.3
1761 foo1.10
1762 EOF
1763 test_cmp expect actual
1764 '
1765
1766 test_expect_success 'configured lexical sort' '
1767 test_config tag.sort "v:refname" &&
1768 git tag -l "foo*" >actual &&
1769 cat >expect <<-\EOF &&
1770 foo1.3
1771 foo1.6
1772 foo1.10
1773 EOF
1774 test_cmp expect actual
1775 '
1776
1777 test_expect_success 'option override configured sort' '
1778 test_config tag.sort "v:refname" &&
1779 git tag -l --sort=-refname "foo*" >actual &&
1780 cat >expect <<-\EOF &&
1781 foo1.6
1782 foo1.3
1783 foo1.10
1784 EOF
1785 test_cmp expect actual
1786 '
1787
1788 test_expect_success 'invalid sort parameter on command line' '
1789 test_must_fail git tag -l --sort=notvalid "foo*" >actual
1790 '
1791
1792 test_expect_success 'invalid sort parameter in configuratoin' '
1793 test_config tag.sort "v:notvalid" &&
1794 test_must_fail git tag -l "foo*"
1795 '
1796
1797 test_expect_success 'version sort with prerelease reordering' '
1798 test_config versionsort.prereleaseSuffix -rc &&
1799 git tag foo1.6-rc1 &&
1800 git tag foo1.6-rc2 &&
1801 git tag -l --sort=version:refname "foo*" >actual &&
1802 cat >expect <<-\EOF &&
1803 foo1.3
1804 foo1.6-rc1
1805 foo1.6-rc2
1806 foo1.6
1807 foo1.10
1808 EOF
1809 test_cmp expect actual
1810 '
1811
1812 test_expect_success 'reverse version sort with prerelease reordering' '
1813 test_config versionsort.prereleaseSuffix -rc &&
1814 git tag -l --sort=-version:refname "foo*" >actual &&
1815 cat >expect <<-\EOF &&
1816 foo1.10
1817 foo1.6
1818 foo1.6-rc2
1819 foo1.6-rc1
1820 foo1.3
1821 EOF
1822 test_cmp expect actual
1823 '
1824
1825 test_expect_success 'version sort with prerelease reordering and common leading character' '
1826 test_config versionsort.prereleaseSuffix -before &&
1827 git tag foo1.7-before1 &&
1828 git tag foo1.7 &&
1829 git tag foo1.7-after1 &&
1830 git tag -l --sort=version:refname "foo1.7*" >actual &&
1831 cat >expect <<-\EOF &&
1832 foo1.7-before1
1833 foo1.7
1834 foo1.7-after1
1835 EOF
1836 test_cmp expect actual
1837 '
1838
1839 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1840 test_config versionsort.prereleaseSuffix -before &&
1841 git config --add versionsort.prereleaseSuffix -after &&
1842 git tag -l --sort=version:refname "foo1.7*" >actual &&
1843 cat >expect <<-\EOF &&
1844 foo1.7-before1
1845 foo1.7-after1
1846 foo1.7
1847 EOF
1848 test_cmp expect actual
1849 '
1850
1851 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1852 test_config versionsort.prereleaseSuffix -bar &&
1853 git config --add versionsort.prereleaseSuffix -foo-baz &&
1854 git config --add versionsort.prereleaseSuffix -foo-bar &&
1855 git tag foo1.8-foo-bar &&
1856 git tag foo1.8-foo-baz &&
1857 git tag foo1.8 &&
1858 git tag -l --sort=version:refname "foo1.8*" >actual &&
1859 cat >expect <<-\EOF &&
1860 foo1.8-foo-baz
1861 foo1.8-foo-bar
1862 foo1.8
1863 EOF
1864 test_cmp expect actual
1865 '
1866
1867 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1868 test_config versionsort.prereleaseSuffix -pre &&
1869 git config --add versionsort.prereleaseSuffix -prerelease &&
1870 git tag foo1.9-pre1 &&
1871 git tag foo1.9-pre2 &&
1872 git tag foo1.9-prerelease1 &&
1873 git tag -l --sort=version:refname "foo1.9*" >actual &&
1874 cat >expect <<-\EOF &&
1875 foo1.9-pre1
1876 foo1.9-pre2
1877 foo1.9-prerelease1
1878 EOF
1879 test_cmp expect actual
1880 '
1881
1882 test_expect_success 'version sort with general suffix reordering' '
1883 test_config versionsort.suffix -alpha &&
1884 git config --add versionsort.suffix -beta &&
1885 git config --add versionsort.suffix "" &&
1886 git config --add versionsort.suffix -gamma &&
1887 git config --add versionsort.suffix -delta &&
1888 git tag foo1.10-alpha &&
1889 git tag foo1.10-beta &&
1890 git tag foo1.10-gamma &&
1891 git tag foo1.10-delta &&
1892 git tag foo1.10-unlisted-suffix &&
1893 git tag -l --sort=version:refname "foo1.10*" >actual &&
1894 cat >expect <<-\EOF &&
1895 foo1.10-alpha
1896 foo1.10-beta
1897 foo1.10
1898 foo1.10-unlisted-suffix
1899 foo1.10-gamma
1900 foo1.10-delta
1901 EOF
1902 test_cmp expect actual
1903 '
1904
1905 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1906 test_config versionsort.suffix -before &&
1907 test_config versionsort.prereleaseSuffix -after &&
1908 git tag -l --sort=version:refname "foo1.7*" >actual &&
1909 cat >expect <<-\EOF &&
1910 foo1.7-before1
1911 foo1.7
1912 foo1.7-after1
1913 EOF
1914 test_cmp expect actual
1915 '
1916
1917 test_expect_success 'version sort with very long prerelease suffix' '
1918 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1919 git tag -l --sort=version:refname
1920 '
1921
1922 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1923 i=1 &&
1924 while test $i -lt 8000
1925 do
1926 echo "commit refs/heads/master
1927 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1928 data <<EOF
1929 commit #$i
1930 EOF"
1931 test $i = 1 && echo "from refs/heads/master^0"
1932 i=$(($i + 1))
1933 done | git fast-import &&
1934 git checkout master &&
1935 git tag far-far-away HEAD^ &&
1936 run_with_limited_stack git tag --contains HEAD >actual &&
1937 test_must_be_empty actual &&
1938 run_with_limited_stack git tag --no-contains HEAD >actual &&
1939 test_line_count "-gt" 10 actual
1940 '
1941
1942 test_expect_success '--format should list tags as per format given' '
1943 cat >expect <<-\EOF &&
1944 refname : refs/tags/v1.0
1945 refname : refs/tags/v1.0.1
1946 refname : refs/tags/v1.1.3
1947 EOF
1948 git tag -l --format="refname : %(refname)" "v1*" >actual &&
1949 test_cmp expect actual
1950 '
1951
1952 test_expect_success "set up color tests" '
1953 echo "<RED>v1.0<RESET>" >expect.color &&
1954 echo "v1.0" >expect.bare &&
1955 color_args="--format=%(color:red)%(refname:short) --list v1.0"
1956 '
1957
1958 test_expect_success '%(color) omitted without tty' '
1959 TERM=vt100 git tag $color_args >actual.raw &&
1960 test_decode_color <actual.raw >actual &&
1961 test_cmp expect.bare actual
1962 '
1963
1964 test_expect_success TTY '%(color) present with tty' '
1965 test_terminal git tag $color_args >actual.raw &&
1966 test_decode_color <actual.raw >actual &&
1967 test_cmp expect.color actual
1968 '
1969
1970 test_expect_success '--color overrides auto-color' '
1971 git tag --color $color_args >actual.raw &&
1972 test_decode_color <actual.raw >actual &&
1973 test_cmp expect.color actual
1974 '
1975
1976 test_expect_success 'color.ui=always overrides auto-color' '
1977 git -c color.ui=always tag $color_args >actual.raw &&
1978 test_decode_color <actual.raw >actual &&
1979 test_cmp expect.color actual
1980 '
1981
1982 test_expect_success 'setup --merged test tags' '
1983 git tag mergetest-1 HEAD~2 &&
1984 git tag mergetest-2 HEAD~1 &&
1985 git tag mergetest-3 HEAD
1986 '
1987
1988 test_expect_success '--merged can be used in non-list mode' '
1989 cat >expect <<-\EOF &&
1990 mergetest-1
1991 mergetest-2
1992 EOF
1993 git tag --merged=mergetest-2 "mergetest*" >actual &&
1994 test_cmp expect actual
1995 '
1996
1997 test_expect_success '--merged is incompatible with --no-merged' '
1998 test_must_fail git tag --merged HEAD --no-merged HEAD
1999 '
2000
2001 test_expect_success '--merged shows merged tags' '
2002 cat >expect <<-\EOF &&
2003 mergetest-1
2004 mergetest-2
2005 EOF
2006 git tag -l --merged=mergetest-2 mergetest-* >actual &&
2007 test_cmp expect actual
2008 '
2009
2010 test_expect_success '--no-merged show unmerged tags' '
2011 cat >expect <<-\EOF &&
2012 mergetest-3
2013 EOF
2014 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
2015 test_cmp expect actual
2016 '
2017
2018 test_expect_success '--no-merged can be used in non-list mode' '
2019 git tag --no-merged=mergetest-2 mergetest-* >actual &&
2020 test_cmp expect actual
2021 '
2022
2023 test_expect_success 'ambiguous branch/tags not marked' '
2024 git tag ambiguous &&
2025 git branch ambiguous &&
2026 echo ambiguous >expect &&
2027 git tag -l ambiguous >actual &&
2028 test_cmp expect actual
2029 '
2030
2031 test_expect_success '--contains combined with --no-contains' '
2032 (
2033 git init no-contains &&
2034 cd no-contains &&
2035 test_commit v0.1 &&
2036 test_commit v0.2 &&
2037 test_commit v0.3 &&
2038 test_commit v0.4 &&
2039 test_commit v0.5 &&
2040 cat >expected <<-\EOF &&
2041 v0.2
2042 v0.3
2043 v0.4
2044 EOF
2045 git tag --contains v0.2 --no-contains v0.5 >actual &&
2046 test_cmp expected actual
2047 )
2048 '
2049
2050 # As the docs say, list tags which contain a specified *commit*. We
2051 # don't recurse down to tags for trees or blobs pointed to by *those*
2052 # commits.
2053 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
2054 cd no-contains &&
2055 blob=$(git rev-parse v0.3:v0.3.t) &&
2056 tree=$(git rev-parse v0.3^{tree}) &&
2057 git tag tag-blob $blob &&
2058 git tag tag-tree $tree &&
2059 git tag --contains v0.3 >actual &&
2060 cat >expected <<-\EOF &&
2061 v0.3
2062 v0.4
2063 v0.5
2064 EOF
2065 test_cmp expected actual &&
2066 git tag --no-contains v0.3 >actual &&
2067 cat >expected <<-\EOF &&
2068 v0.1
2069 v0.2
2070 EOF
2071 test_cmp expected actual
2072 '
2073
2074 test_done