]> git.ipfire.org Git - thirdparty/git.git/blob - t/t7004-tag.sh
path.c: don't call the match function without value in trie_find()
[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 get_tag_header gpgsign-enabled $commit commit $time >expect
936 echo "A message" >>expect
937 echo '-----BEGIN PGP SIGNATURE-----' >>expect
938 test_expect_success GPG \
939 'git tag configured tag.gpgsign enables GPG sign' \
940 'test_config tag.gpgsign true &&
941 git tag -m "A message" gpgsign-enabled &&
942 get_tag_msg gpgsign-enabled>actual &&
943 test_cmp expect actual
944 '
945
946 get_tag_header no-sign $commit commit $time >expect
947 echo "A message" >>expect
948 test_expect_success GPG \
949 'git tag --no-sign configured tag.gpgsign skip GPG sign' \
950 'test_config tag.gpgsign true &&
951 git tag -a --no-sign -m "A message" no-sign &&
952 get_tag_msg no-sign>actual &&
953 test_cmp expect actual
954 '
955
956 test_expect_success GPG \
957 'trying to create a signed tag with non-existing -F file should fail' '
958 ! test -f nonexistingfile &&
959 ! tag_exists nosigtag &&
960 test_must_fail git tag -s -F nonexistingfile nosigtag &&
961 ! tag_exists nosigtag
962 '
963
964 test_expect_success GPG 'verifying a signed tag should succeed' \
965 'git tag -v signed-tag'
966
967 test_expect_success GPG 'verifying two signed tags in one command should succeed' \
968 'git tag -v signed-tag file-signed-tag'
969
970 test_expect_success GPG \
971 'verifying many signed and non-signed tags should fail' '
972 test_must_fail git tag -v signed-tag annotated-tag &&
973 test_must_fail git tag -v file-annotated-tag file-signed-tag &&
974 test_must_fail git tag -v annotated-tag \
975 file-signed-tag file-annotated-tag &&
976 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag
977 '
978
979 test_expect_success GPG 'verifying a forged tag should fail' '
980 forged=$(git cat-file tag signed-tag |
981 sed -e "s/signed-tag/forged-tag/" |
982 git mktag) &&
983 git tag forged-tag $forged &&
984 test_must_fail git tag -v forged-tag
985 '
986
987 test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly' '
988 cat >expect <<-\EOF &&
989 tagname : signed-tag
990 EOF
991 git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
992 test_cmp expect actual
993 '
994
995 test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
996 test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
997 test_must_be_empty actual
998 '
999
1000 # blank and empty messages for signed tags:
1001
1002 get_tag_header empty-signed-tag $commit commit $time >expect
1003 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1004 test_expect_success GPG \
1005 'creating a signed tag with an empty -m message should succeed' '
1006 git tag -s -m "" empty-signed-tag &&
1007 get_tag_msg empty-signed-tag >actual &&
1008 test_cmp expect actual &&
1009 git tag -v empty-signed-tag
1010 '
1011
1012 >sigemptyfile
1013 get_tag_header emptyfile-signed-tag $commit commit $time >expect
1014 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1015 test_expect_success GPG \
1016 'creating a signed tag with an empty -F messagefile should succeed' '
1017 git tag -s -F sigemptyfile emptyfile-signed-tag &&
1018 get_tag_msg emptyfile-signed-tag >actual &&
1019 test_cmp expect actual &&
1020 git tag -v emptyfile-signed-tag
1021 '
1022
1023 printf '\n\n \n\t\nLeading blank lines\n' > sigblanksfile
1024 printf '\n\t \t \nRepeated blank lines\n' >>sigblanksfile
1025 printf '\n\n\nTrailing spaces \t \n' >>sigblanksfile
1026 printf '\nTrailing blank lines\n\n\t \n\n' >>sigblanksfile
1027 get_tag_header blanks-signed-tag $commit commit $time >expect
1028 cat >>expect <<EOF
1029 Leading blank lines
1030
1031 Repeated blank lines
1032
1033 Trailing spaces
1034
1035 Trailing blank lines
1036 EOF
1037 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1038 test_expect_success GPG \
1039 'extra blanks in the message for a signed tag should be removed' '
1040 git tag -s -F sigblanksfile blanks-signed-tag &&
1041 get_tag_msg blanks-signed-tag >actual &&
1042 test_cmp expect actual &&
1043 git tag -v blanks-signed-tag
1044 '
1045
1046 get_tag_header blank-signed-tag $commit commit $time >expect
1047 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1048 test_expect_success GPG \
1049 'creating a signed tag with a blank -m message should succeed' '
1050 git tag -s -m " " blank-signed-tag &&
1051 get_tag_msg blank-signed-tag >actual &&
1052 test_cmp expect actual &&
1053 git tag -v blank-signed-tag
1054 '
1055
1056 echo ' ' >sigblankfile
1057 echo '' >>sigblankfile
1058 echo ' ' >>sigblankfile
1059 get_tag_header blankfile-signed-tag $commit commit $time >expect
1060 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1061 test_expect_success GPG \
1062 'creating a signed tag with blank -F file with spaces should succeed' '
1063 git tag -s -F sigblankfile blankfile-signed-tag &&
1064 get_tag_msg blankfile-signed-tag >actual &&
1065 test_cmp expect actual &&
1066 git tag -v blankfile-signed-tag
1067 '
1068
1069 printf ' ' >sigblanknonlfile
1070 get_tag_header blanknonlfile-signed-tag $commit commit $time >expect
1071 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1072 test_expect_success GPG \
1073 'creating a signed tag with spaces and no newline should succeed' '
1074 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&
1075 get_tag_msg blanknonlfile-signed-tag >actual &&
1076 test_cmp expect actual &&
1077 git tag -v blanknonlfile-signed-tag
1078 '
1079
1080 test_expect_success GPG 'signed tag with embedded PGP message' '
1081 cat >msg <<-\EOF &&
1082 -----BEGIN PGP MESSAGE-----
1083
1084 this is not a real PGP message
1085 -----END PGP MESSAGE-----
1086 EOF
1087 git tag -s -F msg confusing-pgp-message &&
1088 git tag -v confusing-pgp-message
1089 '
1090
1091 # messages with commented lines for signed tags:
1092
1093 cat >sigcommentsfile <<EOF
1094 # A comment
1095
1096 ############
1097 The message.
1098 ############
1099 One line.
1100
1101
1102 # commented lines
1103 # commented lines
1104
1105 Another line.
1106 # comments
1107
1108 Last line.
1109 EOF
1110 get_tag_header comments-signed-tag $commit commit $time >expect
1111 cat >>expect <<EOF
1112 The message.
1113 One line.
1114
1115 Another line.
1116
1117 Last line.
1118 EOF
1119 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1120 test_expect_success GPG \
1121 'creating a signed tag with a -F file with #comments should succeed' '
1122 git tag -s -F sigcommentsfile comments-signed-tag &&
1123 get_tag_msg comments-signed-tag >actual &&
1124 test_cmp expect actual &&
1125 git tag -v comments-signed-tag
1126 '
1127
1128 get_tag_header comment-signed-tag $commit commit $time >expect
1129 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1130 test_expect_success GPG \
1131 'creating a signed tag with #commented -m message should succeed' '
1132 git tag -s -m "#comment" comment-signed-tag &&
1133 get_tag_msg comment-signed-tag >actual &&
1134 test_cmp expect actual &&
1135 git tag -v comment-signed-tag
1136 '
1137
1138 echo '#comment' >sigcommentfile
1139 echo '' >>sigcommentfile
1140 echo '####' >>sigcommentfile
1141 get_tag_header commentfile-signed-tag $commit commit $time >expect
1142 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1143 test_expect_success GPG \
1144 'creating a signed tag with #commented -F messagefile should succeed' '
1145 git tag -s -F sigcommentfile commentfile-signed-tag &&
1146 get_tag_msg commentfile-signed-tag >actual &&
1147 test_cmp expect actual &&
1148 git tag -v commentfile-signed-tag
1149 '
1150
1151 printf '#comment' >sigcommentnonlfile
1152 get_tag_header commentnonlfile-signed-tag $commit commit $time >expect
1153 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1154 test_expect_success GPG \
1155 'creating a signed tag with a #comment and no newline should succeed' '
1156 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&
1157 get_tag_msg commentnonlfile-signed-tag >actual &&
1158 test_cmp expect actual &&
1159 git tag -v commentnonlfile-signed-tag
1160 '
1161
1162 # listing messages for signed tags:
1163
1164 test_expect_success GPG \
1165 'listing the one-line message of a signed tag should succeed' '
1166 git tag -s -m "A message line signed" stag-one-line &&
1167
1168 echo "stag-one-line" >expect &&
1169 git tag -l | grep "^stag-one-line" >actual &&
1170 test_cmp expect actual &&
1171 git tag -n0 -l | grep "^stag-one-line" >actual &&
1172 test_cmp expect actual &&
1173 git tag -n0 -l stag-one-line >actual &&
1174 test_cmp expect actual &&
1175
1176 echo "stag-one-line A message line signed" >expect &&
1177 git tag -n1 -l | grep "^stag-one-line" >actual &&
1178 test_cmp expect actual &&
1179 git tag -n -l | grep "^stag-one-line" >actual &&
1180 test_cmp expect actual &&
1181 git tag -n1 -l stag-one-line >actual &&
1182 test_cmp expect actual &&
1183 git tag -n2 -l stag-one-line >actual &&
1184 test_cmp expect actual &&
1185 git tag -n999 -l stag-one-line >actual &&
1186 test_cmp expect actual
1187 '
1188
1189 test_expect_success GPG \
1190 'listing the zero-lines message of a signed tag should succeed' '
1191 git tag -s -m "" stag-zero-lines &&
1192
1193 echo "stag-zero-lines" >expect &&
1194 git tag -l | grep "^stag-zero-lines" >actual &&
1195 test_cmp expect actual &&
1196 git tag -n0 -l | grep "^stag-zero-lines" >actual &&
1197 test_cmp expect actual &&
1198 git tag -n0 -l stag-zero-lines >actual &&
1199 test_cmp expect actual &&
1200
1201 echo "stag-zero-lines " >expect &&
1202 git tag -n1 -l | grep "^stag-zero-lines" >actual &&
1203 test_cmp expect actual &&
1204 git tag -n -l | grep "^stag-zero-lines" >actual &&
1205 test_cmp expect actual &&
1206 git tag -n1 -l stag-zero-lines >actual &&
1207 test_cmp expect actual &&
1208 git tag -n2 -l stag-zero-lines >actual &&
1209 test_cmp expect actual &&
1210 git tag -n999 -l stag-zero-lines >actual &&
1211 test_cmp expect actual
1212 '
1213
1214 echo 'stag line one' >sigtagmsg
1215 echo 'stag line two' >>sigtagmsg
1216 echo 'stag line three' >>sigtagmsg
1217 test_expect_success GPG \
1218 'listing many message lines of a signed tag should succeed' '
1219 git tag -s -F sigtagmsg stag-lines &&
1220
1221 echo "stag-lines" >expect &&
1222 git tag -l | grep "^stag-lines" >actual &&
1223 test_cmp expect actual &&
1224 git tag -n0 -l | grep "^stag-lines" >actual &&
1225 test_cmp expect actual &&
1226 git tag -n0 -l stag-lines >actual &&
1227 test_cmp expect actual &&
1228
1229 echo "stag-lines stag line one" >expect &&
1230 git tag -n1 -l | grep "^stag-lines" >actual &&
1231 test_cmp expect actual &&
1232 git tag -n -l | grep "^stag-lines" >actual &&
1233 test_cmp expect actual &&
1234 git tag -n1 -l stag-lines >actual &&
1235 test_cmp expect actual &&
1236
1237 echo " stag line two" >>expect &&
1238 git tag -n2 -l | grep "^ *stag.line" >actual &&
1239 test_cmp expect actual &&
1240 git tag -n2 -l stag-lines >actual &&
1241 test_cmp expect actual &&
1242
1243 echo " stag line three" >>expect &&
1244 git tag -n3 -l | grep "^ *stag.line" >actual &&
1245 test_cmp expect actual &&
1246 git tag -n3 -l stag-lines >actual &&
1247 test_cmp expect actual &&
1248 git tag -n4 -l | grep "^ *stag.line" >actual &&
1249 test_cmp expect actual &&
1250 git tag -n4 -l stag-lines >actual &&
1251 test_cmp expect actual &&
1252 git tag -n99 -l | grep "^ *stag.line" >actual &&
1253 test_cmp expect actual &&
1254 git tag -n99 -l stag-lines >actual &&
1255 test_cmp expect actual
1256 '
1257
1258 # tags pointing to objects different from commits:
1259
1260 tree=$(git rev-parse HEAD^{tree})
1261 blob=$(git rev-parse HEAD:foo)
1262 tag=$(git rev-parse signed-tag 2>/dev/null)
1263
1264 get_tag_header tree-signed-tag $tree tree $time >expect
1265 echo "A message for a tree" >>expect
1266 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1267 test_expect_success GPG \
1268 'creating a signed tag pointing to a tree should succeed' '
1269 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&
1270 get_tag_msg tree-signed-tag >actual &&
1271 test_cmp expect actual
1272 '
1273
1274 get_tag_header blob-signed-tag $blob blob $time >expect
1275 echo "A message for a blob" >>expect
1276 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1277 test_expect_success GPG \
1278 'creating a signed tag pointing to a blob should succeed' '
1279 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&
1280 get_tag_msg blob-signed-tag >actual &&
1281 test_cmp expect actual
1282 '
1283
1284 get_tag_header tag-signed-tag $tag tag $time >expect
1285 echo "A message for another tag" >>expect
1286 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1287 test_expect_success GPG \
1288 'creating a signed tag pointing to another tag should succeed' '
1289 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&
1290 get_tag_msg tag-signed-tag >actual &&
1291 test_cmp expect actual
1292 '
1293
1294 # usage with rfc1991 signatures
1295 get_tag_header rfc1991-signed-tag $commit commit $time >expect
1296 echo "RFC1991 signed tag" >>expect
1297 echo '-----BEGIN PGP MESSAGE-----' >>expect
1298 test_expect_success GPG,RFC1991 \
1299 'creating a signed tag with rfc1991' '
1300 echo "rfc1991" >gpghome/gpg.conf &&
1301 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit &&
1302 get_tag_msg rfc1991-signed-tag >actual &&
1303 test_cmp expect actual
1304 '
1305
1306 cat >fakeeditor <<'EOF'
1307 #!/bin/sh
1308 cp "$1" actual
1309 EOF
1310 chmod +x fakeeditor
1311
1312 test_expect_success GPG,RFC1991 \
1313 'reediting a signed tag body omits signature' '
1314 echo "rfc1991" >gpghome/gpg.conf &&
1315 echo "RFC1991 signed tag" >expect &&
1316 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1317 test_cmp expect actual
1318 '
1319
1320 test_expect_success GPG,RFC1991 \
1321 'verifying rfc1991 signature' '
1322 echo "rfc1991" >gpghome/gpg.conf &&
1323 git tag -v rfc1991-signed-tag
1324 '
1325
1326 test_expect_success GPG,RFC1991 \
1327 'list tag with rfc1991 signature' '
1328 echo "rfc1991" >gpghome/gpg.conf &&
1329 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1330 git tag -l -n1 rfc1991-signed-tag >actual &&
1331 test_cmp expect actual &&
1332 git tag -l -n2 rfc1991-signed-tag >actual &&
1333 test_cmp expect actual &&
1334 git tag -l -n999 rfc1991-signed-tag >actual &&
1335 test_cmp expect actual
1336 '
1337
1338 rm -f gpghome/gpg.conf
1339
1340 test_expect_success GPG,RFC1991 \
1341 'verifying rfc1991 signature without --rfc1991' '
1342 git tag -v rfc1991-signed-tag
1343 '
1344
1345 test_expect_success GPG,RFC1991 \
1346 'list tag with rfc1991 signature without --rfc1991' '
1347 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1348 git tag -l -n1 rfc1991-signed-tag >actual &&
1349 test_cmp expect actual &&
1350 git tag -l -n2 rfc1991-signed-tag >actual &&
1351 test_cmp expect actual &&
1352 git tag -l -n999 rfc1991-signed-tag >actual &&
1353 test_cmp expect actual
1354 '
1355
1356 test_expect_success GPG,RFC1991 \
1357 'reediting a signed tag body omits signature' '
1358 echo "RFC1991 signed tag" >expect &&
1359 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1360 test_cmp expect actual
1361 '
1362
1363 # try to sign with bad user.signingkey
1364 test_expect_success GPG \
1365 'git tag -s fails if gpg is misconfigured (bad key)' \
1366 'test_config user.signingkey BobTheMouse &&
1367 test_must_fail git tag -s -m tail tag-gpg-failure'
1368
1369 # try to produce invalid signature
1370 test_expect_success GPG \
1371 'git tag -s fails if gpg is misconfigured (bad signature format)' \
1372 'test_config gpg.program echo &&
1373 test_must_fail git tag -s -m tail tag-gpg-failure'
1374
1375 # try to sign with bad user.signingkey
1376 test_expect_success GPGSM \
1377 'git tag -s fails if gpgsm is misconfigured (bad key)' \
1378 'test_config user.signingkey BobTheMouse &&
1379 test_config gpg.format x509 &&
1380 test_must_fail git tag -s -m tail tag-gpg-failure'
1381
1382 # try to produce invalid signature
1383 test_expect_success GPGSM \
1384 'git tag -s fails if gpgsm is misconfigured (bad signature format)' \
1385 'test_config gpg.x509.program echo &&
1386 test_config gpg.format x509 &&
1387 test_must_fail git tag -s -m tail tag-gpg-failure'
1388
1389 # try to verify without gpg:
1390
1391 rm -rf gpghome
1392 test_expect_success GPG \
1393 'verify signed tag fails when public key is not present' \
1394 'test_must_fail git tag -v signed-tag'
1395
1396 test_expect_success \
1397 'git tag -a fails if tag annotation is empty' '
1398 ! (GIT_EDITOR=cat git tag -a initial-comment)
1399 '
1400
1401 test_expect_success \
1402 'message in editor has initial comment' '
1403 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)
1404 '
1405
1406 test_expect_success 'message in editor has initial comment: first line' '
1407 # check the first line --- should be empty
1408 echo >first.expect &&
1409 sed -e 1q <actual >first.actual &&
1410 test_i18ncmp first.expect first.actual
1411 '
1412
1413 test_expect_success \
1414 'message in editor has initial comment: remainder' '
1415 # remove commented lines from the remainder -- should be empty
1416 sed -e 1d -e "/^#/d" <actual >rest.actual &&
1417 test_must_be_empty rest.actual
1418 '
1419
1420 get_tag_header reuse $commit commit $time >expect
1421 echo "An annotation to be reused" >> expect
1422 test_expect_success \
1423 'overwriting an annoted tag should use its previous body' '
1424 git tag -a -m "An annotation to be reused" reuse &&
1425 GIT_EDITOR=true git tag -f -a reuse &&
1426 get_tag_msg reuse >actual &&
1427 test_cmp expect actual
1428 '
1429
1430 test_expect_success 'filename for the message is relative to cwd' '
1431 mkdir subdir &&
1432 echo "Tag message in top directory" >msgfile-5 &&
1433 echo "Tag message in sub directory" >subdir/msgfile-5 &&
1434 (
1435 cd subdir &&
1436 git tag -a -F msgfile-5 tag-from-subdir
1437 ) &&
1438 git cat-file tag tag-from-subdir | grep "in sub directory"
1439 '
1440
1441 test_expect_success 'filename for the message is relative to cwd' '
1442 echo "Tag message in sub directory" >subdir/msgfile-6 &&
1443 (
1444 cd subdir &&
1445 git tag -a -F msgfile-6 tag-from-subdir-2
1446 ) &&
1447 git cat-file tag tag-from-subdir-2 | grep "in sub directory"
1448 '
1449
1450 # create a few more commits to test --contains
1451
1452 hash1=$(git rev-parse HEAD)
1453
1454 test_expect_success 'creating second commit and tag' '
1455 echo foo-2.0 >foo &&
1456 git add foo &&
1457 git commit -m second &&
1458 git tag v2.0
1459 '
1460
1461 hash2=$(git rev-parse HEAD)
1462
1463 test_expect_success 'creating third commit without tag' '
1464 echo foo-dev >foo &&
1465 git add foo &&
1466 git commit -m third
1467 '
1468
1469 hash3=$(git rev-parse HEAD)
1470
1471 # simple linear checks of --continue
1472
1473 cat > expected <<EOF
1474 v0.2.1
1475 v1.0
1476 v1.0.1
1477 v1.1.3
1478 v2.0
1479 EOF
1480
1481 test_expect_success 'checking that first commit is in all tags (hash)' "
1482 git tag -l --contains $hash1 v* >actual &&
1483 test_cmp expected actual
1484 "
1485
1486 # other ways of specifying the commit
1487 test_expect_success 'checking that first commit is in all tags (tag)' "
1488 git tag -l --contains v1.0 v* >actual &&
1489 test_cmp expected actual
1490 "
1491
1492 test_expect_success 'checking that first commit is in all tags (relative)' "
1493 git tag -l --contains HEAD~2 v* >actual &&
1494 test_cmp expected actual
1495 "
1496
1497 # All the --contains tests above, but with --no-contains
1498 test_expect_success 'checking that first commit is not listed in any tag with --no-contains (hash)' "
1499 git tag -l --no-contains $hash1 v* >actual &&
1500 test_must_be_empty actual
1501 "
1502
1503 test_expect_success 'checking that first commit is in all tags (tag)' "
1504 git tag -l --no-contains v1.0 v* >actual &&
1505 test_must_be_empty actual
1506 "
1507
1508 test_expect_success 'checking that first commit is in all tags (relative)' "
1509 git tag -l --no-contains HEAD~2 v* >actual &&
1510 test_must_be_empty actual
1511 "
1512
1513 cat > expected <<EOF
1514 v2.0
1515 EOF
1516
1517 test_expect_success 'checking that second commit only has one tag' "
1518 git tag -l --contains $hash2 v* >actual &&
1519 test_cmp expected actual
1520 "
1521
1522 cat > expected <<EOF
1523 v0.2.1
1524 v1.0
1525 v1.0.1
1526 v1.1.3
1527 EOF
1528
1529 test_expect_success 'inverse of the last test, with --no-contains' "
1530 git tag -l --no-contains $hash2 v* >actual &&
1531 test_cmp expected actual
1532 "
1533
1534 test_expect_success 'checking that third commit has no tags' "
1535 git tag -l --contains $hash3 v* >actual &&
1536 test_must_be_empty actual
1537 "
1538
1539 cat > expected <<EOF
1540 v0.2.1
1541 v1.0
1542 v1.0.1
1543 v1.1.3
1544 v2.0
1545 EOF
1546
1547 test_expect_success 'conversely --no-contains on the third commit lists all tags' "
1548 git tag -l --no-contains $hash3 v* >actual &&
1549 test_cmp expected actual
1550 "
1551
1552 # how about a simple merge?
1553
1554 test_expect_success 'creating simple branch' '
1555 git branch stable v2.0 &&
1556 git checkout stable &&
1557 echo foo-3.0 > foo &&
1558 git commit foo -m fourth &&
1559 git tag v3.0
1560 '
1561
1562 hash4=$(git rev-parse HEAD)
1563
1564 cat > expected <<EOF
1565 v3.0
1566 EOF
1567
1568 test_expect_success 'checking that branch head only has one tag' "
1569 git tag -l --contains $hash4 v* >actual &&
1570 test_cmp expected actual
1571 "
1572
1573 cat > expected <<EOF
1574 v0.2.1
1575 v1.0
1576 v1.0.1
1577 v1.1.3
1578 v2.0
1579 EOF
1580
1581 test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
1582 git tag -l --no-contains $hash4 v* >actual &&
1583 test_cmp expected actual
1584 "
1585
1586 test_expect_success 'merging original branch into this branch' '
1587 git merge --strategy=ours master &&
1588 git tag v4.0
1589 '
1590
1591 cat > expected <<EOF
1592 v4.0
1593 EOF
1594
1595 test_expect_success 'checking that original branch head has one tag now' "
1596 git tag -l --contains $hash3 v* >actual &&
1597 test_cmp expected actual
1598 "
1599
1600 cat > expected <<EOF
1601 v0.2.1
1602 v1.0
1603 v1.0.1
1604 v1.1.3
1605 v2.0
1606 v3.0
1607 EOF
1608
1609 test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
1610 git tag -l --no-contains $hash3 v* >actual &&
1611 test_cmp expected actual
1612 "
1613
1614 cat > expected <<EOF
1615 v0.2.1
1616 v1.0
1617 v1.0.1
1618 v1.1.3
1619 v2.0
1620 v3.0
1621 v4.0
1622 EOF
1623
1624 test_expect_success 'checking that initial commit is in all tags' "
1625 git tag -l --contains $hash1 v* >actual &&
1626 test_cmp expected actual
1627 "
1628
1629 test_expect_success 'checking that --contains can be used in non-list mode' '
1630 git tag --contains $hash1 v* >actual &&
1631 test_cmp expected actual
1632 '
1633
1634 test_expect_success 'checking that initial commit is in all tags with --no-contains' "
1635 git tag -l --no-contains $hash1 v* >actual &&
1636 test_must_be_empty actual
1637 "
1638
1639 # mixing modes and options:
1640
1641 test_expect_success 'mixing incompatibles modes and options is forbidden' '
1642 test_must_fail git tag -a &&
1643 test_must_fail git tag -a -l &&
1644 test_must_fail git tag -s &&
1645 test_must_fail git tag -s -l &&
1646 test_must_fail git tag -m &&
1647 test_must_fail git tag -m -l &&
1648 test_must_fail git tag -m "hlagh" &&
1649 test_must_fail git tag -m "hlagh" -l &&
1650 test_must_fail git tag -F &&
1651 test_must_fail git tag -F -l &&
1652 test_must_fail git tag -f &&
1653 test_must_fail git tag -f -l &&
1654 test_must_fail git tag -a -s -m -F &&
1655 test_must_fail git tag -a -s -m -F -l &&
1656 test_must_fail git tag -l -v &&
1657 test_must_fail git tag -l -d &&
1658 test_must_fail git tag -l -v -d &&
1659 test_must_fail git tag -n 100 -v &&
1660 test_must_fail git tag -l -m msg &&
1661 test_must_fail git tag -l -F some file &&
1662 test_must_fail git tag -v -s &&
1663 test_must_fail git tag --contains tag-tree &&
1664 test_must_fail git tag --contains tag-blob &&
1665 test_must_fail git tag --no-contains tag-tree &&
1666 test_must_fail git tag --no-contains tag-blob &&
1667 test_must_fail git tag --contains --no-contains &&
1668 test_must_fail git tag --no-with HEAD &&
1669 test_must_fail git tag --no-without HEAD
1670 '
1671
1672 for option in --contains --with --no-contains --without --merged --no-merged --points-at
1673 do
1674 test_expect_success "mixing incompatible modes with $option is forbidden" "
1675 test_must_fail git tag -d $option HEAD &&
1676 test_must_fail git tag -d $option HEAD some-tag &&
1677 test_must_fail git tag -v $option HEAD
1678 "
1679 test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
1680 git tag -n $option HEAD HEAD &&
1681 git tag $option HEAD HEAD &&
1682 git tag $option
1683 "
1684 done
1685
1686 # check points-at
1687
1688 test_expect_success '--points-at can be used in non-list mode' '
1689 echo v4.0 >expect &&
1690 git tag --points-at=v4.0 "v*" >actual &&
1691 test_cmp expect actual
1692 '
1693
1694 test_expect_success '--points-at is a synonym for --points-at HEAD' '
1695 echo v4.0 >expect &&
1696 git tag --points-at >actual &&
1697 test_cmp expect actual
1698 '
1699
1700 test_expect_success '--points-at finds lightweight tags' '
1701 echo v4.0 >expect &&
1702 git tag --points-at v4.0 >actual &&
1703 test_cmp expect actual
1704 '
1705
1706 test_expect_success '--points-at finds annotated tags of commits' '
1707 git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&
1708 echo annotated-v4.0 >expect &&
1709 git tag -l --points-at v4.0 "annotated*" >actual &&
1710 test_cmp expect actual
1711 '
1712
1713 test_expect_success '--points-at finds annotated tags of tags' '
1714 git tag -m "describing the v4.0 tag object" \
1715 annotated-again-v4.0 annotated-v4.0 &&
1716 cat >expect <<-\EOF &&
1717 annotated-again-v4.0
1718 annotated-v4.0
1719 EOF
1720 git tag --points-at=annotated-v4.0 >actual &&
1721 test_cmp expect actual
1722 '
1723
1724 test_expect_success 'recursive tagging should give advice' '
1725 sed -e "s/|$//" <<-EOF >expect &&
1726 hint: You have created a nested tag. The object referred to by your new tag is
1727 hint: already a tag. If you meant to tag the object that it points to, use:
1728 hint: |
1729 hint: git tag -f nested annotated-v4.0^{}
1730 EOF
1731 git tag -m nested nested annotated-v4.0 2>actual &&
1732 test_i18ncmp expect actual
1733 '
1734
1735 test_expect_success 'multiple --points-at are OR-ed together' '
1736 cat >expect <<-\EOF &&
1737 v2.0
1738 v3.0
1739 EOF
1740 git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1741 test_cmp expect actual
1742 '
1743
1744 test_expect_success 'lexical sort' '
1745 git tag foo1.3 &&
1746 git tag foo1.6 &&
1747 git tag foo1.10 &&
1748 git tag -l --sort=refname "foo*" >actual &&
1749 cat >expect <<-\EOF &&
1750 foo1.10
1751 foo1.3
1752 foo1.6
1753 EOF
1754 test_cmp expect actual
1755 '
1756
1757 test_expect_success 'version sort' '
1758 git tag -l --sort=version:refname "foo*" >actual &&
1759 cat >expect <<-\EOF &&
1760 foo1.3
1761 foo1.6
1762 foo1.10
1763 EOF
1764 test_cmp expect actual
1765 '
1766
1767 test_expect_success 'reverse version sort' '
1768 git tag -l --sort=-version:refname "foo*" >actual &&
1769 cat >expect <<-\EOF &&
1770 foo1.10
1771 foo1.6
1772 foo1.3
1773 EOF
1774 test_cmp expect actual
1775 '
1776
1777 test_expect_success 'reverse lexical sort' '
1778 git tag -l --sort=-refname "foo*" >actual &&
1779 cat >expect <<-\EOF &&
1780 foo1.6
1781 foo1.3
1782 foo1.10
1783 EOF
1784 test_cmp expect actual
1785 '
1786
1787 test_expect_success 'configured lexical sort' '
1788 test_config tag.sort "v:refname" &&
1789 git tag -l "foo*" >actual &&
1790 cat >expect <<-\EOF &&
1791 foo1.3
1792 foo1.6
1793 foo1.10
1794 EOF
1795 test_cmp expect actual
1796 '
1797
1798 test_expect_success 'option override configured sort' '
1799 test_config tag.sort "v:refname" &&
1800 git tag -l --sort=-refname "foo*" >actual &&
1801 cat >expect <<-\EOF &&
1802 foo1.6
1803 foo1.3
1804 foo1.10
1805 EOF
1806 test_cmp expect actual
1807 '
1808
1809 test_expect_success 'invalid sort parameter on command line' '
1810 test_must_fail git tag -l --sort=notvalid "foo*" >actual
1811 '
1812
1813 test_expect_success 'invalid sort parameter in configuratoin' '
1814 test_config tag.sort "v:notvalid" &&
1815 test_must_fail git tag -l "foo*"
1816 '
1817
1818 test_expect_success 'version sort with prerelease reordering' '
1819 test_config versionsort.prereleaseSuffix -rc &&
1820 git tag foo1.6-rc1 &&
1821 git tag foo1.6-rc2 &&
1822 git tag -l --sort=version:refname "foo*" >actual &&
1823 cat >expect <<-\EOF &&
1824 foo1.3
1825 foo1.6-rc1
1826 foo1.6-rc2
1827 foo1.6
1828 foo1.10
1829 EOF
1830 test_cmp expect actual
1831 '
1832
1833 test_expect_success 'reverse version sort with prerelease reordering' '
1834 test_config versionsort.prereleaseSuffix -rc &&
1835 git tag -l --sort=-version:refname "foo*" >actual &&
1836 cat >expect <<-\EOF &&
1837 foo1.10
1838 foo1.6
1839 foo1.6-rc2
1840 foo1.6-rc1
1841 foo1.3
1842 EOF
1843 test_cmp expect actual
1844 '
1845
1846 test_expect_success 'version sort with prerelease reordering and common leading character' '
1847 test_config versionsort.prereleaseSuffix -before &&
1848 git tag foo1.7-before1 &&
1849 git tag foo1.7 &&
1850 git tag foo1.7-after1 &&
1851 git tag -l --sort=version:refname "foo1.7*" >actual &&
1852 cat >expect <<-\EOF &&
1853 foo1.7-before1
1854 foo1.7
1855 foo1.7-after1
1856 EOF
1857 test_cmp expect actual
1858 '
1859
1860 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1861 test_config versionsort.prereleaseSuffix -before &&
1862 git config --add versionsort.prereleaseSuffix -after &&
1863 git tag -l --sort=version:refname "foo1.7*" >actual &&
1864 cat >expect <<-\EOF &&
1865 foo1.7-before1
1866 foo1.7-after1
1867 foo1.7
1868 EOF
1869 test_cmp expect actual
1870 '
1871
1872 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1873 test_config versionsort.prereleaseSuffix -bar &&
1874 git config --add versionsort.prereleaseSuffix -foo-baz &&
1875 git config --add versionsort.prereleaseSuffix -foo-bar &&
1876 git tag foo1.8-foo-bar &&
1877 git tag foo1.8-foo-baz &&
1878 git tag foo1.8 &&
1879 git tag -l --sort=version:refname "foo1.8*" >actual &&
1880 cat >expect <<-\EOF &&
1881 foo1.8-foo-baz
1882 foo1.8-foo-bar
1883 foo1.8
1884 EOF
1885 test_cmp expect actual
1886 '
1887
1888 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1889 test_config versionsort.prereleaseSuffix -pre &&
1890 git config --add versionsort.prereleaseSuffix -prerelease &&
1891 git tag foo1.9-pre1 &&
1892 git tag foo1.9-pre2 &&
1893 git tag foo1.9-prerelease1 &&
1894 git tag -l --sort=version:refname "foo1.9*" >actual &&
1895 cat >expect <<-\EOF &&
1896 foo1.9-pre1
1897 foo1.9-pre2
1898 foo1.9-prerelease1
1899 EOF
1900 test_cmp expect actual
1901 '
1902
1903 test_expect_success 'version sort with general suffix reordering' '
1904 test_config versionsort.suffix -alpha &&
1905 git config --add versionsort.suffix -beta &&
1906 git config --add versionsort.suffix "" &&
1907 git config --add versionsort.suffix -gamma &&
1908 git config --add versionsort.suffix -delta &&
1909 git tag foo1.10-alpha &&
1910 git tag foo1.10-beta &&
1911 git tag foo1.10-gamma &&
1912 git tag foo1.10-delta &&
1913 git tag foo1.10-unlisted-suffix &&
1914 git tag -l --sort=version:refname "foo1.10*" >actual &&
1915 cat >expect <<-\EOF &&
1916 foo1.10-alpha
1917 foo1.10-beta
1918 foo1.10
1919 foo1.10-unlisted-suffix
1920 foo1.10-gamma
1921 foo1.10-delta
1922 EOF
1923 test_cmp expect actual
1924 '
1925
1926 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1927 test_config versionsort.suffix -before &&
1928 test_config versionsort.prereleaseSuffix -after &&
1929 git tag -l --sort=version:refname "foo1.7*" >actual &&
1930 cat >expect <<-\EOF &&
1931 foo1.7-before1
1932 foo1.7
1933 foo1.7-after1
1934 EOF
1935 test_cmp expect actual
1936 '
1937
1938 test_expect_success 'version sort with very long prerelease suffix' '
1939 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1940 git tag -l --sort=version:refname
1941 '
1942
1943 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1944 i=1 &&
1945 while test $i -lt 8000
1946 do
1947 echo "commit refs/heads/master
1948 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1949 data <<EOF
1950 commit #$i
1951 EOF"
1952 test $i = 1 && echo "from refs/heads/master^0"
1953 i=$(($i + 1))
1954 done | git fast-import &&
1955 git checkout master &&
1956 git tag far-far-away HEAD^ &&
1957 run_with_limited_stack git tag --contains HEAD >actual &&
1958 test_must_be_empty actual &&
1959 run_with_limited_stack git tag --no-contains HEAD >actual &&
1960 test_line_count "-gt" 10 actual
1961 '
1962
1963 test_expect_success '--format should list tags as per format given' '
1964 cat >expect <<-\EOF &&
1965 refname : refs/tags/v1.0
1966 refname : refs/tags/v1.0.1
1967 refname : refs/tags/v1.1.3
1968 EOF
1969 git tag -l --format="refname : %(refname)" "v1*" >actual &&
1970 test_cmp expect actual
1971 '
1972
1973 test_expect_success "set up color tests" '
1974 echo "<RED>v1.0<RESET>" >expect.color &&
1975 echo "v1.0" >expect.bare &&
1976 color_args="--format=%(color:red)%(refname:short) --list v1.0"
1977 '
1978
1979 test_expect_success '%(color) omitted without tty' '
1980 TERM=vt100 git tag $color_args >actual.raw &&
1981 test_decode_color <actual.raw >actual &&
1982 test_cmp expect.bare actual
1983 '
1984
1985 test_expect_success TTY '%(color) present with tty' '
1986 test_terminal git tag $color_args >actual.raw &&
1987 test_decode_color <actual.raw >actual &&
1988 test_cmp expect.color actual
1989 '
1990
1991 test_expect_success '--color overrides auto-color' '
1992 git tag --color $color_args >actual.raw &&
1993 test_decode_color <actual.raw >actual &&
1994 test_cmp expect.color actual
1995 '
1996
1997 test_expect_success 'color.ui=always overrides auto-color' '
1998 git -c color.ui=always tag $color_args >actual.raw &&
1999 test_decode_color <actual.raw >actual &&
2000 test_cmp expect.color actual
2001 '
2002
2003 test_expect_success 'setup --merged test tags' '
2004 git tag mergetest-1 HEAD~2 &&
2005 git tag mergetest-2 HEAD~1 &&
2006 git tag mergetest-3 HEAD
2007 '
2008
2009 test_expect_success '--merged can be used in non-list mode' '
2010 cat >expect <<-\EOF &&
2011 mergetest-1
2012 mergetest-2
2013 EOF
2014 git tag --merged=mergetest-2 "mergetest*" >actual &&
2015 test_cmp expect actual
2016 '
2017
2018 test_expect_success '--merged is incompatible with --no-merged' '
2019 test_must_fail git tag --merged HEAD --no-merged HEAD
2020 '
2021
2022 test_expect_success '--merged shows merged tags' '
2023 cat >expect <<-\EOF &&
2024 mergetest-1
2025 mergetest-2
2026 EOF
2027 git tag -l --merged=mergetest-2 mergetest-* >actual &&
2028 test_cmp expect actual
2029 '
2030
2031 test_expect_success '--no-merged show unmerged tags' '
2032 cat >expect <<-\EOF &&
2033 mergetest-3
2034 EOF
2035 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
2036 test_cmp expect actual
2037 '
2038
2039 test_expect_success '--no-merged can be used in non-list mode' '
2040 git tag --no-merged=mergetest-2 mergetest-* >actual &&
2041 test_cmp expect actual
2042 '
2043
2044 test_expect_success 'ambiguous branch/tags not marked' '
2045 git tag ambiguous &&
2046 git branch ambiguous &&
2047 echo ambiguous >expect &&
2048 git tag -l ambiguous >actual &&
2049 test_cmp expect actual
2050 '
2051
2052 test_expect_success '--contains combined with --no-contains' '
2053 (
2054 git init no-contains &&
2055 cd no-contains &&
2056 test_commit v0.1 &&
2057 test_commit v0.2 &&
2058 test_commit v0.3 &&
2059 test_commit v0.4 &&
2060 test_commit v0.5 &&
2061 cat >expected <<-\EOF &&
2062 v0.2
2063 v0.3
2064 v0.4
2065 EOF
2066 git tag --contains v0.2 --no-contains v0.5 >actual &&
2067 test_cmp expected actual
2068 )
2069 '
2070
2071 # As the docs say, list tags which contain a specified *commit*. We
2072 # don't recurse down to tags for trees or blobs pointed to by *those*
2073 # commits.
2074 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
2075 cd no-contains &&
2076 blob=$(git rev-parse v0.3:v0.3.t) &&
2077 tree=$(git rev-parse v0.3^{tree}) &&
2078 git tag tag-blob $blob &&
2079 git tag tag-tree $tree &&
2080 git tag --contains v0.3 >actual &&
2081 cat >expected <<-\EOF &&
2082 v0.3
2083 v0.4
2084 v0.5
2085 EOF
2086 test_cmp expected actual &&
2087 git tag --no-contains v0.3 >actual &&
2088 cat >expected <<-\EOF &&
2089 v0.1
2090 v0.2
2091 EOF
2092 test_cmp expected actual
2093 '
2094
2095 test_done