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