1#!/bin/sh 2# 3# Copyright (c) 2007 Carlos Rica 4# 5 6test_description='git tag 7 8Tests for operations with tags.' 9 10. ./test-lib.sh 11. "$TEST_DIRECTORY"/lib-gpg.sh 12. "$TEST_DIRECTORY"/lib-terminal.sh 13 14# creating and listing lightweight tags: 15 16tag_exists () { 17 git show-ref --quiet --verify refs/tags/"$1" 18} 19 20test_expect_success 'listing all tags in an empty tree should succeed'' 21 git tag -l && 22 git tag 23' 24 25test_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 30test_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 54test_expect_success 'looking for a tag in an empty tree should fail' \ 55'! (tag_exists mytag)' 56 57test_expect_success 'creating a tag in an empty tree should fail'' 58 test_must_fail git tag mynotag && 59 ! tag_exists mynotag 60' 61 62test_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 67test_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: 73test_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 83test_expect_success 'creating a tag with --create-reflog should create reflog'' 84 git log -1 \ 85 --format="format:tag: tagging %h (%s, %cd)%n" \ 86 --date=format:%Y-%m-%d >expected && 87 test_when_finished "git tag -d tag_with_reflog" && 88 git tag --create-reflog tag_with_reflog && 89 git reflog exists refs/tags/tag_with_reflog && 90 sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && 91 test_i18ncmp expected actual 92' 93 94test_expect_success 'annotated tag with --create-reflog has correct message'' 95 git log -1 \ 96 --format="format:tag: tagging %h (%s, %cd)%n" \ 97 --date=format:%Y-%m-%d >expected && 98 test_when_finished "git tag -d tag_with_reflog" && 99 git tag -m "annotated tag" --create-reflog tag_with_reflog && 100 git reflog exists refs/tags/tag_with_reflog && 101 sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && 102 test_i18ncmp expected actual 103' 104 105test_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 110test_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 117test_expect_success 'listing all tags if one exists should succeed'' 118 git tag -l && 119 git tag 120' 121 122cat>expect <<EOF 123mytag 124EOF 125test_expect_success 'Multiple -l or --list options are equivalent to one -l option'' 126 git tag -l -l >actual && 127 test_cmp expect actual && 128 git tag --list --list >actual && 129 test_cmp expect actual && 130 git tag --list -l --list >actual && 131 test_cmp expect actual 132' 133 134test_expect_success 'listing all tags if one exists should output that tag'' 135 test$(git tag -l)= mytag && 136 test$(git tag)= mytag 137' 138 139# pattern matching: 140 141test_expect_success 'listing a tag using a matching pattern should succeed' \ 142'git tag -l mytag' 143 144test_expect_success 'listing a tag with --ignore-case' \ 145'test$(git tag -l --ignore-case MYTAG)= mytag' 146 147test_expect_success \ 148'listing a tag using a matching pattern should output that tag' \ 149'test$(git tag -l mytag)= mytag' 150 151test_expect_success \ 152'listing tags using a non-matching pattern should succeed' \ 153'git tag -l xxx' 154 155test_expect_success \ 156'listing tags using a non-matching pattern should output nothing' \ 157'test$(git tag -l xxx | wc -l)-eq 0' 158 159# special cases for creating tags: 160 161test_expect_success \ 162'trying to create a tag with the name of one existing should fail' \ 163'test_must_fail git tag mytag' 164 165test_expect_success \ 166'trying to create a tag with a non-valid name should fail'' 167 test$(git tag -l | wc -l)-eq 1 && 168 test_must_fail git tag "" && 169 test_must_fail git tag .othertag && 170 test_must_fail git tag "other tag" && 171 test_must_fail git tag "othertag^" && 172 test_must_fail git tag "other~tag" && 173 test$(git tag -l | wc -l)-eq 1 174' 175 176test_expect_success 'creating a tag using HEAD directly should succeed'' 177 git tag myhead HEAD && 178 tag_exists myhead 179' 180 181test_expect_success '--force can create a tag with the name of one existing'' 182 tag_exists mytag && 183 git tag --force mytag && 184 tag_exists mytag' 185 186test_expect_success '--force is moot with a non-existing tag name'' 187 test_when_finished git tag -d newtag forcetag && 188 git tag newtag >expect && 189 git tag --force forcetag >actual && 190 test_cmp expect actual 191' 192 193# deleting tags: 194 195test_expect_success 'trying to delete an unknown tag should fail'' 196 ! tag_exists unknown-tag && 197 test_must_fail git tag -d unknown-tag 198' 199 200cat>expect <<EOF 201myhead 202mytag 203EOF 204test_expect_success \ 205'trying to delete tags without params should succeed and do nothing'' 206 git tag -l > actual && test_cmp expect actual && 207 git tag -d && 208 git tag -l > actual && test_cmp expect actual 209' 210 211test_expect_success \ 212'deleting two existing tags in one command should succeed'' 213 tag_exists mytag && 214 tag_exists myhead && 215 git tag -d mytag myhead && 216 ! tag_exists mytag && 217 ! tag_exists myhead 218' 219 220test_expect_success \ 221'creating a tag with the name of another deleted one should succeed'' 222 ! tag_exists mytag && 223 git tag mytag && 224 tag_exists mytag 225' 226 227test_expect_success \ 228'trying to delete two tags, existing and not, should fail in the 2nd'' 229 tag_exists mytag && 230 ! tag_exists myhead && 231 test_must_fail git tag -d mytag anothertag && 232 ! tag_exists mytag && 233 ! tag_exists myhead 234' 235 236test_expect_success 'trying to delete an already deleted tag should fail' \ 237'test_must_fail git tag -d mytag' 238 239# listing various tags with pattern matching: 240 241cat>expect <<EOF 242a1 243aa1 244cba 245t210 246t211 247v0.2.1 248v1.0 249v1.0.1 250v1.1.3 251EOF 252test_expect_success 'listing all tags should print them ordered'' 253 git tag v1.0.1 && 254 git tag t211 && 255 git tag aa1 && 256 git tag v0.2.1 && 257 git tag v1.1.3 && 258 git tag cba && 259 git tag a1 && 260 git tag v1.0 && 261 git tag t210 && 262 git tag -l > actual && 263 test_cmp expect actual && 264 git tag > actual && 265 test_cmp expect actual 266' 267 268cat>expect <<EOF 269a1 270aa1 271cba 272EOF 273test_expect_success \ 274'listing tags with substring as pattern must print those matching'' 275 rm *a* && 276 git tag -l "*a*" > current && 277 test_cmp expect current 278' 279 280cat>expect <<EOF 281v0.2.1 282v1.0.1 283EOF 284test_expect_success \ 285'listing tags with a suffix as pattern must print those matching'' 286 git tag -l "*.1" > actual && 287 test_cmp expect actual 288' 289 290cat>expect <<EOF 291t210 292t211 293EOF 294test_expect_success \ 295'listing tags with a prefix as pattern must print those matching'' 296 git tag -l "t21*" > actual && 297 test_cmp expect actual 298' 299 300cat>expect <<EOF 301a1 302EOF 303test_expect_success \ 304'listing tags using a name as pattern must print that one matching'' 305 git tag -l a1 > actual && 306 test_cmp expect actual 307' 308 309cat>expect <<EOF 310v1.0 311EOF 312test_expect_success \ 313'listing tags using a name as pattern must print that one matching'' 314 git tag -l v1.0 > actual && 315 test_cmp expect actual 316' 317 318cat>expect <<EOF 319v1.0.1 320v1.1.3 321EOF 322test_expect_success \ 323'listing tags with ? in the pattern should print those matching'' 324 git tag -l "v1.?.?" > actual && 325 test_cmp expect actual 326' 327 328test_expect_success \ 329'listing tags using v.* should print nothing because none have v.'' 330 git tag -l "v.*" > actual && 331 test_must_be_empty actual 332' 333 334cat>expect <<EOF 335v0.2.1 336v1.0 337v1.0.1 338v1.1.3 339EOF 340test_expect_success \ 341'listing tags using v* should print only those having v'' 342 git tag -l "v*" > actual && 343 test_cmp expect actual 344' 345 346test_expect_success 'tag -l can accept multiple patterns'' 347 git tag -l "v1*" "v0*" >actual && 348 test_cmp expect actual 349' 350 351# Between v1.7.7 & v2.13.0 a fair reading of the git-tag documentation 352# could leave you with the impression that "-l <pattern> -l <pattern>" 353# was how we wanted to accept multiple patterns. 354# 355# This test should not imply that this is a sane thing to support. but 356# since the documentation was worded like it was let's at least find 357# out if we're going to break this long-documented form of taking 358# multiple patterns. 359test_expect_success 'tag -l <pattern> -l <pattern> works, as our buggy documentation previously suggested'' 360 git tag -l "v1*" -l "v0*" >actual && 361 test_cmp expect actual 362' 363 364test_expect_success 'listing tags in column'' 365 COLUMNS=41 git tag -l --column=row >actual && 366 cat >expected <<\EOF && 367a1 aa1 cba t210 t211 368v0.2.1 v1.0 v1.0.1 v1.1.3 369EOF 370 test_cmp expected actual 371' 372 373test_expect_success 'listing tags in column with column.*'' 374 test_config column.tag row && 375 test_config column.ui dense && 376 COLUMNS=40 git tag -l >actual && 377 cat >expected <<\EOF && 378a1 aa1 cba t210 t211 379v0.2.1 v1.0 v1.0.1 v1.1.3 380EOF 381 test_cmp expected actual 382' 383 384test_expect_success 'listing tag with -n --column should fail'' 385 test_must_fail git tag --column -n 386' 387 388test_expect_success 'listing tags -n in column with column.ui ignored'' 389 test_config column.ui "row dense" && 390 COLUMNS=40 git tag -l -n >actual && 391 cat >expected <<\EOF && 392a1 Foo 393aa1 Foo 394cba Foo 395t210 Foo 396t211 Foo 397v0.2.1 Foo 398v1.0 Foo 399v1.0.1 Foo 400v1.1.3 Foo 401EOF 402 test_cmp expected actual 403' 404 405# creating and verifying lightweight tags: 406 407test_expect_success \ 408'a non-annotated tag created without parameters should point to HEAD'' 409 git tag non-annotated-tag && 410 test$(git cat-file -t non-annotated-tag)= commit && 411 test$(git rev-parse non-annotated-tag)=$(git rev-parse HEAD) 412' 413 414test_expect_success 'trying to verify an unknown tag should fail' \ 415'test_must_fail git tag -v unknown-tag' 416 417test_expect_success \ 418'trying to verify a non-annotated and non-signed tag should fail' \ 419'test_must_fail git tag -v non-annotated-tag' 420 421test_expect_success \ 422'trying to verify many non-annotated or unknown tags, should fail' \ 423'test_must_fail git tag -v unknown-tag1 non-annotated-tag unknown-tag2' 424 425# creating annotated tags: 426 427get_tag_msg () { 428 git cat-file tag "$1"|sed-e"/BEGIN PGP/q" 429} 430 431# run test_tick before committing always gives the time in that timezone 432get_tag_header () { 433cat<<EOF 434object$2 435type$3 436tag$1 437tagger C O Mitter <committer@example.com>$4-0700 438 439EOF 440} 441 442commit=$(git rev-parse HEAD) 443time=$test_tick 444 445get_tag_header annotated-tag$commit commit $time>expect 446echo"A message">>expect 447test_expect_success \ 448'creating an annotated tag with -m message should succeed'' 449 git tag -m "A message" annotated-tag && 450 get_tag_msg annotated-tag >actual && 451 test_cmp expect actual 452' 453 454get_tag_header annotated-tag-edit$commit commit $time>expect 455echo"An edited message">>expect 456test_expect_success 'set up editor'' 457 write_script fakeeditor <<-\EOF 458 sed -e "s/A message/An edited message/g" <"$1" >"$1-" 459 mv "$1-" "$1" 460 EOF 461' 462test_expect_success \ 463'creating an annotated tag with -m message --edit should succeed'' 464 GIT_EDITOR=./fakeeditor git tag -m "A message" --edit annotated-tag-edit && 465 get_tag_msg annotated-tag-edit >actual && 466 test_cmp expect actual 467' 468 469cat>msgfile <<EOF 470Another message 471in a file. 472EOF 473get_tag_header file-annotated-tag$commit commit $time>expect 474cat msgfile >>expect 475test_expect_success \ 476'creating an annotated tag with -F messagefile should succeed'' 477 git tag -F msgfile file-annotated-tag && 478 get_tag_msg file-annotated-tag >actual && 479 test_cmp expect actual 480' 481 482get_tag_header file-annotated-tag-edit$commit commit $time>expect 483sed-e"s/Another message/Another edited message/g" msgfile >>expect 484test_expect_success 'set up editor'' 485 write_script fakeeditor <<-\EOF 486 sed -e "s/Another message/Another edited message/g" <"$1" >"$1-" 487 mv "$1-" "$1" 488 EOF 489' 490test_expect_success \ 491'creating an annotated tag with -F messagefile --edit should succeed'' 492 GIT_EDITOR=./fakeeditor git tag -F msgfile --edit file-annotated-tag-edit && 493 get_tag_msg file-annotated-tag-edit >actual && 494 test_cmp expect actual 495' 496 497cat>inputmsg <<EOF 498A message from the 499standard input 500EOF 501get_tag_header stdin-annotated-tag$commit commit $time>expect 502cat inputmsg >>expect 503test_expect_success 'creating an annotated tag with -F - should succeed'' 504 git tag -F - stdin-annotated-tag <inputmsg && 505 get_tag_msg stdin-annotated-tag >actual && 506 test_cmp expect actual 507' 508 509test_expect_success \ 510'trying to create a tag with a non-existing -F file should fail'' 511 ! test -f nonexistingfile && 512 ! tag_exists notag && 513 test_must_fail git tag -F nonexistingfile notag && 514 ! tag_exists notag 515' 516 517test_expect_success \ 518'trying to create tags giving both -m or -F options should fail'' 519 echo "message file 1" >msgfile1 && 520 echo "message file 2" >msgfile2 && 521 ! tag_exists msgtag && 522 test_must_fail git tag -m "message 1" -F msgfile1 msgtag && 523 ! tag_exists msgtag && 524 test_must_fail git tag -F msgfile1 -m "message 1" msgtag && 525 ! tag_exists msgtag && 526 test_must_fail git tag -m "message 1" -F msgfile1 \ 527 -m "message 2" msgtag && 528 ! tag_exists msgtag 529' 530 531# blank and empty messages: 532 533get_tag_header empty-annotated-tag$commit commit $time>expect 534test_expect_success \ 535'creating a tag with an empty -m message should succeed'' 536 git tag -m "" empty-annotated-tag && 537 get_tag_msg empty-annotated-tag >actual && 538 test_cmp expect actual 539' 540 541>emptyfile 542get_tag_header emptyfile-annotated-tag$commit commit $time>expect 543test_expect_success \ 544'creating a tag with an empty -F messagefile should succeed'' 545 git tag -F emptyfile emptyfile-annotated-tag && 546 get_tag_msg emptyfile-annotated-tag >actual && 547 test_cmp expect actual 548' 549 550printf'\n\n \n\t\nLeading blank lines\n'>blanksfile 551printf'\n\t \t \nRepeated blank lines\n'>>blanksfile 552printf'\n\n\nTrailing spaces\t \n'>>blanksfile 553printf'\nTrailing blank lines\n\n\t \n\n'>>blanksfile 554get_tag_header blanks-annotated-tag$commit commit $time>expect 555cat>>expect <<EOF 556Leading blank lines 557 558Repeated blank lines 559 560Trailing spaces 561 562Trailing blank lines 563EOF 564test_expect_success \ 565'extra blanks in the message for an annotated tag should be removed'' 566 git tag -F blanksfile blanks-annotated-tag && 567 get_tag_msg blanks-annotated-tag >actual && 568 test_cmp expect actual 569' 570 571get_tag_header blank-annotated-tag$commit commit $time>expect 572test_expect_success \ 573'creating a tag with blank -m message with spaces should succeed'' 574 git tag -m " " blank-annotated-tag && 575 get_tag_msg blank-annotated-tag >actual && 576 test_cmp expect actual 577' 578 579echo' '>blankfile 580echo''>>blankfile 581echo' '>>blankfile 582get_tag_header blankfile-annotated-tag$commit commit $time>expect 583test_expect_success \ 584'creating a tag with blank -F messagefile with spaces should succeed'' 585 git tag -F blankfile blankfile-annotated-tag && 586 get_tag_msg blankfile-annotated-tag >actual && 587 test_cmp expect actual 588' 589 590printf' '>blanknonlfile 591get_tag_header blanknonlfile-annotated-tag$commit commit $time>expect 592test_expect_success \ 593'creating a tag with -F file of spaces and no newline should succeed'' 594 git tag -F blanknonlfile blanknonlfile-annotated-tag && 595 get_tag_msg blanknonlfile-annotated-tag >actual && 596 test_cmp expect actual 597' 598 599# messages with commented lines: 600 601cat>commentsfile <<EOF 602# A comment 603 604############ 605The message. 606############ 607One line. 608 609 610# commented lines 611# commented lines 612 613Another line. 614# comments 615 616Last line. 617EOF 618get_tag_header comments-annotated-tag$commit commit $time>expect 619cat>>expect <<EOF 620The message. 621One line. 622 623Another line. 624 625Last line. 626EOF 627test_expect_success \ 628'creating a tag using a -F messagefile with #comments should succeed'' 629 git tag -F commentsfile comments-annotated-tag && 630 get_tag_msg comments-annotated-tag >actual && 631 test_cmp expect actual 632' 633 634get_tag_header comment-annotated-tag$commit commit $time>expect 635test_expect_success \ 636'creating a tag with a #comment in the -m message should succeed'' 637 git tag -m "#comment" comment-annotated-tag && 638 get_tag_msg comment-annotated-tag >actual && 639 test_cmp expect actual 640' 641 642echo'#comment'>commentfile 643echo''>>commentfile 644echo'####'>>commentfile 645get_tag_header commentfile-annotated-tag$commit commit $time>expect 646test_expect_success \ 647'creating a tag with #comments in the -F messagefile should succeed'' 648 git tag -F commentfile commentfile-annotated-tag && 649 get_tag_msg commentfile-annotated-tag >actual && 650 test_cmp expect actual 651' 652 653printf'#comment'>commentnonlfile 654get_tag_header commentnonlfile-annotated-tag$commit commit $time>expect 655test_expect_success \ 656'creating a tag with a file of #comment and no newline should succeed'' 657 git tag -F commentnonlfile commentnonlfile-annotated-tag && 658 get_tag_msg commentnonlfile-annotated-tag >actual && 659 test_cmp expect actual 660' 661 662# listing messages for annotated non-signed tags: 663 664test_expect_success \ 665'listing the one-line message of a non-signed tag should succeed'' 666 git tag -m "A msg" tag-one-line && 667 668 echo "tag-one-line" >expect && 669 git tag -l | grep "^tag-one-line" >actual && 670 test_cmp expect actual && 671 git tag -n0 -l | grep "^tag-one-line" >actual && 672 test_cmp expect actual && 673 git tag -n0 -l tag-one-line >actual && 674 test_cmp expect actual && 675 676 git tag -n0 | grep "^tag-one-line" >actual && 677 test_cmp expect actual && 678 git tag -n0 tag-one-line >actual && 679 test_cmp expect actual && 680 681 echo "tag-one-line A msg" >expect && 682 git tag -n1 -l | grep "^tag-one-line" >actual && 683 test_cmp expect actual && 684 git tag -n -l | grep "^tag-one-line" >actual && 685 test_cmp expect actual && 686 git tag -n1 -l tag-one-line >actual && 687 test_cmp expect actual && 688 git tag -n2 -l tag-one-line >actual && 689 test_cmp expect actual && 690 git tag -n999 -l tag-one-line >actual && 691 test_cmp expect actual 692' 693 694test_expect_success 'The -n 100 invocation means -n --list 100, not -n100'' 695 git tag -n 100 >actual && 696 test_must_be_empty actual && 697 698 git tag -m "A msg" 100 && 699 echo "100 A msg" >expect && 700 git tag -n 100 >actual && 701 test_cmp expect actual 702' 703 704test_expect_success \ 705'listing the zero-lines message of a non-signed tag should succeed'' 706 git tag -m "" tag-zero-lines && 707 708 echo "tag-zero-lines" >expect && 709 git tag -l | grep "^tag-zero-lines" >actual && 710 test_cmp expect actual && 711 git tag -n0 -l | grep "^tag-zero-lines" >actual && 712 test_cmp expect actual && 713 git tag -n0 -l tag-zero-lines >actual && 714 test_cmp expect actual && 715 716 echo "tag-zero-lines " >expect && 717 git tag -n1 -l | grep "^tag-zero-lines" >actual && 718 test_cmp expect actual && 719 git tag -n -l | grep "^tag-zero-lines" >actual && 720 test_cmp expect actual && 721 git tag -n1 -l tag-zero-lines >actual && 722 test_cmp expect actual && 723 git tag -n2 -l tag-zero-lines >actual && 724 test_cmp expect actual && 725 git tag -n999 -l tag-zero-lines >actual && 726 test_cmp expect actual 727' 728 729echo'tag line one'>annotagmsg 730echo'tag line two'>>annotagmsg 731echo'tag line three'>>annotagmsg 732test_expect_success \ 733'listing many message lines of a non-signed tag should succeed'' 734 git tag -F annotagmsg tag-lines && 735 736 echo "tag-lines" >expect && 737 git tag -l | grep "^tag-lines" >actual && 738 test_cmp expect actual && 739 git tag -n0 -l | grep "^tag-lines" >actual && 740 test_cmp expect actual && 741 git tag -n0 -l tag-lines >actual && 742 test_cmp expect actual && 743 744 echo "tag-lines tag line one" >expect && 745 git tag -n1 -l | grep "^tag-lines" >actual && 746 test_cmp expect actual && 747 git tag -n -l | grep "^tag-lines" >actual && 748 test_cmp expect actual && 749 git tag -n1 -l tag-lines >actual && 750 test_cmp expect actual && 751 752 echo " tag line two" >>expect && 753 git tag -n2 -l | grep "^ *tag.line" >actual && 754 test_cmp expect actual && 755 git tag -n2 -l tag-lines >actual && 756 test_cmp expect actual && 757 758 echo " tag line three" >>expect && 759 git tag -n3 -l | grep "^ *tag.line" >actual && 760 test_cmp expect actual && 761 git tag -n3 -l tag-lines >actual && 762 test_cmp expect actual && 763 git tag -n4 -l | grep "^ *tag.line" >actual && 764 test_cmp expect actual && 765 git tag -n4 -l tag-lines >actual && 766 test_cmp expect actual && 767 git tag -n99 -l | grep "^ *tag.line" >actual && 768 test_cmp expect actual && 769 git tag -n99 -l tag-lines >actual && 770 test_cmp expect actual 771' 772 773test_expect_success 'annotations for blobs are empty'' 774 blob=$(git hash-object -w --stdin <<-\EOF 775 Blob paragraph 1. 776 777 Blob paragraph 2. 778 EOF 779 ) && 780 git tag tag-blob$blob&& 781 echo "tag-blob " >expect && 782 git tag -n1 -l tag-blob >actual && 783 test_cmp expect actual 784' 785 786# trying to verify annotated non-signed tags: 787 788test_expect_success GPG \ 789'trying to verify an annotated non-signed tag should fail'' 790 tag_exists annotated-tag && 791 test_must_fail git tag -v annotated-tag 792' 793 794test_expect_success GPG \ 795'trying to verify a file-annotated non-signed tag should fail'' 796 tag_exists file-annotated-tag && 797 test_must_fail git tag -v file-annotated-tag 798' 799 800test_expect_success GPG \ 801'trying to verify two annotated non-signed tags should fail'' 802 tag_exists annotated-tag file-annotated-tag && 803 test_must_fail git tag -v annotated-tag file-annotated-tag 804' 805 806# creating and verifying signed tags: 807 808get_tag_header signed-tag$commit commit $time>expect 809echo'A signed tag message'>>expect 810echo'-----BEGIN PGP SIGNATURE-----'>>expect 811test_expect_success GPG 'creating a signed tag with -m message should succeed'' 812 git tag -s -m "A signed tag message" signed-tag && 813 get_tag_msg signed-tag >actual && 814 test_cmp expect actual 815' 816 817get_tag_header u-signed-tag$commit commit $time>expect 818echo'Another message'>>expect 819echo'-----BEGIN PGP SIGNATURE-----'>>expect 820test_expect_success GPG 'sign with a given key id'' 821 822 git tag -u committer@example.com -m "Another message" u-signed-tag && 823 get_tag_msg u-signed-tag >actual && 824 test_cmp expect actual 825 826' 827 828test_expect_success GPG 'sign with an unknown id (1)'' 829 830 test_must_fail git tag -u author@example.com \ 831 -m "Another message" o-signed-tag 832 833' 834 835test_expect_success GPG 'sign with an unknown id (2)'' 836 837 test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag 838 839' 840 841cat>fakeeditor <<'EOF' 842#!/bin/sh 843test -n "$1" && exec >"$1" 844echo A signed tag message 845echo from a fake editor. 846EOF 847chmod+x fakeeditor 848 849get_tag_header implied-sign$commit commit $time>expect 850./fakeeditor >>expect 851echo'-----BEGIN PGP SIGNATURE-----'>>expect 852test_expect_success GPG '-u implies signed tag'' 853 GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign && 854 get_tag_msg implied-sign >actual && 855 test_cmp expect actual 856' 857 858cat>sigmsgfile <<EOF 859Another signed tag 860message in a file. 861EOF 862get_tag_header file-signed-tag$commit commit $time>expect 863cat sigmsgfile >>expect 864echo'-----BEGIN PGP SIGNATURE-----'>>expect 865test_expect_success GPG \ 866'creating a signed tag with -F messagefile should succeed'' 867 git tag -s -F sigmsgfile file-signed-tag && 868 get_tag_msg file-signed-tag >actual && 869 test_cmp expect actual 870' 871 872cat>siginputmsg <<EOF 873A signed tag message from 874the standard input 875EOF 876get_tag_header stdin-signed-tag$commit commit $time>expect 877cat siginputmsg >>expect 878echo'-----BEGIN PGP SIGNATURE-----'>>expect 879test_expect_success GPG 'creating a signed tag with -F - should succeed'' 880 git tag -s -F - stdin-signed-tag <siginputmsg && 881 get_tag_msg stdin-signed-tag >actual && 882 test_cmp expect actual 883' 884 885get_tag_header implied-annotate$commit commit $time>expect 886./fakeeditor >>expect 887echo'-----BEGIN PGP SIGNATURE-----'>>expect 888test_expect_success GPG '-s implies annotated tag'' 889 GIT_EDITOR=./fakeeditor git tag -s implied-annotate && 890 get_tag_msg implied-annotate >actual && 891 test_cmp expect actual 892' 893 894get_tag_header forcesignannotated-implied-sign$commit commit $time>expect 895echo"A message">>expect 896echo'-----BEGIN PGP SIGNATURE-----'>>expect 897test_expect_success GPG \ 898'git tag -s implied if configured with tag.forcesignannotated' \ 899'test_config tag.forcesignannotated true && 900 git tag -m "A message" forcesignannotated-implied-sign && 901 get_tag_msg forcesignannotated-implied-sign >actual && 902 test_cmp expect actual 903' 904 905test_expect_success GPG \ 906'lightweight with no message when configured with tag.forcesignannotated' \ 907'test_config tag.forcesignannotated true && 908 git tag forcesignannotated-lightweight && 909 tag_exists forcesignannotated-lightweight && 910 test_must_fail git tag -v forcesignannotated-no-message 911' 912 913get_tag_header forcesignannotated-annotate$commit commit $time>expect 914echo"A message">>expect 915test_expect_success GPG \ 916'git tag -a disable configured tag.forcesignannotated' \ 917'test_config tag.forcesignannotated true && 918 git tag -a -m "A message" forcesignannotated-annotate && 919 get_tag_msg forcesignannotated-annotate >actual && 920 test_cmp expect actual && 921 test_must_fail git tag -v forcesignannotated-annotate 922' 923 924get_tag_header forcesignannotated-disabled$commit commit $time>expect 925echo"A message">>expect 926echo'-----BEGIN PGP SIGNATURE-----'>>expect 927test_expect_success GPG \ 928'git tag --sign enable GPG sign' \ 929'test_config tag.forcesignannotated false && 930 git tag --sign -m "A message" forcesignannotated-disabled && 931 get_tag_msg forcesignannotated-disabled >actual && 932 test_cmp expect actual 933' 934 935test_expect_success GPG \ 936'trying to create a signed tag with non-existing -F file should fail'' 937 ! test -f nonexistingfile && 938 ! tag_exists nosigtag && 939 test_must_fail git tag -s -F nonexistingfile nosigtag && 940 ! tag_exists nosigtag 941' 942 943test_expect_success GPG 'verifying a signed tag should succeed' \ 944'git tag -v signed-tag' 945 946test_expect_success GPG 'verifying two signed tags in one command should succeed' \ 947'git tag -v signed-tag file-signed-tag' 948 949test_expect_success GPG \ 950'verifying many signed and non-signed tags should fail'' 951 test_must_fail git tag -v signed-tag annotated-tag && 952 test_must_fail git tag -v file-annotated-tag file-signed-tag && 953 test_must_fail git tag -v annotated-tag \ 954 file-signed-tag file-annotated-tag && 955 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag 956' 957 958test_expect_success GPG 'verifying a forged tag should fail'' 959 forged=$(git cat-file tag signed-tag | 960 sed -e "s/signed-tag/forged-tag/" | 961 git mktag) && 962 git tag forged-tag$forged&& 963 test_must_fail git tag -v forged-tag 964' 965 966test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly'' 967 cat >expect <<-\EOF && 968 tagname : signed-tag 969 EOF 970 git tag -v --format="tagname : %(tag)" "signed-tag" >actual && 971 test_cmp expect actual 972' 973 974test_expect_success GPG 'verifying a forged tag with --format should fail silently'' 975 test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual && 976 test_must_be_empty actual 977' 978 979# blank and empty messages for signed tags: 980 981get_tag_header empty-signed-tag$commit commit $time>expect 982echo'-----BEGIN PGP SIGNATURE-----'>>expect 983test_expect_success GPG \ 984'creating a signed tag with an empty -m message should succeed'' 985 git tag -s -m "" empty-signed-tag && 986 get_tag_msg empty-signed-tag >actual && 987 test_cmp expect actual && 988 git tag -v empty-signed-tag 989' 990 991>sigemptyfile 992get_tag_header emptyfile-signed-tag$commit commit $time>expect 993echo'-----BEGIN PGP SIGNATURE-----'>>expect 994test_expect_success GPG \ 995'creating a signed tag with an empty -F messagefile should succeed'' 996 git tag -s -F sigemptyfile emptyfile-signed-tag && 997 get_tag_msg emptyfile-signed-tag >actual && 998 test_cmp expect actual && 999 git tag -v emptyfile-signed-tag1000'10011002printf'\n\n \n\t\nLeading blank lines\n'> sigblanksfile1003printf'\n\t \t \nRepeated blank lines\n'>>sigblanksfile1004printf'\n\n\nTrailing spaces\t \n'>>sigblanksfile1005printf'\nTrailing blank lines\n\n\t \n\n'>>sigblanksfile1006get_tag_header blanks-signed-tag$commit commit $time>expect1007cat>>expect <<EOF1008Leading blank lines10091010Repeated blank lines10111012Trailing spaces10131014Trailing blank lines1015EOF1016echo'-----BEGIN PGP SIGNATURE-----'>>expect1017test_expect_success GPG \1018'extra blanks in the message for a signed tag should be removed''1019 git tag -s -F sigblanksfile blanks-signed-tag &&1020 get_tag_msg blanks-signed-tag >actual &&1021 test_cmp expect actual &&1022 git tag -v blanks-signed-tag1023'10241025get_tag_header blank-signed-tag$commit commit $time>expect1026echo'-----BEGIN PGP SIGNATURE-----'>>expect1027test_expect_success GPG \1028'creating a signed tag with a blank -m message should succeed''1029 git tag -s -m " " blank-signed-tag &&1030 get_tag_msg blank-signed-tag >actual &&1031 test_cmp expect actual &&1032 git tag -v blank-signed-tag1033'10341035echo' '>sigblankfile1036echo''>>sigblankfile1037echo' '>>sigblankfile1038get_tag_header blankfile-signed-tag$commit commit $time>expect1039echo'-----BEGIN PGP SIGNATURE-----'>>expect1040test_expect_success GPG \1041'creating a signed tag with blank -F file with spaces should succeed''1042 git tag -s -F sigblankfile blankfile-signed-tag &&1043 get_tag_msg blankfile-signed-tag >actual &&1044 test_cmp expect actual &&1045 git tag -v blankfile-signed-tag1046'10471048printf' '>sigblanknonlfile1049get_tag_header blanknonlfile-signed-tag$commit commit $time>expect1050echo'-----BEGIN PGP SIGNATURE-----'>>expect1051test_expect_success GPG \1052'creating a signed tag with spaces and no newline should succeed''1053 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&1054 get_tag_msg blanknonlfile-signed-tag >actual &&1055 test_cmp expect actual &&1056 git tag -v blanknonlfile-signed-tag1057'10581059test_expect_success GPG 'signed tag with embedded PGP message''1060 cat >msg <<-\EOF &&1061 -----BEGIN PGP MESSAGE-----10621063 this is not a real PGP message1064 -----END PGP MESSAGE-----1065 EOF1066 git tag -s -F msg confusing-pgp-message &&1067 git tag -v confusing-pgp-message1068'10691070# messages with commented lines for signed tags:10711072cat>sigcommentsfile <<EOF1073# A comment10741075############1076The message.1077############1078One line.107910801081# commented lines1082# commented lines10831084Another line.1085# comments10861087Last line.1088EOF1089get_tag_header comments-signed-tag$commit commit $time>expect1090cat>>expect <<EOF1091The message.1092One line.10931094Another line.10951096Last line.1097EOF1098echo'-----BEGIN PGP SIGNATURE-----'>>expect1099test_expect_success GPG \1100'creating a signed tag with a -F file with #comments should succeed''1101 git tag -s -F sigcommentsfile comments-signed-tag &&1102 get_tag_msg comments-signed-tag >actual &&1103 test_cmp expect actual &&1104 git tag -v comments-signed-tag1105'11061107get_tag_header comment-signed-tag$commit commit $time>expect1108echo'-----BEGIN PGP SIGNATURE-----'>>expect1109test_expect_success GPG \1110'creating a signed tag with #commented -m message should succeed''1111 git tag -s -m "#comment" comment-signed-tag &&1112 get_tag_msg comment-signed-tag >actual &&1113 test_cmp expect actual &&1114 git tag -v comment-signed-tag1115'11161117echo'#comment'>sigcommentfile1118echo''>>sigcommentfile1119echo'####'>>sigcommentfile1120get_tag_header commentfile-signed-tag$commit commit $time>expect1121echo'-----BEGIN PGP SIGNATURE-----'>>expect1122test_expect_success GPG \1123'creating a signed tag with #commented -F messagefile should succeed''1124 git tag -s -F sigcommentfile commentfile-signed-tag &&1125 get_tag_msg commentfile-signed-tag >actual &&1126 test_cmp expect actual &&1127 git tag -v commentfile-signed-tag1128'11291130printf'#comment'>sigcommentnonlfile1131get_tag_header commentnonlfile-signed-tag$commit commit $time>expect1132echo'-----BEGIN PGP SIGNATURE-----'>>expect1133test_expect_success GPG \1134'creating a signed tag with a #comment and no newline should succeed''1135 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&1136 get_tag_msg commentnonlfile-signed-tag >actual &&1137 test_cmp expect actual &&1138 git tag -v commentnonlfile-signed-tag1139'11401141# listing messages for signed tags:11421143test_expect_success GPG \1144'listing the one-line message of a signed tag should succeed''1145 git tag -s -m "A message line signed" stag-one-line &&11461147 echo "stag-one-line" >expect &&1148 git tag -l | grep "^stag-one-line" >actual &&1149 test_cmp expect actual &&1150 git tag -n0 -l | grep "^stag-one-line" >actual &&1151 test_cmp expect actual &&1152 git tag -n0 -l stag-one-line >actual &&1153 test_cmp expect actual &&11541155 echo "stag-one-line A message line signed" >expect &&1156 git tag -n1 -l | grep "^stag-one-line" >actual &&1157 test_cmp expect actual &&1158 git tag -n -l | grep "^stag-one-line" >actual &&1159 test_cmp expect actual &&1160 git tag -n1 -l stag-one-line >actual &&1161 test_cmp expect actual &&1162 git tag -n2 -l stag-one-line >actual &&1163 test_cmp expect actual &&1164 git tag -n999 -l stag-one-line >actual &&1165 test_cmp expect actual1166'11671168test_expect_success GPG \1169'listing the zero-lines message of a signed tag should succeed''1170 git tag -s -m "" stag-zero-lines &&11711172 echo "stag-zero-lines" >expect &&1173 git tag -l | grep "^stag-zero-lines" >actual &&1174 test_cmp expect actual &&1175 git tag -n0 -l | grep "^stag-zero-lines" >actual &&1176 test_cmp expect actual &&1177 git tag -n0 -l stag-zero-lines >actual &&1178 test_cmp expect actual &&11791180 echo "stag-zero-lines " >expect &&1181 git tag -n1 -l | grep "^stag-zero-lines" >actual &&1182 test_cmp expect actual &&1183 git tag -n -l | grep "^stag-zero-lines" >actual &&1184 test_cmp expect actual &&1185 git tag -n1 -l stag-zero-lines >actual &&1186 test_cmp expect actual &&1187 git tag -n2 -l stag-zero-lines >actual &&1188 test_cmp expect actual &&1189 git tag -n999 -l stag-zero-lines >actual &&1190 test_cmp expect actual1191'11921193echo'stag line one'>sigtagmsg1194echo'stag line two'>>sigtagmsg1195echo'stag line three'>>sigtagmsg1196test_expect_success GPG \1197'listing many message lines of a signed tag should succeed''1198 git tag -s -F sigtagmsg stag-lines &&11991200 echo "stag-lines" >expect &&1201 git tag -l | grep "^stag-lines" >actual &&1202 test_cmp expect actual &&1203 git tag -n0 -l | grep "^stag-lines" >actual &&1204 test_cmp expect actual &&1205 git tag -n0 -l stag-lines >actual &&1206 test_cmp expect actual &&12071208 echo "stag-lines stag line one" >expect &&1209 git tag -n1 -l | grep "^stag-lines" >actual &&1210 test_cmp expect actual &&1211 git tag -n -l | grep "^stag-lines" >actual &&1212 test_cmp expect actual &&1213 git tag -n1 -l stag-lines >actual &&1214 test_cmp expect actual &&12151216 echo " stag line two" >>expect &&1217 git tag -n2 -l | grep "^ *stag.line" >actual &&1218 test_cmp expect actual &&1219 git tag -n2 -l stag-lines >actual &&1220 test_cmp expect actual &&12211222 echo " stag line three" >>expect &&1223 git tag -n3 -l | grep "^ *stag.line" >actual &&1224 test_cmp expect actual &&1225 git tag -n3 -l stag-lines >actual &&1226 test_cmp expect actual &&1227 git tag -n4 -l | grep "^ *stag.line" >actual &&1228 test_cmp expect actual &&1229 git tag -n4 -l stag-lines >actual &&1230 test_cmp expect actual &&1231 git tag -n99 -l | grep "^ *stag.line" >actual &&1232 test_cmp expect actual &&1233 git tag -n99 -l stag-lines >actual &&1234 test_cmp expect actual1235'12361237# tags pointing to objects different from commits:12381239tree=$(git rev-parse HEAD^{tree})1240blob=$(git rev-parse HEAD:foo)1241tag=$(git rev-parse signed-tag 2>/dev/null)12421243get_tag_header tree-signed-tag$tree tree $time>expect1244echo"A message for a tree">>expect1245echo'-----BEGIN PGP SIGNATURE-----'>>expect1246test_expect_success GPG \1247'creating a signed tag pointing to a tree should succeed''1248 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&1249 get_tag_msg tree-signed-tag >actual &&1250 test_cmp expect actual1251'12521253get_tag_header blob-signed-tag$blob blob $time>expect1254echo"A message for a blob">>expect1255echo'-----BEGIN PGP SIGNATURE-----'>>expect1256test_expect_success GPG \1257'creating a signed tag pointing to a blob should succeed''1258 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&1259 get_tag_msg blob-signed-tag >actual &&1260 test_cmp expect actual1261'12621263get_tag_header tag-signed-tag$tag tag $time>expect1264echo"A message for another tag">>expect1265echo'-----BEGIN PGP SIGNATURE-----'>>expect1266test_expect_success GPG \1267'creating a signed tag pointing to another tag should succeed''1268 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&1269 get_tag_msg tag-signed-tag >actual &&1270 test_cmp expect actual1271'12721273# usage with rfc1991 signatures1274get_tag_header rfc1991-signed-tag$commit commit $time>expect1275echo"RFC1991 signed tag">>expect1276echo'-----BEGIN PGP MESSAGE-----'>>expect1277test_expect_success GPG,RFC1991 \1278'creating a signed tag with rfc1991''1279 echo "rfc1991" >gpghome/gpg.conf &&1280 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag$commit&&1281 get_tag_msg rfc1991-signed-tag >actual &&1282 test_cmp expect actual1283'12841285cat>fakeeditor <<'EOF'1286#!/bin/sh1287cp "$1" actual1288EOF1289chmod+x fakeeditor12901291test_expect_success GPG,RFC1991 \1292'reediting a signed tag body omits signature''1293 echo "rfc1991" >gpghome/gpg.conf &&1294 echo "RFC1991 signed tag" >expect &&1295 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1296 test_cmp expect actual1297'12981299test_expect_success GPG,RFC1991 \1300'verifying rfc1991 signature''1301 echo "rfc1991" >gpghome/gpg.conf &&1302 git tag -v rfc1991-signed-tag1303'13041305test_expect_success GPG,RFC1991 \1306'list tag with rfc1991 signature''1307 echo "rfc1991" >gpghome/gpg.conf &&1308 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1309 git tag -l -n1 rfc1991-signed-tag >actual &&1310 test_cmp expect actual &&1311 git tag -l -n2 rfc1991-signed-tag >actual &&1312 test_cmp expect actual &&1313 git tag -l -n999 rfc1991-signed-tag >actual &&1314 test_cmp expect actual1315'13161317rm-f gpghome/gpg.conf13181319test_expect_success GPG,RFC1991 \1320'verifying rfc1991 signature without --rfc1991''1321 git tag -v rfc1991-signed-tag1322'13231324test_expect_success GPG,RFC1991 \1325'list tag with rfc1991 signature without --rfc1991''1326 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1327 git tag -l -n1 rfc1991-signed-tag >actual &&1328 test_cmp expect actual &&1329 git tag -l -n2 rfc1991-signed-tag >actual &&1330 test_cmp expect actual &&1331 git tag -l -n999 rfc1991-signed-tag >actual &&1332 test_cmp expect actual1333'13341335test_expect_success GPG,RFC1991 \1336'reediting a signed tag body omits signature''1337 echo "RFC1991 signed tag" >expect &&1338 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1339 test_cmp expect actual1340'13411342# try to sign with bad user.signingkey1343test_expect_success GPG \1344'git tag -s fails if gpg is misconfigured (bad key)' \1345'test_config user.signingkey BobTheMouse &&1346 test_must_fail git tag -s -m tail tag-gpg-failure'13471348# try to produce invalid signature1349test_expect_success GPG \1350'git tag -s fails if gpg is misconfigured (bad signature format)' \1351'test_config gpg.program echo &&1352 test_must_fail git tag -s -m tail tag-gpg-failure'13531354# try to sign with bad user.signingkey1355test_expect_success GPGSM \1356'git tag -s fails if gpgsm is misconfigured (bad key)' \1357'test_config user.signingkey BobTheMouse &&1358 test_config gpg.format x509 &&1359 test_must_fail git tag -s -m tail tag-gpg-failure'13601361# try to produce invalid signature1362test_expect_success GPGSM \1363'git tag -s fails if gpgsm is misconfigured (bad signature format)' \1364'test_config gpg.x509.program echo &&1365 test_config gpg.format x509 &&1366 test_must_fail git tag -s -m tail tag-gpg-failure'13671368# try to verify without gpg:13691370rm-rf gpghome1371test_expect_success GPG \1372'verify signed tag fails when public key is not present' \1373'test_must_fail git tag -v signed-tag'13741375test_expect_success \1376'git tag -a fails if tag annotation is empty''1377 ! (GIT_EDITOR=cat git tag -a initial-comment)1378'13791380test_expect_success \1381'message in editor has initial comment''1382 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)1383'13841385test_expect_success 'message in editor has initial comment: first line''1386 # check the first line --- should be empty1387 echo >first.expect &&1388 sed -e 1q <actual >first.actual &&1389 test_i18ncmp first.expect first.actual1390'13911392test_expect_success \1393'message in editor has initial comment: remainder''1394 # remove commented lines from the remainder -- should be empty1395 sed -e 1d -e "/^#/d" <actual >rest.actual &&1396 test_must_be_empty rest.actual1397'13981399get_tag_header reuse $commit commit $time>expect1400echo"An annotation to be reused">> expect1401test_expect_success \1402'overwriting an annoted tag should use its previous body''1403 git tag -a -m "An annotation to be reused" reuse &&1404 GIT_EDITOR=true git tag -f -a reuse &&1405 get_tag_msg reuse >actual &&1406 test_cmp expect actual1407'14081409test_expect_success 'filename for the message is relative to cwd''1410 mkdir subdir &&1411 echo "Tag message in top directory" >msgfile-5 &&1412 echo "Tag message in sub directory" >subdir/msgfile-5 &&1413 (1414 cd subdir &&1415 git tag -a -F msgfile-5 tag-from-subdir1416 ) &&1417 git cat-file tag tag-from-subdir | grep "in sub directory"1418'14191420test_expect_success 'filename for the message is relative to cwd''1421 echo "Tag message in sub directory" >subdir/msgfile-6 &&1422 (1423 cd subdir &&1424 git tag -a -F msgfile-6 tag-from-subdir-21425 ) &&1426 git cat-file tag tag-from-subdir-2 | grep "in sub directory"1427'14281429# create a few more commits to test --contains14301431hash1=$(git rev-parse HEAD)14321433test_expect_success 'creating second commit and tag''1434 echo foo-2.0 >foo &&1435 git add foo &&1436 git commit -m second &&1437 git tag v2.01438'14391440hash2=$(git rev-parse HEAD)14411442test_expect_success 'creating third commit without tag''1443 echo foo-dev >foo &&1444 git add foo &&1445 git commit -m third1446'14471448hash3=$(git rev-parse HEAD)14491450# simple linear checks of --continue14511452cat> expected <<EOF1453v0.2.11454v1.01455v1.0.11456v1.1.31457v2.01458EOF14591460test_expect_success 'checking that first commit is in all tags (hash)'"1461 git tag -l --contains$hash1v* >actual &&1462 test_cmp expected actual1463"14641465# other ways of specifying the commit1466test_expect_success 'checking that first commit is in all tags (tag)'"1467 git tag -l --contains v1.0 v* >actual &&1468 test_cmp expected actual1469"14701471test_expect_success 'checking that first commit is in all tags (relative)'"1472 git tag -l --contains HEAD~2 v* >actual &&1473 test_cmp expected actual1474"14751476# All the --contains tests above, but with --no-contains1477test_expect_success 'checking that first commit is not listed in any tag with --no-contains (hash)'"1478 git tag -l --no-contains$hash1v* >actual &&1479 test_must_be_empty actual1480"14811482test_expect_success 'checking that first commit is in all tags (tag)'"1483 git tag -l --no-contains v1.0 v* >actual &&1484 test_must_be_empty actual1485"14861487test_expect_success 'checking that first commit is in all tags (relative)'"1488 git tag -l --no-contains HEAD~2 v* >actual &&1489 test_must_be_empty actual1490"14911492cat> expected <<EOF1493v2.01494EOF14951496test_expect_success 'checking that second commit only has one tag'"1497 git tag -l --contains$hash2v* >actual &&1498 test_cmp expected actual1499"15001501cat> expected <<EOF1502v0.2.11503v1.01504v1.0.11505v1.1.31506EOF15071508test_expect_success 'inverse of the last test, with --no-contains'"1509 git tag -l --no-contains$hash2v* >actual &&1510 test_cmp expected actual1511"15121513test_expect_success 'checking that third commit has no tags'"1514 git tag -l --contains$hash3v* >actual &&1515 test_must_be_empty actual1516"15171518cat> expected <<EOF1519v0.2.11520v1.01521v1.0.11522v1.1.31523v2.01524EOF15251526test_expect_success 'conversely --no-contains on the third commit lists all tags'"1527 git tag -l --no-contains$hash3v* >actual &&1528 test_cmp expected actual1529"15301531# how about a simple merge?15321533test_expect_success 'creating simple branch''1534 git branch stable v2.0 &&1535 git checkout stable &&1536 echo foo-3.0 > foo &&1537 git commit foo -m fourth &&1538 git tag v3.01539'15401541hash4=$(git rev-parse HEAD)15421543cat> expected <<EOF1544v3.01545EOF15461547test_expect_success 'checking that branch head only has one tag'"1548 git tag -l --contains$hash4v* >actual &&1549 test_cmp expected actual1550"15511552cat> expected <<EOF1553v0.2.11554v1.01555v1.0.11556v1.1.31557v2.01558EOF15591560test_expect_success 'checking that branch head with --no-contains lists all but one tag'"1561 git tag -l --no-contains$hash4v* >actual &&1562 test_cmp expected actual1563"15641565test_expect_success 'merging original branch into this branch''1566 git merge --strategy=ours master &&1567 git tag v4.01568'15691570cat> expected <<EOF1571v4.01572EOF15731574test_expect_success 'checking that original branch head has one tag now'"1575 git tag -l --contains$hash3v* >actual &&1576 test_cmp expected actual1577"15781579cat> expected <<EOF1580v0.2.11581v1.01582v1.0.11583v1.1.31584v2.01585v3.01586EOF15871588test_expect_success 'checking that original branch head with --no-contains lists all but one tag now'"1589 git tag -l --no-contains$hash3v* >actual &&1590 test_cmp expected actual1591"15921593cat> expected <<EOF1594v0.2.11595v1.01596v1.0.11597v1.1.31598v2.01599v3.01600v4.01601EOF16021603test_expect_success 'checking that initial commit is in all tags'"1604 git tag -l --contains$hash1v* >actual &&1605 test_cmp expected actual1606"16071608test_expect_success 'checking that --contains can be used in non-list mode''1609 git tag --contains$hash1v* >actual &&1610 test_cmp expected actual1611'16121613test_expect_success 'checking that initial commit is in all tags with --no-contains'"1614 git tag -l --no-contains$hash1v* >actual &&1615 test_must_be_empty actual1616"16171618# mixing modes and options:16191620test_expect_success 'mixing incompatibles modes and options is forbidden''1621 test_must_fail git tag -a &&1622 test_must_fail git tag -a -l &&1623 test_must_fail git tag -s &&1624 test_must_fail git tag -s -l &&1625 test_must_fail git tag -m &&1626 test_must_fail git tag -m -l &&1627 test_must_fail git tag -m "hlagh" &&1628 test_must_fail git tag -m "hlagh" -l &&1629 test_must_fail git tag -F &&1630 test_must_fail git tag -F -l &&1631 test_must_fail git tag -f &&1632 test_must_fail git tag -f -l &&1633 test_must_fail git tag -a -s -m -F &&1634 test_must_fail git tag -a -s -m -F -l &&1635 test_must_fail git tag -l -v &&1636 test_must_fail git tag -l -d &&1637 test_must_fail git tag -l -v -d &&1638 test_must_fail git tag -n 100 -v &&1639 test_must_fail git tag -l -m msg &&1640 test_must_fail git tag -l -F some file &&1641 test_must_fail git tag -v -s &&1642 test_must_fail git tag --contains tag-tree &&1643 test_must_fail git tag --contains tag-blob &&1644 test_must_fail git tag --no-contains tag-tree &&1645 test_must_fail git tag --no-contains tag-blob &&1646 test_must_fail git tag --contains --no-contains &&1647 test_must_fail git tag --no-with HEAD &&1648 test_must_fail git tag --no-without HEAD1649'16501651for option in--contains --with --no-contains --without --merged --no-merged --points-at1652do1653 test_expect_success "mixing incompatible modes with$optionis forbidden""1654 test_must_fail git tag -d$optionHEAD &&1655 test_must_fail git tag -d$optionHEAD some-tag &&1656 test_must_fail git tag -v$optionHEAD1657 "1658 test_expect_success "Doing 'git tag --list-like$option<commit> <pattern> is permitted""1659 git tag -n$optionHEAD HEAD &&1660 git tag$optionHEAD HEAD &&1661 git tag$option1662 "1663done16641665# check points-at16661667test_expect_success '--points-at can be used in non-list mode''1668 echo v4.0 >expect &&1669 git tag --points-at=v4.0 "v*" >actual &&1670 test_cmp expect actual1671'16721673test_expect_success '--points-at is a synonym for --points-at HEAD''1674 echo v4.0 >expect &&1675 git tag --points-at >actual &&1676 test_cmp expect actual1677'16781679test_expect_success '--points-at finds lightweight tags''1680 echo v4.0 >expect &&1681 git tag --points-at v4.0 >actual &&1682 test_cmp expect actual1683'16841685test_expect_success '--points-at finds annotated tags of commits''1686 git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&1687 echo annotated-v4.0 >expect &&1688 git tag -l --points-at v4.0 "annotated*" >actual &&1689 test_cmp expect actual1690'16911692test_expect_success '--points-at finds annotated tags of tags''1693 git tag -m "describing the v4.0 tag object" \1694 annotated-again-v4.0 annotated-v4.0 &&1695 cat >expect <<-\EOF &&1696 annotated-again-v4.01697 annotated-v4.01698 EOF1699 git tag --points-at=annotated-v4.0 >actual &&1700 test_cmp expect actual1701'17021703test_expect_success 'recursive tagging should give advice''1704 sed -e "s/|$//" <<-EOF >expect &&1705 hint: You have created a nested tag. The object referred to by your new is1706 hint: already a tag. If you meant to tag the object that it points to, use:1707 hint: |1708 hint: git tag -f nested annotated-v4.0^{}1709 EOF1710 git tag -m nested nested annotated-v4.0 2>actual &&1711 test_i18ncmp expect actual1712'17131714test_expect_success 'multiple --points-at are OR-ed together''1715 cat >expect <<-\EOF &&1716 v2.01717 v3.01718 EOF1719 git tag --points-at=v2.0 --points-at=v3.0 >actual &&1720 test_cmp expect actual1721'17221723test_expect_success 'lexical sort''1724 git tag foo1.3 &&1725 git tag foo1.6 &&1726 git tag foo1.10 &&1727 git tag -l --sort=refname "foo*" >actual &&1728 cat >expect <<-\EOF &&1729 foo1.101730 foo1.31731 foo1.61732 EOF1733 test_cmp expect actual1734'17351736test_expect_success 'version sort''1737 git tag -l --sort=version:refname "foo*" >actual &&1738 cat >expect <<-\EOF &&1739 foo1.31740 foo1.61741 foo1.101742 EOF1743 test_cmp expect actual1744'17451746test_expect_success 'reverse version sort''1747 git tag -l --sort=-version:refname "foo*" >actual &&1748 cat >expect <<-\EOF &&1749 foo1.101750 foo1.61751 foo1.31752 EOF1753 test_cmp expect actual1754'17551756test_expect_success 'reverse lexical sort''1757 git tag -l --sort=-refname "foo*" >actual &&1758 cat >expect <<-\EOF &&1759 foo1.61760 foo1.31761 foo1.101762 EOF1763 test_cmp expect actual1764'17651766test_expect_success 'configured lexical sort''1767 test_config tag.sort "v:refname" &&1768 git tag -l "foo*" >actual &&1769 cat >expect <<-\EOF &&1770 foo1.31771 foo1.61772 foo1.101773 EOF1774 test_cmp expect actual1775'17761777test_expect_success 'option override configured sort''1778 test_config tag.sort "v:refname" &&1779 git tag -l --sort=-refname "foo*" >actual &&1780 cat >expect <<-\EOF &&1781 foo1.61782 foo1.31783 foo1.101784 EOF1785 test_cmp expect actual1786'17871788test_expect_success 'invalid sort parameter on command line''1789 test_must_fail git tag -l --sort=notvalid "foo*" >actual1790'17911792test_expect_success 'invalid sort parameter in configuratoin''1793 test_config tag.sort "v:notvalid" &&1794 test_must_fail git tag -l "foo*"1795'17961797test_expect_success 'version sort with prerelease reordering''1798 test_config versionsort.prereleaseSuffix -rc &&1799 git tag foo1.6-rc1 &&1800 git tag foo1.6-rc2 &&1801 git tag -l --sort=version:refname "foo*" >actual &&1802 cat >expect <<-\EOF &&1803 foo1.31804 foo1.6-rc11805 foo1.6-rc21806 foo1.61807 foo1.101808 EOF1809 test_cmp expect actual1810'18111812test_expect_success 'reverse version sort with prerelease reordering''1813 test_config versionsort.prereleaseSuffix -rc &&1814 git tag -l --sort=-version:refname "foo*" >actual &&1815 cat >expect <<-\EOF &&1816 foo1.101817 foo1.61818 foo1.6-rc21819 foo1.6-rc11820 foo1.31821 EOF1822 test_cmp expect actual1823'18241825test_expect_success 'version sort with prerelease reordering and common leading character''1826 test_config versionsort.prereleaseSuffix -before &&1827 git tag foo1.7-before1 &&1828 git tag foo1.7 &&1829 git tag foo1.7-after1 &&1830 git tag -l --sort=version:refname "foo1.7*" >actual &&1831 cat >expect <<-\EOF &&1832 foo1.7-before11833 foo1.71834 foo1.7-after11835 EOF1836 test_cmp expect actual1837'18381839test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character''1840 test_config versionsort.prereleaseSuffix -before &&1841 git config --add versionsort.prereleaseSuffix -after &&1842 git tag -l --sort=version:refname "foo1.7*" >actual &&1843 cat >expect <<-\EOF &&1844 foo1.7-before11845 foo1.7-after11846 foo1.71847 EOF1848 test_cmp expect actual1849'18501851test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag''1852 test_config versionsort.prereleaseSuffix -bar &&1853 git config --add versionsort.prereleaseSuffix -foo-baz &&1854 git config --add versionsort.prereleaseSuffix -foo-bar &&1855 git tag foo1.8-foo-bar &&1856 git tag foo1.8-foo-baz &&1857 git tag foo1.8 &&1858 git tag -l --sort=version:refname "foo1.8*" >actual &&1859 cat >expect <<-\EOF &&1860 foo1.8-foo-baz1861 foo1.8-foo-bar1862 foo1.81863 EOF1864 test_cmp expect actual1865'18661867test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position''1868 test_config versionsort.prereleaseSuffix -pre &&1869 git config --add versionsort.prereleaseSuffix -prerelease &&1870 git tag foo1.9-pre1 &&1871 git tag foo1.9-pre2 &&1872 git tag foo1.9-prerelease1 &&1873 git tag -l --sort=version:refname "foo1.9*" >actual &&1874 cat >expect <<-\EOF &&1875 foo1.9-pre11876 foo1.9-pre21877 foo1.9-prerelease11878 EOF1879 test_cmp expect actual1880'18811882test_expect_success 'version sort with general suffix reordering''1883 test_config versionsort.suffix -alpha &&1884 git config --add versionsort.suffix -beta &&1885 git config --add versionsort.suffix "" &&1886 git config --add versionsort.suffix -gamma &&1887 git config --add versionsort.suffix -delta &&1888 git tag foo1.10-alpha &&1889 git tag foo1.10-beta &&1890 git tag foo1.10-gamma &&1891 git tag foo1.10-delta &&1892 git tag foo1.10-unlisted-suffix &&1893 git tag -l --sort=version:refname "foo1.10*" >actual &&1894 cat >expect <<-\EOF &&1895 foo1.10-alpha1896 foo1.10-beta1897 foo1.101898 foo1.10-unlisted-suffix1899 foo1.10-gamma1900 foo1.10-delta1901 EOF1902 test_cmp expect actual1903'19041905test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix''1906 test_config versionsort.suffix -before &&1907 test_config versionsort.prereleaseSuffix -after &&1908 git tag -l --sort=version:refname "foo1.7*" >actual &&1909 cat >expect <<-\EOF &&1910 foo1.7-before11911 foo1.71912 foo1.7-after11913 EOF1914 test_cmp expect actual1915'19161917test_expect_success 'version sort with very long prerelease suffix''1918 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&1919 git tag -l --sort=version:refname1920'19211922test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo''1923 i=1 &&1924 while test$i-lt 80001925 do1926 echo "commit refs/heads/master1927committer A U Thor <author@example.com>$((1000000000 + $i * 100)) +02001928data <<EOF1929commit #$i1930EOF"1931 test$i= 1 && echo "from refs/heads/master^0"1932 i=$(($i + 1))1933 done | git fast-import &&1934 git checkout master &&1935 git tag far-far-away HEAD^ &&1936 run_with_limited_stack git tag --contains HEAD >actual &&1937 test_must_be_empty actual &&1938 run_with_limited_stack git tag --no-contains HEAD >actual &&1939 test_line_count "-gt" 10 actual1940'19411942test_expect_success '--format should list tags as per format given''1943 cat >expect <<-\EOF &&1944 refname : refs/tags/v1.01945 refname : refs/tags/v1.0.11946 refname : refs/tags/v1.1.31947 EOF1948 git tag -l --format="refname : %(refname)" "v1*" >actual &&1949 test_cmp expect actual1950'19511952test_expect_success "set up color tests"'1953 echo "<RED>v1.0<RESET>" >expect.color &&1954 echo "v1.0" >expect.bare &&1955 color_args="--format=%(color:red)%(refname:short) --list v1.0"1956'19571958test_expect_success '%(color) omitted without tty''1959 TERM=vt100 git tag$color_args>actual.raw &&1960 test_decode_color <actual.raw >actual &&1961 test_cmp expect.bare actual1962'19631964test_expect_success TTY '%(color) present with tty''1965 test_terminal git tag$color_args>actual.raw &&1966 test_decode_color <actual.raw >actual &&1967 test_cmp expect.color actual1968'19691970test_expect_success '--color overrides auto-color''1971 git tag --color$color_args>actual.raw &&1972 test_decode_color <actual.raw >actual &&1973 test_cmp expect.color actual1974'19751976test_expect_success 'color.ui=always overrides auto-color''1977 git -c color.ui=always tag$color_args>actual.raw &&1978 test_decode_color <actual.raw >actual &&1979 test_cmp expect.color actual1980'19811982test_expect_success 'setup --merged test tags''1983 git tag mergetest-1 HEAD~2 &&1984 git tag mergetest-2 HEAD~1 &&1985 git tag mergetest-3 HEAD1986'19871988test_expect_success '--merged can be used in non-list mode''1989 cat >expect <<-\EOF &&1990 mergetest-11991 mergetest-21992 EOF1993 git tag --merged=mergetest-2 "mergetest*" >actual &&1994 test_cmp expect actual1995'19961997test_expect_success '--merged is incompatible with --no-merged''1998 test_must_fail git tag --merged HEAD --no-merged HEAD1999'20002001test_expect_success '--merged shows merged tags''2002 cat >expect <<-\EOF &&2003 mergetest-12004 mergetest-22005 EOF2006 git tag -l --merged=mergetest-2 mergetest-* >actual &&2007 test_cmp expect actual2008'20092010test_expect_success '--no-merged show unmerged tags''2011 cat >expect <<-\EOF &&2012 mergetest-32013 EOF2014 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&2015 test_cmp expect actual2016'20172018test_expect_success '--no-merged can be used in non-list mode''2019 git tag --no-merged=mergetest-2 mergetest-* >actual &&2020 test_cmp expect actual2021'20222023test_expect_success 'ambiguous branch/tags not marked''2024 git tag ambiguous &&2025 git branch ambiguous &&2026 echo ambiguous >expect &&2027 git tag -l ambiguous >actual &&2028 test_cmp expect actual2029'20302031test_expect_success '--contains combined with --no-contains''2032 (2033 git init no-contains &&2034 cd no-contains &&2035 test_commit v0.1 &&2036 test_commit v0.2 &&2037 test_commit v0.3 &&2038 test_commit v0.4 &&2039 test_commit v0.5 &&2040 cat >expected <<-\EOF &&2041 v0.22042 v0.32043 v0.42044 EOF2045 git tag --contains v0.2 --no-contains v0.5 >actual &&2046 test_cmp expected actual2047 )2048'20492050# As the docs say, list tags which contain a specified *commit*. We2051# don't recurse down to tags for trees or blobs pointed to by *those*2052# commits.2053test_expect_success 'Does --[no-]contains stop at commits? Yes!''2054 cd no-contains &&2055 blob=$(git rev-parse v0.3:v0.3.t)&&2056 tree=$(git rev-parse v0.3^{tree})&&2057 git tag tag-blob$blob&&2058 git tag tag-tree$tree&&2059 git tag --contains v0.3 >actual &&2060 cat >expected <<-\EOF &&2061 v0.32062 v0.42063 v0.52064 EOF2065 test_cmp expected actual &&2066 git tag --no-contains v0.3 >actual &&2067 cat >expected <<-\EOF &&2068 v0.12069 v0.22070 EOF2071 test_cmp expected actual2072'20732074test_done