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