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 13# creating and listing lightweight tags: 14 15tag_exists () { 16 git show-ref --quiet --verify refs/tags/"$1" 17} 18 19test_expect_success 'listing all tags in an empty tree should succeed'' 20 git tag -l && 21 git tag 22' 23 24test_expect_success 'listing all tags in an empty tree should output nothing'' 25 test$(git tag -l | wc -l)-eq 0 && 26 test$(git tag | wc -l)-eq 0 27' 28 29test_expect_success 'sort tags, ignore case'' 30 ( 31 git init sort && 32 cd sort && 33 test_commit initial && 34 git tag tag-one && 35 git tag TAG-two && 36 git tag -l >actual && 37 cat >expected <<-\EOF && 38 TAG-two 39 initial 40 tag-one 41 EOF 42 test_cmp expected actual && 43 git tag -l -i >actual && 44 cat >expected <<-\EOF && 45 initial 46 tag-one 47 TAG-two 48 EOF 49 test_cmp expected actual 50 ) 51' 52 53test_expect_success 'looking for a tag in an empty tree should fail' \ 54'! (tag_exists mytag)' 55 56test_expect_success 'creating a tag in an empty tree should fail'' 57 test_must_fail git tag mynotag && 58 ! tag_exists mynotag 59' 60 61test_expect_success 'creating a tag for HEAD in an empty tree should fail'' 62 test_must_fail git tag mytaghead HEAD && 63 ! tag_exists mytaghead 64' 65 66test_expect_success 'creating a tag for an unknown revision should fail'' 67 test_must_fail git tag mytagnorev aaaaaaaaaaa && 68 ! tag_exists mytagnorev 69' 70 71# commit used in the tests, test_tick is also called here to freeze the date: 72test_expect_success 'creating a tag using default HEAD should succeed'' 73 test_config core.logAllRefUpdates true && 74 test_tick && 75 echo foo >foo && 76 git add foo && 77 git commit -m Foo && 78 git tag mytag && 79 test_must_fail git reflog exists refs/tags/mytag 80' 81 82test_expect_success 'creating a tag with --create-reflog should create reflog'' 83 git log -1 \ 84 --format="format:tag: tagging %h (%s, %cd)%n" \ 85 --date=format:%Y-%m-%d >expected && 86 test_when_finished "git tag -d tag_with_reflog" && 87 git tag --create-reflog tag_with_reflog && 88 git reflog exists refs/tags/tag_with_reflog && 89 sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && 90 test_i18ncmp expected actual 91' 92 93test_expect_success 'annotated tag with --create-reflog has correct message'' 94 git log -1 \ 95 --format="format:tag: tagging %h (%s, %cd)%n" \ 96 --date=format:%Y-%m-%d >expected && 97 test_when_finished "git tag -d tag_with_reflog" && 98 git tag -m "annotated tag" --create-reflog tag_with_reflog && 99 git reflog exists refs/tags/tag_with_reflog && 100 sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && 101 test_i18ncmp expected actual 102' 103 104test_expect_success '--create-reflog does not create reflog on failure'' 105 test_must_fail git tag --create-reflog mytag && 106 test_must_fail git reflog exists refs/tags/mytag 107' 108 109test_expect_success 'option core.logAllRefUpdates=always creates reflog'' 110 test_when_finished "git tag -d tag_with_reflog" && 111 test_config core.logAllRefUpdates always && 112 git tag tag_with_reflog && 113 git reflog exists refs/tags/tag_with_reflog 114' 115 116test_expect_success 'listing all tags if one exists should succeed'' 117 git tag -l && 118 git tag 119' 120 121cat>expect <<EOF 122mytag 123EOF 124test_expect_success 'Multiple -l or --list options are equivalent to one -l option'' 125 git tag -l -l >actual && 126 test_cmp expect actual && 127 git tag --list --list >actual && 128 test_cmp expect actual && 129 git tag --list -l --list >actual && 130 test_cmp expect actual 131' 132 133test_expect_success 'listing all tags if one exists should output that tag'' 134 test$(git tag -l)= mytag && 135 test$(git tag)= mytag 136' 137 138# pattern matching: 139 140test_expect_success 'listing a tag using a matching pattern should succeed' \ 141'git tag -l mytag' 142 143test_expect_success 'listing a tag with --ignore-case' \ 144'test$(git tag -l --ignore-case MYTAG)= mytag' 145 146test_expect_success \ 147'listing a tag using a matching pattern should output that tag' \ 148'test$(git tag -l mytag)= mytag' 149 150test_expect_success \ 151'listing tags using a non-matching pattern should succeed' \ 152'git tag -l xxx' 153 154test_expect_success \ 155'listing tags using a non-matching pattern should output nothing' \ 156'test$(git tag -l xxx | wc -l)-eq 0' 157 158# special cases for creating tags: 159 160test_expect_success \ 161'trying to create a tag with the name of one existing should fail' \ 162'test_must_fail git tag mytag' 163 164test_expect_success \ 165'trying to create a tag with a non-valid name should fail'' 166 test$(git tag -l | wc -l)-eq 1 && 167 test_must_fail git tag "" && 168 test_must_fail git tag .othertag && 169 test_must_fail git tag "other tag" && 170 test_must_fail git tag "othertag^" && 171 test_must_fail git tag "other~tag" && 172 test$(git tag -l | wc -l)-eq 1 173' 174 175test_expect_success 'creating a tag using HEAD directly should succeed'' 176 git tag myhead HEAD && 177 tag_exists myhead 178' 179 180test_expect_success '--force can create a tag with the name of one existing'' 181 tag_exists mytag && 182 git tag --force mytag && 183 tag_exists mytag' 184 185test_expect_success '--force is moot with a non-existing tag name'' 186 test_when_finished git tag -d newtag forcetag && 187 git tag newtag >expect && 188 git tag --force forcetag >actual && 189 test_cmp expect actual 190' 191 192# deleting tags: 193 194test_expect_success 'trying to delete an unknown tag should fail'' 195 ! tag_exists unknown-tag && 196 test_must_fail git tag -d unknown-tag 197' 198 199cat>expect <<EOF 200myhead 201mytag 202EOF 203test_expect_success \ 204'trying to delete tags without params should succeed and do nothing'' 205 git tag -l > actual && test_cmp expect actual && 206 git tag -d && 207 git tag -l > actual && test_cmp expect actual 208' 209 210test_expect_success \ 211'deleting two existing tags in one command should succeed'' 212 tag_exists mytag && 213 tag_exists myhead && 214 git tag -d mytag myhead && 215 ! tag_exists mytag && 216 ! tag_exists myhead 217' 218 219test_expect_success \ 220'creating a tag with the name of another deleted one should succeed'' 221 ! tag_exists mytag && 222 git tag mytag && 223 tag_exists mytag 224' 225 226test_expect_success \ 227'trying to delete two tags, existing and not, should fail in the 2nd'' 228 tag_exists mytag && 229 ! tag_exists myhead && 230 test_must_fail git tag -d mytag anothertag && 231 ! tag_exists mytag && 232 ! tag_exists myhead 233' 234 235test_expect_success 'trying to delete an already deleted tag should fail' \ 236'test_must_fail git tag -d mytag' 237 238# listing various tags with pattern matching: 239 240cat>expect <<EOF 241a1 242aa1 243cba 244t210 245t211 246v0.2.1 247v1.0 248v1.0.1 249v1.1.3 250EOF 251test_expect_success 'listing all tags should print them ordered'' 252 git tag v1.0.1 && 253 git tag t211 && 254 git tag aa1 && 255 git tag v0.2.1 && 256 git tag v1.1.3 && 257 git tag cba && 258 git tag a1 && 259 git tag v1.0 && 260 git tag t210 && 261 git tag -l > actual && 262 test_cmp expect actual && 263 git tag > actual && 264 test_cmp expect actual 265' 266 267cat>expect <<EOF 268a1 269aa1 270cba 271EOF 272test_expect_success \ 273'listing tags with substring as pattern must print those matching'' 274 rm *a* && 275 git tag -l "*a*" > current && 276 test_cmp expect current 277' 278 279cat>expect <<EOF 280v0.2.1 281v1.0.1 282EOF 283test_expect_success \ 284'listing tags with a suffix as pattern must print those matching'' 285 git tag -l "*.1" > actual && 286 test_cmp expect actual 287' 288 289cat>expect <<EOF 290t210 291t211 292EOF 293test_expect_success \ 294'listing tags with a prefix as pattern must print those matching'' 295 git tag -l "t21*" > actual && 296 test_cmp expect actual 297' 298 299cat>expect <<EOF 300a1 301EOF 302test_expect_success \ 303'listing tags using a name as pattern must print that one matching'' 304 git tag -l a1 > actual && 305 test_cmp expect actual 306' 307 308cat>expect <<EOF 309v1.0 310EOF 311test_expect_success \ 312'listing tags using a name as pattern must print that one matching'' 313 git tag -l v1.0 > actual && 314 test_cmp expect actual 315' 316 317cat>expect <<EOF 318v1.0.1 319v1.1.3 320EOF 321test_expect_success \ 322'listing tags with ? in the pattern should print those matching'' 323 git tag -l "v1.?.?" > actual && 324 test_cmp expect actual 325' 326 327>expect 328test_expect_success \ 329'listing tags using v.* should print nothing because none have v.'' 330 git tag -l "v.*" > actual && 331 test_cmp expect 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=40 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 454cat>msgfile <<EOF 455Another message 456in a file. 457EOF 458get_tag_header file-annotated-tag$commit commit $time>expect 459cat msgfile >>expect 460test_expect_success \ 461'creating an annotated tag with -F messagefile should succeed'' 462 git tag -F msgfile file-annotated-tag && 463 get_tag_msg file-annotated-tag >actual && 464 test_cmp expect actual 465' 466 467cat>inputmsg <<EOF 468A message from the 469standard input 470EOF 471get_tag_header stdin-annotated-tag$commit commit $time>expect 472cat inputmsg >>expect 473test_expect_success 'creating an annotated tag with -F - should succeed'' 474 git tag -F - stdin-annotated-tag <inputmsg && 475 get_tag_msg stdin-annotated-tag >actual && 476 test_cmp expect actual 477' 478 479test_expect_success \ 480'trying to create a tag with a non-existing -F file should fail'' 481 ! test -f nonexistingfile && 482 ! tag_exists notag && 483 test_must_fail git tag -F nonexistingfile notag && 484 ! tag_exists notag 485' 486 487test_expect_success \ 488'trying to create tags giving both -m or -F options should fail'' 489 echo "message file 1" >msgfile1 && 490 echo "message file 2" >msgfile2 && 491 ! tag_exists msgtag && 492 test_must_fail git tag -m "message 1" -F msgfile1 msgtag && 493 ! tag_exists msgtag && 494 test_must_fail git tag -F msgfile1 -m "message 1" msgtag && 495 ! tag_exists msgtag && 496 test_must_fail git tag -m "message 1" -F msgfile1 \ 497 -m "message 2" msgtag && 498 ! tag_exists msgtag 499' 500 501# blank and empty messages: 502 503get_tag_header empty-annotated-tag$commit commit $time>expect 504test_expect_success \ 505'creating a tag with an empty -m message should succeed'' 506 git tag -m "" empty-annotated-tag && 507 get_tag_msg empty-annotated-tag >actual && 508 test_cmp expect actual 509' 510 511>emptyfile 512get_tag_header emptyfile-annotated-tag$commit commit $time>expect 513test_expect_success \ 514'creating a tag with an empty -F messagefile should succeed'' 515 git tag -F emptyfile emptyfile-annotated-tag && 516 get_tag_msg emptyfile-annotated-tag >actual && 517 test_cmp expect actual 518' 519 520printf'\n\n \n\t\nLeading blank lines\n'>blanksfile 521printf'\n\t \t \nRepeated blank lines\n'>>blanksfile 522printf'\n\n\nTrailing spaces\t \n'>>blanksfile 523printf'\nTrailing blank lines\n\n\t \n\n'>>blanksfile 524get_tag_header blanks-annotated-tag$commit commit $time>expect 525cat>>expect <<EOF 526Leading blank lines 527 528Repeated blank lines 529 530Trailing spaces 531 532Trailing blank lines 533EOF 534test_expect_success \ 535'extra blanks in the message for an annotated tag should be removed'' 536 git tag -F blanksfile blanks-annotated-tag && 537 get_tag_msg blanks-annotated-tag >actual && 538 test_cmp expect actual 539' 540 541get_tag_header blank-annotated-tag$commit commit $time>expect 542test_expect_success \ 543'creating a tag with blank -m message with spaces should succeed'' 544 git tag -m " " blank-annotated-tag && 545 get_tag_msg blank-annotated-tag >actual && 546 test_cmp expect actual 547' 548 549echo' '>blankfile 550echo''>>blankfile 551echo' '>>blankfile 552get_tag_header blankfile-annotated-tag$commit commit $time>expect 553test_expect_success \ 554'creating a tag with blank -F messagefile with spaces should succeed'' 555 git tag -F blankfile blankfile-annotated-tag && 556 get_tag_msg blankfile-annotated-tag >actual && 557 test_cmp expect actual 558' 559 560printf' '>blanknonlfile 561get_tag_header blanknonlfile-annotated-tag$commit commit $time>expect 562test_expect_success \ 563'creating a tag with -F file of spaces and no newline should succeed'' 564 git tag -F blanknonlfile blanknonlfile-annotated-tag && 565 get_tag_msg blanknonlfile-annotated-tag >actual && 566 test_cmp expect actual 567' 568 569# messages with commented lines: 570 571cat>commentsfile <<EOF 572# A comment 573 574############ 575The message. 576############ 577One line. 578 579 580# commented lines 581# commented lines 582 583Another line. 584# comments 585 586Last line. 587EOF 588get_tag_header comments-annotated-tag$commit commit $time>expect 589cat>>expect <<EOF 590The message. 591One line. 592 593Another line. 594 595Last line. 596EOF 597test_expect_success \ 598'creating a tag using a -F messagefile with #comments should succeed'' 599 git tag -F commentsfile comments-annotated-tag && 600 get_tag_msg comments-annotated-tag >actual && 601 test_cmp expect actual 602' 603 604get_tag_header comment-annotated-tag$commit commit $time>expect 605test_expect_success \ 606'creating a tag with a #comment in the -m message should succeed'' 607 git tag -m "#comment" comment-annotated-tag && 608 get_tag_msg comment-annotated-tag >actual && 609 test_cmp expect actual 610' 611 612echo'#comment'>commentfile 613echo''>>commentfile 614echo'####'>>commentfile 615get_tag_header commentfile-annotated-tag$commit commit $time>expect 616test_expect_success \ 617'creating a tag with #comments in the -F messagefile should succeed'' 618 git tag -F commentfile commentfile-annotated-tag && 619 get_tag_msg commentfile-annotated-tag >actual && 620 test_cmp expect actual 621' 622 623printf'#comment'>commentnonlfile 624get_tag_header commentnonlfile-annotated-tag$commit commit $time>expect 625test_expect_success \ 626'creating a tag with a file of #comment and no newline should succeed'' 627 git tag -F commentnonlfile commentnonlfile-annotated-tag && 628 get_tag_msg commentnonlfile-annotated-tag >actual && 629 test_cmp expect actual 630' 631 632# listing messages for annotated non-signed tags: 633 634test_expect_success \ 635'listing the one-line message of a non-signed tag should succeed'' 636 git tag -m "A msg" tag-one-line && 637 638 echo "tag-one-line" >expect && 639 git tag -l | grep "^tag-one-line" >actual && 640 test_cmp expect actual && 641 git tag -n0 -l | grep "^tag-one-line" >actual && 642 test_cmp expect actual && 643 git tag -n0 -l tag-one-line >actual && 644 test_cmp expect actual && 645 646 git tag -n0 | grep "^tag-one-line" >actual && 647 test_cmp expect actual && 648 git tag -n0 tag-one-line >actual && 649 test_cmp expect actual && 650 651 echo "tag-one-line A msg" >expect && 652 git tag -n1 -l | grep "^tag-one-line" >actual && 653 test_cmp expect actual && 654 git tag -n -l | grep "^tag-one-line" >actual && 655 test_cmp expect actual && 656 git tag -n1 -l tag-one-line >actual && 657 test_cmp expect actual && 658 git tag -n2 -l tag-one-line >actual && 659 test_cmp expect actual && 660 git tag -n999 -l tag-one-line >actual && 661 test_cmp expect actual 662' 663 664test_expect_success 'The -n 100 invocation means -n --list 100, not -n100'' 665 >expect && 666 git tag -n 100 >actual && 667 test_cmp expect actual && 668 669 git tag -m "A msg" 100 && 670 echo "100 A msg" >expect && 671 git tag -n 100 >actual && 672 test_cmp expect actual 673' 674 675test_expect_success \ 676'listing the zero-lines message of a non-signed tag should succeed'' 677 git tag -m "" tag-zero-lines && 678 679 echo "tag-zero-lines" >expect && 680 git tag -l | grep "^tag-zero-lines" >actual && 681 test_cmp expect actual && 682 git tag -n0 -l | grep "^tag-zero-lines" >actual && 683 test_cmp expect actual && 684 git tag -n0 -l tag-zero-lines >actual && 685 test_cmp expect actual && 686 687 echo "tag-zero-lines " >expect && 688 git tag -n1 -l | grep "^tag-zero-lines" >actual && 689 test_cmp expect actual && 690 git tag -n -l | grep "^tag-zero-lines" >actual && 691 test_cmp expect actual && 692 git tag -n1 -l tag-zero-lines >actual && 693 test_cmp expect actual && 694 git tag -n2 -l tag-zero-lines >actual && 695 test_cmp expect actual && 696 git tag -n999 -l tag-zero-lines >actual && 697 test_cmp expect actual 698' 699 700echo'tag line one'>annotagmsg 701echo'tag line two'>>annotagmsg 702echo'tag line three'>>annotagmsg 703test_expect_success \ 704'listing many message lines of a non-signed tag should succeed'' 705 git tag -F annotagmsg tag-lines && 706 707 echo "tag-lines" >expect && 708 git tag -l | grep "^tag-lines" >actual && 709 test_cmp expect actual && 710 git tag -n0 -l | grep "^tag-lines" >actual && 711 test_cmp expect actual && 712 git tag -n0 -l tag-lines >actual && 713 test_cmp expect actual && 714 715 echo "tag-lines tag line one" >expect && 716 git tag -n1 -l | grep "^tag-lines" >actual && 717 test_cmp expect actual && 718 git tag -n -l | grep "^tag-lines" >actual && 719 test_cmp expect actual && 720 git tag -n1 -l tag-lines >actual && 721 test_cmp expect actual && 722 723 echo " tag line two" >>expect && 724 git tag -n2 -l | grep "^ *tag.line" >actual && 725 test_cmp expect actual && 726 git tag -n2 -l tag-lines >actual && 727 test_cmp expect actual && 728 729 echo " tag line three" >>expect && 730 git tag -n3 -l | grep "^ *tag.line" >actual && 731 test_cmp expect actual && 732 git tag -n3 -l tag-lines >actual && 733 test_cmp expect actual && 734 git tag -n4 -l | grep "^ *tag.line" >actual && 735 test_cmp expect actual && 736 git tag -n4 -l tag-lines >actual && 737 test_cmp expect actual && 738 git tag -n99 -l | grep "^ *tag.line" >actual && 739 test_cmp expect actual && 740 git tag -n99 -l tag-lines >actual && 741 test_cmp expect actual 742' 743 744test_expect_success 'annotations for blobs are empty'' 745 blob=$(git hash-object -w --stdin <<-\EOF 746 Blob paragraph 1. 747 748 Blob paragraph 2. 749 EOF 750 ) && 751 git tag tag-blob$blob&& 752 echo "tag-blob " >expect && 753 git tag -n1 -l tag-blob >actual && 754 test_cmp expect actual 755' 756 757# trying to verify annotated non-signed tags: 758 759test_expect_success GPG \ 760'trying to verify an annotated non-signed tag should fail'' 761 tag_exists annotated-tag && 762 test_must_fail git tag -v annotated-tag 763' 764 765test_expect_success GPG \ 766'trying to verify a file-annotated non-signed tag should fail'' 767 tag_exists file-annotated-tag && 768 test_must_fail git tag -v file-annotated-tag 769' 770 771test_expect_success GPG \ 772'trying to verify two annotated non-signed tags should fail'' 773 tag_exists annotated-tag file-annotated-tag && 774 test_must_fail git tag -v annotated-tag file-annotated-tag 775' 776 777# creating and verifying signed tags: 778 779get_tag_header signed-tag$commit commit $time>expect 780echo'A signed tag message'>>expect 781echo'-----BEGIN PGP SIGNATURE-----'>>expect 782test_expect_success GPG 'creating a signed tag with -m message should succeed'' 783 git tag -s -m "A signed tag message" signed-tag && 784 get_tag_msg signed-tag >actual && 785 test_cmp expect actual 786' 787 788get_tag_header u-signed-tag$commit commit $time>expect 789echo'Another message'>>expect 790echo'-----BEGIN PGP SIGNATURE-----'>>expect 791test_expect_success GPG 'sign with a given key id'' 792 793 git tag -u committer@example.com -m "Another message" u-signed-tag && 794 get_tag_msg u-signed-tag >actual && 795 test_cmp expect actual 796 797' 798 799test_expect_success GPG 'sign with an unknown id (1)'' 800 801 test_must_fail git tag -u author@example.com \ 802 -m "Another message" o-signed-tag 803 804' 805 806test_expect_success GPG 'sign with an unknown id (2)'' 807 808 test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag 809 810' 811 812cat>fakeeditor <<'EOF' 813#!/bin/sh 814test -n "$1" && exec >"$1" 815echo A signed tag message 816echo from a fake editor. 817EOF 818chmod+x fakeeditor 819 820get_tag_header implied-sign$commit commit $time>expect 821./fakeeditor >>expect 822echo'-----BEGIN PGP SIGNATURE-----'>>expect 823test_expect_success GPG '-u implies signed tag'' 824 GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign && 825 get_tag_msg implied-sign >actual && 826 test_cmp expect actual 827' 828 829cat>sigmsgfile <<EOF 830Another signed tag 831message in a file. 832EOF 833get_tag_header file-signed-tag$commit commit $time>expect 834cat sigmsgfile >>expect 835echo'-----BEGIN PGP SIGNATURE-----'>>expect 836test_expect_success GPG \ 837'creating a signed tag with -F messagefile should succeed'' 838 git tag -s -F sigmsgfile file-signed-tag && 839 get_tag_msg file-signed-tag >actual && 840 test_cmp expect actual 841' 842 843cat>siginputmsg <<EOF 844A signed tag message from 845the standard input 846EOF 847get_tag_header stdin-signed-tag$commit commit $time>expect 848cat siginputmsg >>expect 849echo'-----BEGIN PGP SIGNATURE-----'>>expect 850test_expect_success GPG 'creating a signed tag with -F - should succeed'' 851 git tag -s -F - stdin-signed-tag <siginputmsg && 852 get_tag_msg stdin-signed-tag >actual && 853 test_cmp expect actual 854' 855 856get_tag_header implied-annotate$commit commit $time>expect 857./fakeeditor >>expect 858echo'-----BEGIN PGP SIGNATURE-----'>>expect 859test_expect_success GPG '-s implies annotated tag'' 860 GIT_EDITOR=./fakeeditor git tag -s implied-annotate && 861 get_tag_msg implied-annotate >actual && 862 test_cmp expect actual 863' 864 865get_tag_header forcesignannotated-implied-sign$commit commit $time>expect 866echo"A message">>expect 867echo'-----BEGIN PGP SIGNATURE-----'>>expect 868test_expect_success GPG \ 869'git tag -s implied if configured with tag.forcesignannotated' \ 870'test_config tag.forcesignannotated true && 871 git tag -m "A message" forcesignannotated-implied-sign && 872 get_tag_msg forcesignannotated-implied-sign >actual && 873 test_cmp expect actual 874' 875 876test_expect_success GPG \ 877'lightweight with no message when configured with tag.forcesignannotated' \ 878'test_config tag.forcesignannotated true && 879 git tag forcesignannotated-lightweight && 880 tag_exists forcesignannotated-lightweight && 881 test_must_fail git tag -v forcesignannotated-no-message 882' 883 884get_tag_header forcesignannotated-annotate$commit commit $time>expect 885echo"A message">>expect 886test_expect_success GPG \ 887'git tag -a disable configured tag.forcesignannotated' \ 888'test_config tag.forcesignannotated true && 889 git tag -a -m "A message" forcesignannotated-annotate && 890 get_tag_msg forcesignannotated-annotate >actual && 891 test_cmp expect actual && 892 test_must_fail git tag -v forcesignannotated-annotate 893' 894 895get_tag_header forcesignannotated-disabled$commit commit $time>expect 896echo"A message">>expect 897echo'-----BEGIN PGP SIGNATURE-----'>>expect 898test_expect_success GPG \ 899'git tag --sign enable GPG sign' \ 900'test_config tag.forcesignannotated false && 901 git tag --sign -m "A message" forcesignannotated-disabled && 902 get_tag_msg forcesignannotated-disabled >actual && 903 test_cmp expect actual 904' 905 906test_expect_success GPG \ 907'trying to create a signed tag with non-existing -F file should fail'' 908 ! test -f nonexistingfile && 909 ! tag_exists nosigtag && 910 test_must_fail git tag -s -F nonexistingfile nosigtag && 911 ! tag_exists nosigtag 912' 913 914test_expect_success GPG 'verifying a signed tag should succeed' \ 915'git tag -v signed-tag' 916 917test_expect_success GPG 'verifying two signed tags in one command should succeed' \ 918'git tag -v signed-tag file-signed-tag' 919 920test_expect_success GPG \ 921'verifying many signed and non-signed tags should fail'' 922 test_must_fail git tag -v signed-tag annotated-tag && 923 test_must_fail git tag -v file-annotated-tag file-signed-tag && 924 test_must_fail git tag -v annotated-tag \ 925 file-signed-tag file-annotated-tag && 926 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag 927' 928 929test_expect_success GPG 'verifying a forged tag should fail'' 930 forged=$(git cat-file tag signed-tag | 931 sed -e "s/signed-tag/forged-tag/" | 932 git mktag) && 933 git tag forged-tag$forged&& 934 test_must_fail git tag -v forged-tag 935' 936 937test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly'' 938 cat >expect <<-\EOF && 939 tagname : signed-tag 940 EOF 941 git tag -v --format="tagname : %(tag)" "signed-tag" >actual && 942 test_cmp expect actual 943' 944 945test_expect_success GPG 'verifying a forged tag with --format should fail silently'' 946 >expect && 947 test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual && 948 test_cmp expect actual 949' 950 951# blank and empty messages for signed tags: 952 953get_tag_header empty-signed-tag$commit commit $time>expect 954echo'-----BEGIN PGP SIGNATURE-----'>>expect 955test_expect_success GPG \ 956'creating a signed tag with an empty -m message should succeed'' 957 git tag -s -m "" empty-signed-tag && 958 get_tag_msg empty-signed-tag >actual && 959 test_cmp expect actual && 960 git tag -v empty-signed-tag 961' 962 963>sigemptyfile 964get_tag_header emptyfile-signed-tag$commit commit $time>expect 965echo'-----BEGIN PGP SIGNATURE-----'>>expect 966test_expect_success GPG \ 967'creating a signed tag with an empty -F messagefile should succeed'' 968 git tag -s -F sigemptyfile emptyfile-signed-tag && 969 get_tag_msg emptyfile-signed-tag >actual && 970 test_cmp expect actual && 971 git tag -v emptyfile-signed-tag 972' 973 974printf'\n\n \n\t\nLeading blank lines\n'> sigblanksfile 975printf'\n\t \t \nRepeated blank lines\n'>>sigblanksfile 976printf'\n\n\nTrailing spaces\t \n'>>sigblanksfile 977printf'\nTrailing blank lines\n\n\t \n\n'>>sigblanksfile 978get_tag_header blanks-signed-tag$commit commit $time>expect 979cat>>expect <<EOF 980Leading blank lines 981 982Repeated blank lines 983 984Trailing spaces 985 986Trailing blank lines 987EOF 988echo'-----BEGIN PGP SIGNATURE-----'>>expect 989test_expect_success GPG \ 990'extra blanks in the message for a signed tag should be removed'' 991 git tag -s -F sigblanksfile blanks-signed-tag && 992 get_tag_msg blanks-signed-tag >actual && 993 test_cmp expect actual && 994 git tag -v blanks-signed-tag 995' 996 997get_tag_header blank-signed-tag$commit commit $time>expect 998echo'-----BEGIN PGP SIGNATURE-----'>>expect 999test_expect_success GPG \1000'creating a signed tag with a blank -m message should succeed''1001 git tag -s -m " " blank-signed-tag &&1002 get_tag_msg blank-signed-tag >actual &&1003 test_cmp expect actual &&1004 git tag -v blank-signed-tag1005'10061007echo' '>sigblankfile1008echo''>>sigblankfile1009echo' '>>sigblankfile1010get_tag_header blankfile-signed-tag$commit commit $time>expect1011echo'-----BEGIN PGP SIGNATURE-----'>>expect1012test_expect_success GPG \1013'creating a signed tag with blank -F file with spaces should succeed''1014 git tag -s -F sigblankfile blankfile-signed-tag &&1015 get_tag_msg blankfile-signed-tag >actual &&1016 test_cmp expect actual &&1017 git tag -v blankfile-signed-tag1018'10191020printf' '>sigblanknonlfile1021get_tag_header blanknonlfile-signed-tag$commit commit $time>expect1022echo'-----BEGIN PGP SIGNATURE-----'>>expect1023test_expect_success GPG \1024'creating a signed tag with spaces and no newline should succeed''1025 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&1026 get_tag_msg blanknonlfile-signed-tag >actual &&1027 test_cmp expect actual &&1028 git tag -v signed-tag1029'10301031# messages with commented lines for signed tags:10321033cat>sigcommentsfile <<EOF1034# A comment10351036############1037The message.1038############1039One line.104010411042# commented lines1043# commented lines10441045Another line.1046# comments10471048Last line.1049EOF1050get_tag_header comments-signed-tag$commit commit $time>expect1051cat>>expect <<EOF1052The message.1053One line.10541055Another line.10561057Last line.1058EOF1059echo'-----BEGIN PGP SIGNATURE-----'>>expect1060test_expect_success GPG \1061'creating a signed tag with a -F file with #comments should succeed''1062 git tag -s -F sigcommentsfile comments-signed-tag &&1063 get_tag_msg comments-signed-tag >actual &&1064 test_cmp expect actual &&1065 git tag -v comments-signed-tag1066'10671068get_tag_header comment-signed-tag$commit commit $time>expect1069echo'-----BEGIN PGP SIGNATURE-----'>>expect1070test_expect_success GPG \1071'creating a signed tag with #commented -m message should succeed''1072 git tag -s -m "#comment" comment-signed-tag &&1073 get_tag_msg comment-signed-tag >actual &&1074 test_cmp expect actual &&1075 git tag -v comment-signed-tag1076'10771078echo'#comment'>sigcommentfile1079echo''>>sigcommentfile1080echo'####'>>sigcommentfile1081get_tag_header commentfile-signed-tag$commit commit $time>expect1082echo'-----BEGIN PGP SIGNATURE-----'>>expect1083test_expect_success GPG \1084'creating a signed tag with #commented -F messagefile should succeed''1085 git tag -s -F sigcommentfile commentfile-signed-tag &&1086 get_tag_msg commentfile-signed-tag >actual &&1087 test_cmp expect actual &&1088 git tag -v commentfile-signed-tag1089'10901091printf'#comment'>sigcommentnonlfile1092get_tag_header commentnonlfile-signed-tag$commit commit $time>expect1093echo'-----BEGIN PGP SIGNATURE-----'>>expect1094test_expect_success GPG \1095'creating a signed tag with a #comment and no newline should succeed''1096 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&1097 get_tag_msg commentnonlfile-signed-tag >actual &&1098 test_cmp expect actual &&1099 git tag -v commentnonlfile-signed-tag1100'11011102# listing messages for signed tags:11031104test_expect_success GPG \1105'listing the one-line message of a signed tag should succeed''1106 git tag -s -m "A message line signed" stag-one-line &&11071108 echo "stag-one-line" >expect &&1109 git tag -l | grep "^stag-one-line" >actual &&1110 test_cmp expect actual &&1111 git tag -n0 -l | grep "^stag-one-line" >actual &&1112 test_cmp expect actual &&1113 git tag -n0 -l stag-one-line >actual &&1114 test_cmp expect actual &&11151116 echo "stag-one-line A message line signed" >expect &&1117 git tag -n1 -l | grep "^stag-one-line" >actual &&1118 test_cmp expect actual &&1119 git tag -n -l | grep "^stag-one-line" >actual &&1120 test_cmp expect actual &&1121 git tag -n1 -l stag-one-line >actual &&1122 test_cmp expect actual &&1123 git tag -n2 -l stag-one-line >actual &&1124 test_cmp expect actual &&1125 git tag -n999 -l stag-one-line >actual &&1126 test_cmp expect actual1127'11281129test_expect_success GPG \1130'listing the zero-lines message of a signed tag should succeed''1131 git tag -s -m "" stag-zero-lines &&11321133 echo "stag-zero-lines" >expect &&1134 git tag -l | grep "^stag-zero-lines" >actual &&1135 test_cmp expect actual &&1136 git tag -n0 -l | grep "^stag-zero-lines" >actual &&1137 test_cmp expect actual &&1138 git tag -n0 -l stag-zero-lines >actual &&1139 test_cmp expect actual &&11401141 echo "stag-zero-lines " >expect &&1142 git tag -n1 -l | grep "^stag-zero-lines" >actual &&1143 test_cmp expect actual &&1144 git tag -n -l | grep "^stag-zero-lines" >actual &&1145 test_cmp expect actual &&1146 git tag -n1 -l stag-zero-lines >actual &&1147 test_cmp expect actual &&1148 git tag -n2 -l stag-zero-lines >actual &&1149 test_cmp expect actual &&1150 git tag -n999 -l stag-zero-lines >actual &&1151 test_cmp expect actual1152'11531154echo'stag line one'>sigtagmsg1155echo'stag line two'>>sigtagmsg1156echo'stag line three'>>sigtagmsg1157test_expect_success GPG \1158'listing many message lines of a signed tag should succeed''1159 git tag -s -F sigtagmsg stag-lines &&11601161 echo "stag-lines" >expect &&1162 git tag -l | grep "^stag-lines" >actual &&1163 test_cmp expect actual &&1164 git tag -n0 -l | grep "^stag-lines" >actual &&1165 test_cmp expect actual &&1166 git tag -n0 -l stag-lines >actual &&1167 test_cmp expect actual &&11681169 echo "stag-lines stag line one" >expect &&1170 git tag -n1 -l | grep "^stag-lines" >actual &&1171 test_cmp expect actual &&1172 git tag -n -l | grep "^stag-lines" >actual &&1173 test_cmp expect actual &&1174 git tag -n1 -l stag-lines >actual &&1175 test_cmp expect actual &&11761177 echo " stag line two" >>expect &&1178 git tag -n2 -l | grep "^ *stag.line" >actual &&1179 test_cmp expect actual &&1180 git tag -n2 -l stag-lines >actual &&1181 test_cmp expect actual &&11821183 echo " stag line three" >>expect &&1184 git tag -n3 -l | grep "^ *stag.line" >actual &&1185 test_cmp expect actual &&1186 git tag -n3 -l stag-lines >actual &&1187 test_cmp expect actual &&1188 git tag -n4 -l | grep "^ *stag.line" >actual &&1189 test_cmp expect actual &&1190 git tag -n4 -l stag-lines >actual &&1191 test_cmp expect actual &&1192 git tag -n99 -l | grep "^ *stag.line" >actual &&1193 test_cmp expect actual &&1194 git tag -n99 -l stag-lines >actual &&1195 test_cmp expect actual1196'11971198# tags pointing to objects different from commits:11991200tree=$(git rev-parse HEAD^{tree})1201blob=$(git rev-parse HEAD:foo)1202tag=$(git rev-parse signed-tag 2>/dev/null)12031204get_tag_header tree-signed-tag$tree tree $time>expect1205echo"A message for a tree">>expect1206echo'-----BEGIN PGP SIGNATURE-----'>>expect1207test_expect_success GPG \1208'creating a signed tag pointing to a tree should succeed''1209 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&1210 get_tag_msg tree-signed-tag >actual &&1211 test_cmp expect actual1212'12131214get_tag_header blob-signed-tag$blob blob $time>expect1215echo"A message for a blob">>expect1216echo'-----BEGIN PGP SIGNATURE-----'>>expect1217test_expect_success GPG \1218'creating a signed tag pointing to a blob should succeed''1219 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&1220 get_tag_msg blob-signed-tag >actual &&1221 test_cmp expect actual1222'12231224get_tag_header tag-signed-tag$tag tag $time>expect1225echo"A message for another tag">>expect1226echo'-----BEGIN PGP SIGNATURE-----'>>expect1227test_expect_success GPG \1228'creating a signed tag pointing to another tag should succeed''1229 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&1230 get_tag_msg tag-signed-tag >actual &&1231 test_cmp expect actual1232'12331234# usage with rfc1991 signatures1235get_tag_header rfc1991-signed-tag$commit commit $time>expect1236echo"RFC1991 signed tag">>expect1237echo'-----BEGIN PGP MESSAGE-----'>>expect1238test_expect_success GPG,RFC1991 \1239'creating a signed tag with rfc1991''1240 echo "rfc1991" >gpghome/gpg.conf &&1241 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag$commit&&1242 get_tag_msg rfc1991-signed-tag >actual &&1243 test_cmp expect actual1244'12451246cat>fakeeditor <<'EOF'1247#!/bin/sh1248cp "$1" actual1249EOF1250chmod+x fakeeditor12511252test_expect_success GPG,RFC1991 \1253'reediting a signed tag body omits signature''1254 echo "rfc1991" >gpghome/gpg.conf &&1255 echo "RFC1991 signed tag" >expect &&1256 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1257 test_cmp expect actual1258'12591260test_expect_success GPG,RFC1991 \1261'verifying rfc1991 signature''1262 echo "rfc1991" >gpghome/gpg.conf &&1263 git tag -v rfc1991-signed-tag1264'12651266test_expect_success GPG,RFC1991 \1267'list tag with rfc1991 signature''1268 echo "rfc1991" >gpghome/gpg.conf &&1269 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1270 git tag -l -n1 rfc1991-signed-tag >actual &&1271 test_cmp expect actual &&1272 git tag -l -n2 rfc1991-signed-tag >actual &&1273 test_cmp expect actual &&1274 git tag -l -n999 rfc1991-signed-tag >actual &&1275 test_cmp expect actual1276'12771278rm-f gpghome/gpg.conf12791280test_expect_success GPG,RFC1991 \1281'verifying rfc1991 signature without --rfc1991''1282 git tag -v rfc1991-signed-tag1283'12841285test_expect_success GPG,RFC1991 \1286'list tag with rfc1991 signature without --rfc1991''1287 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1288 git tag -l -n1 rfc1991-signed-tag >actual &&1289 test_cmp expect actual &&1290 git tag -l -n2 rfc1991-signed-tag >actual &&1291 test_cmp expect actual &&1292 git tag -l -n999 rfc1991-signed-tag >actual &&1293 test_cmp expect actual1294'12951296test_expect_success GPG,RFC1991 \1297'reediting a signed tag body omits signature''1298 echo "RFC1991 signed tag" >expect &&1299 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1300 test_cmp expect actual1301'13021303# try to sign with bad user.signingkey1304test_expect_success GPG \1305'git tag -s fails if gpg is misconfigured (bad key)' \1306'test_config user.signingkey BobTheMouse &&1307 test_must_fail git tag -s -m tail tag-gpg-failure'13081309# try to produce invalid signature1310test_expect_success GPG \1311'git tag -s fails if gpg is misconfigured (bad signature format)' \1312'test_config gpg.program echo &&1313 test_must_fail git tag -s -m tail tag-gpg-failure'131413151316# try to verify without gpg:13171318rm-rf gpghome1319test_expect_success GPG \1320'verify signed tag fails when public key is not present' \1321'test_must_fail git tag -v signed-tag'13221323test_expect_success \1324'git tag -a fails if tag annotation is empty''1325 ! (GIT_EDITOR=cat git tag -a initial-comment)1326'13271328test_expect_success \1329'message in editor has initial comment''1330 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)1331'13321333test_expect_success 'message in editor has initial comment: first line''1334 # check the first line --- should be empty1335 echo >first.expect &&1336 sed -e 1q <actual >first.actual &&1337 test_i18ncmp first.expect first.actual1338'13391340test_expect_success \1341'message in editor has initial comment: remainder''1342 # remove commented lines from the remainder -- should be empty1343 >rest.expect &&1344 sed -e 1d -e "/^#/d" <actual >rest.actual &&1345 test_cmp rest.expect rest.actual1346'13471348get_tag_header reuse $commit commit $time>expect1349echo"An annotation to be reused">> expect1350test_expect_success \1351'overwriting an annoted tag should use its previous body''1352 git tag -a -m "An annotation to be reused" reuse &&1353 GIT_EDITOR=true git tag -f -a reuse &&1354 get_tag_msg reuse >actual &&1355 test_cmp expect actual1356'13571358test_expect_success 'filename for the message is relative to cwd''1359 mkdir subdir &&1360 echo "Tag message in top directory" >msgfile-5 &&1361 echo "Tag message in sub directory" >subdir/msgfile-5 &&1362 (1363 cd subdir &&1364 git tag -a -F msgfile-5 tag-from-subdir1365 ) &&1366 git cat-file tag tag-from-subdir | grep "in sub directory"1367'13681369test_expect_success 'filename for the message is relative to cwd''1370 echo "Tag message in sub directory" >subdir/msgfile-6 &&1371 (1372 cd subdir &&1373 git tag -a -F msgfile-6 tag-from-subdir-21374 ) &&1375 git cat-file tag tag-from-subdir-2 | grep "in sub directory"1376'13771378# create a few more commits to test --contains13791380hash1=$(git rev-parse HEAD)13811382test_expect_success 'creating second commit and tag''1383 echo foo-2.0 >foo &&1384 git add foo &&1385 git commit -m second &&1386 git tag v2.01387'13881389hash2=$(git rev-parse HEAD)13901391test_expect_success 'creating third commit without tag''1392 echo foo-dev >foo &&1393 git add foo &&1394 git commit -m third1395'13961397hash3=$(git rev-parse HEAD)13981399# simple linear checks of --continue14001401cat> expected <<EOF1402v0.2.11403v1.01404v1.0.11405v1.1.31406v2.01407EOF14081409test_expect_success 'checking that first commit is in all tags (hash)'"1410 git tag -l --contains$hash1v* >actual &&1411 test_cmp expected actual1412"14131414# other ways of specifying the commit1415test_expect_success 'checking that first commit is in all tags (tag)'"1416 git tag -l --contains v1.0 v* >actual &&1417 test_cmp expected actual1418"14191420test_expect_success 'checking that first commit is in all tags (relative)'"1421 git tag -l --contains HEAD~2 v* >actual &&1422 test_cmp expected actual1423"14241425# All the --contains tests above, but with --no-contains1426test_expect_success 'checking that first commit is not listed in any tag with --no-contains (hash)'"1427 >expected &&1428 git tag -l --no-contains$hash1v* >actual &&1429 test_cmp expected actual1430"14311432test_expect_success 'checking that first commit is in all tags (tag)'"1433 git tag -l --no-contains v1.0 v* >actual &&1434 test_cmp expected actual1435"14361437test_expect_success 'checking that first commit is in all tags (relative)'"1438 git tag -l --no-contains HEAD~2 v* >actual &&1439 test_cmp expected actual1440"14411442cat> expected <<EOF1443v2.01444EOF14451446test_expect_success 'checking that second commit only has one tag'"1447 git tag -l --contains$hash2v* >actual &&1448 test_cmp expected actual1449"14501451cat> expected <<EOF1452v0.2.11453v1.01454v1.0.11455v1.1.31456EOF14571458test_expect_success 'inverse of the last test, with --no-contains'"1459 git tag -l --no-contains$hash2v* >actual &&1460 test_cmp expected actual1461"14621463cat> expected <<EOF1464EOF14651466test_expect_success 'checking that third commit has no tags'"1467 git tag -l --contains$hash3v* >actual &&1468 test_cmp expected actual1469"14701471cat> expected <<EOF1472v0.2.11473v1.01474v1.0.11475v1.1.31476v2.01477EOF14781479test_expect_success 'conversely --no-contains on the third commit lists all tags'"1480 git tag -l --no-contains$hash3v* >actual &&1481 test_cmp expected actual1482"14831484# how about a simple merge?14851486test_expect_success 'creating simple branch''1487 git branch stable v2.0 &&1488 git checkout stable &&1489 echo foo-3.0 > foo &&1490 git commit foo -m fourth &&1491 git tag v3.01492'14931494hash4=$(git rev-parse HEAD)14951496cat> expected <<EOF1497v3.01498EOF14991500test_expect_success 'checking that branch head only has one tag'"1501 git tag -l --contains$hash4v* >actual &&1502 test_cmp expected actual1503"15041505cat> expected <<EOF1506v0.2.11507v1.01508v1.0.11509v1.1.31510v2.01511EOF15121513test_expect_success 'checking that branch head with --no-contains lists all but one tag'"1514 git tag -l --no-contains$hash4v* >actual &&1515 test_cmp expected actual1516"15171518test_expect_success 'merging original branch into this branch''1519 git merge --strategy=ours master &&1520 git tag v4.01521'15221523cat> expected <<EOF1524v4.01525EOF15261527test_expect_success 'checking that original branch head has one tag now'"1528 git tag -l --contains$hash3v* >actual &&1529 test_cmp expected actual1530"15311532cat> expected <<EOF1533v0.2.11534v1.01535v1.0.11536v1.1.31537v2.01538v3.01539EOF15401541test_expect_success 'checking that original branch head with --no-contains lists all but one tag now'"1542 git tag -l --no-contains$hash3v* >actual &&1543 test_cmp expected actual1544"15451546cat> expected <<EOF1547v0.2.11548v1.01549v1.0.11550v1.1.31551v2.01552v3.01553v4.01554EOF15551556test_expect_success 'checking that initial commit is in all tags'"1557 git tag -l --contains$hash1v* >actual &&1558 test_cmp expected actual1559"15601561test_expect_success 'checking that --contains can be used in non-list mode''1562 git tag --contains$hash1v* >actual &&1563 test_cmp expected actual1564'15651566test_expect_success 'checking that initial commit is in all tags with --no-contains'"1567 >expected &&1568 git tag -l --no-contains$hash1v* >actual &&1569 test_cmp expected actual1570"15711572# mixing modes and options:15731574test_expect_success 'mixing incompatibles modes and options is forbidden''1575 test_must_fail git tag -a &&1576 test_must_fail git tag -a -l &&1577 test_must_fail git tag -s &&1578 test_must_fail git tag -s -l &&1579 test_must_fail git tag -m &&1580 test_must_fail git tag -m -l &&1581 test_must_fail git tag -m "hlagh" &&1582 test_must_fail git tag -m "hlagh" -l &&1583 test_must_fail git tag -F &&1584 test_must_fail git tag -F -l &&1585 test_must_fail git tag -f &&1586 test_must_fail git tag -f -l &&1587 test_must_fail git tag -a -s -m -F &&1588 test_must_fail git tag -a -s -m -F -l &&1589 test_must_fail git tag -l -v &&1590 test_must_fail git tag -l -d &&1591 test_must_fail git tag -l -v -d &&1592 test_must_fail git tag -n 100 -v &&1593 test_must_fail git tag -l -m msg &&1594 test_must_fail git tag -l -F some file &&1595 test_must_fail git tag -v -s &&1596 test_must_fail git tag --contains tag-tree &&1597 test_must_fail git tag --contains tag-blob &&1598 test_must_fail git tag --no-contains tag-tree &&1599 test_must_fail git tag --no-contains tag-blob &&1600 test_must_fail git tag --contains --no-contains &&1601 test_must_fail git tag --no-with HEAD &&1602 test_must_fail git tag --no-without HEAD1603'16041605for option in--contains --with --no-contains --without --merged --no-merged --points-at1606do1607 test_expect_success "mixing incompatible modes with$optionis forbidden""1608 test_must_fail git tag -d$optionHEAD &&1609 test_must_fail git tag -d$optionHEAD some-tag &&1610 test_must_fail git tag -v$optionHEAD1611 "1612 test_expect_success "Doing 'git tag --list-like$option<commit> <pattern> is permitted""1613 git tag -n$optionHEAD HEAD &&1614 git tag$optionHEAD HEAD &&1615 git tag$option1616 "1617done16181619# check points-at16201621test_expect_success '--points-at can be used in non-list mode''1622 echo v4.0 >expect &&1623 git tag --points-at=v4.0 "v*" >actual &&1624 test_cmp expect actual1625'16261627test_expect_success '--points-at is a synonym for --points-at HEAD''1628 echo v4.0 >expect &&1629 git tag --points-at >actual &&1630 test_cmp expect actual1631'16321633test_expect_success '--points-at finds lightweight tags''1634 echo v4.0 >expect &&1635 git tag --points-at v4.0 >actual &&1636 test_cmp expect actual1637'16381639test_expect_success '--points-at finds annotated tags of commits''1640 git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&1641 echo annotated-v4.0 >expect &&1642 git tag -l --points-at v4.0 "annotated*" >actual &&1643 test_cmp expect actual1644'16451646test_expect_success '--points-at finds annotated tags of tags''1647 git tag -m "describing the v4.0 tag object" \1648 annotated-again-v4.0 annotated-v4.0 &&1649 cat >expect <<-\EOF &&1650 annotated-again-v4.01651 annotated-v4.01652 EOF1653 git tag --points-at=annotated-v4.0 >actual &&1654 test_cmp expect actual1655'16561657test_expect_success 'multiple --points-at are OR-ed together''1658 cat >expect <<-\EOF &&1659 v2.01660 v3.01661 EOF1662 git tag --points-at=v2.0 --points-at=v3.0 >actual &&1663 test_cmp expect actual1664'16651666test_expect_success 'lexical sort''1667 git tag foo1.3 &&1668 git tag foo1.6 &&1669 git tag foo1.10 &&1670 git tag -l --sort=refname "foo*" >actual &&1671 cat >expect <<-\EOF &&1672 foo1.101673 foo1.31674 foo1.61675 EOF1676 test_cmp expect actual1677'16781679test_expect_success 'version sort''1680 git tag -l --sort=version:refname "foo*" >actual &&1681 cat >expect <<-\EOF &&1682 foo1.31683 foo1.61684 foo1.101685 EOF1686 test_cmp expect actual1687'16881689test_expect_success 'reverse version sort''1690 git tag -l --sort=-version:refname "foo*" >actual &&1691 cat >expect <<-\EOF &&1692 foo1.101693 foo1.61694 foo1.31695 EOF1696 test_cmp expect actual1697'16981699test_expect_success 'reverse lexical sort''1700 git tag -l --sort=-refname "foo*" >actual &&1701 cat >expect <<-\EOF &&1702 foo1.61703 foo1.31704 foo1.101705 EOF1706 test_cmp expect actual1707'17081709test_expect_success 'configured lexical sort''1710 test_config tag.sort "v:refname" &&1711 git tag -l "foo*" >actual &&1712 cat >expect <<-\EOF &&1713 foo1.31714 foo1.61715 foo1.101716 EOF1717 test_cmp expect actual1718'17191720test_expect_success 'option override configured sort''1721 test_config tag.sort "v:refname" &&1722 git tag -l --sort=-refname "foo*" >actual &&1723 cat >expect <<-\EOF &&1724 foo1.61725 foo1.31726 foo1.101727 EOF1728 test_cmp expect actual1729'17301731test_expect_success 'invalid sort parameter on command line''1732 test_must_fail git tag -l --sort=notvalid "foo*" >actual1733'17341735test_expect_success 'invalid sort parameter in configuratoin''1736 test_config tag.sort "v:notvalid" &&1737 test_must_fail git tag -l "foo*"1738'17391740test_expect_success 'version sort with prerelease reordering''1741 test_config versionsort.prereleaseSuffix -rc &&1742 git tag foo1.6-rc1 &&1743 git tag foo1.6-rc2 &&1744 git tag -l --sort=version:refname "foo*" >actual &&1745 cat >expect <<-\EOF &&1746 foo1.31747 foo1.6-rc11748 foo1.6-rc21749 foo1.61750 foo1.101751 EOF1752 test_cmp expect actual1753'17541755test_expect_success 'reverse version sort with prerelease reordering''1756 test_config versionsort.prereleaseSuffix -rc &&1757 git tag -l --sort=-version:refname "foo*" >actual &&1758 cat >expect <<-\EOF &&1759 foo1.101760 foo1.61761 foo1.6-rc21762 foo1.6-rc11763 foo1.31764 EOF1765 test_cmp expect actual1766'17671768test_expect_success 'version sort with prerelease reordering and common leading character''1769 test_config versionsort.prereleaseSuffix -before &&1770 git tag foo1.7-before1 &&1771 git tag foo1.7 &&1772 git tag foo1.7-after1 &&1773 git tag -l --sort=version:refname "foo1.7*" >actual &&1774 cat >expect <<-\EOF &&1775 foo1.7-before11776 foo1.71777 foo1.7-after11778 EOF1779 test_cmp expect actual1780'17811782test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character''1783 test_config versionsort.prereleaseSuffix -before &&1784 git config --add versionsort.prereleaseSuffix -after &&1785 git tag -l --sort=version:refname "foo1.7*" >actual &&1786 cat >expect <<-\EOF &&1787 foo1.7-before11788 foo1.7-after11789 foo1.71790 EOF1791 test_cmp expect actual1792'17931794test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag''1795 test_config versionsort.prereleaseSuffix -bar &&1796 git config --add versionsort.prereleaseSuffix -foo-baz &&1797 git config --add versionsort.prereleaseSuffix -foo-bar &&1798 git tag foo1.8-foo-bar &&1799 git tag foo1.8-foo-baz &&1800 git tag foo1.8 &&1801 git tag -l --sort=version:refname "foo1.8*" >actual &&1802 cat >expect <<-\EOF &&1803 foo1.8-foo-baz1804 foo1.8-foo-bar1805 foo1.81806 EOF1807 test_cmp expect actual1808'18091810test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position''1811 test_config versionsort.prereleaseSuffix -pre &&1812 git config --add versionsort.prereleaseSuffix -prerelease &&1813 git tag foo1.9-pre1 &&1814 git tag foo1.9-pre2 &&1815 git tag foo1.9-prerelease1 &&1816 git tag -l --sort=version:refname "foo1.9*" >actual &&1817 cat >expect <<-\EOF &&1818 foo1.9-pre11819 foo1.9-pre21820 foo1.9-prerelease11821 EOF1822 test_cmp expect actual1823'18241825test_expect_success 'version sort with general suffix reordering''1826 test_config versionsort.suffix -alpha &&1827 git config --add versionsort.suffix -beta &&1828 git config --add versionsort.suffix "" &&1829 git config --add versionsort.suffix -gamma &&1830 git config --add versionsort.suffix -delta &&1831 git tag foo1.10-alpha &&1832 git tag foo1.10-beta &&1833 git tag foo1.10-gamma &&1834 git tag foo1.10-delta &&1835 git tag foo1.10-unlisted-suffix &&1836 git tag -l --sort=version:refname "foo1.10*" >actual &&1837 cat >expect <<-\EOF &&1838 foo1.10-alpha1839 foo1.10-beta1840 foo1.101841 foo1.10-unlisted-suffix1842 foo1.10-gamma1843 foo1.10-delta1844 EOF1845 test_cmp expect actual1846'18471848test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix''1849 test_config versionsort.suffix -before &&1850 test_config versionsort.prereleaseSuffix -after &&1851 git tag -l --sort=version:refname "foo1.7*" >actual &&1852 cat >expect <<-\EOF &&1853 foo1.7-before11854 foo1.71855 foo1.7-after11856 EOF1857 test_cmp expect actual1858'18591860test_expect_success 'version sort with very long prerelease suffix''1861 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&1862 git tag -l --sort=version:refname1863'18641865run_with_limited_stack () {1866(ulimit -s128&&"$@")1867}18681869test_lazy_prereq ULIMIT_STACK_SIZE 'run_with_limited_stack true'18701871# we require ulimit, this excludes Windows1872test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo''1873 >expect &&1874 i=1 &&1875 while test$i-lt 80001876 do1877 echo "commit refs/heads/master1878committer A U Thor <author@example.com>$((1000000000 + $i * 100)) +02001879data <<EOF1880commit #$i1881EOF"1882 test$i= 1 && echo "from refs/heads/master^0"1883 i=$(($i + 1))1884 done | git fast-import &&1885 git checkout master &&1886 git tag far-far-away HEAD^ &&1887 run_with_limited_stack git tag --contains HEAD >actual &&1888 test_cmp expect actual &&1889 run_with_limited_stack git tag --no-contains HEAD >actual &&1890 test_line_count ">" 10 actual1891'18921893test_expect_success '--format should list tags as per format given''1894 cat >expect <<-\EOF &&1895 refname : refs/tags/v1.01896 refname : refs/tags/v1.0.11897 refname : refs/tags/v1.1.31898 EOF1899 git tag -l --format="refname : %(refname)" "v1*" >actual &&1900 test_cmp expect actual1901'19021903test_expect_success 'setup --merged test tags''1904 git tag mergetest-1 HEAD~2 &&1905 git tag mergetest-2 HEAD~1 &&1906 git tag mergetest-3 HEAD1907'19081909test_expect_success '--merged can be used in non-list mode''1910 cat >expect <<-\EOF &&1911 mergetest-11912 mergetest-21913 EOF1914 git tag --merged=mergetest-2 "mergetest*" >actual &&1915 test_cmp expect actual1916'19171918test_expect_success '--merged is incompatible with --no-merged''1919 test_must_fail git tag --merged HEAD --no-merged HEAD1920'19211922test_expect_success '--merged shows merged tags''1923 cat >expect <<-\EOF &&1924 mergetest-11925 mergetest-21926 EOF1927 git tag -l --merged=mergetest-2 mergetest-* >actual &&1928 test_cmp expect actual1929'19301931test_expect_success '--no-merged show unmerged tags''1932 cat >expect <<-\EOF &&1933 mergetest-31934 EOF1935 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&1936 test_cmp expect actual1937'19381939test_expect_success '--no-merged can be used in non-list mode''1940 git tag --no-merged=mergetest-2 mergetest-* >actual &&1941 test_cmp expect actual1942'19431944test_expect_success 'ambiguous branch/tags not marked''1945 git tag ambiguous &&1946 git branch ambiguous &&1947 echo ambiguous >expect &&1948 git tag -l ambiguous >actual &&1949 test_cmp expect actual1950'19511952test_expect_success '--contains combined with --no-contains''1953 (1954 git init no-contains &&1955 cd no-contains &&1956 test_commit v0.1 &&1957 test_commit v0.2 &&1958 test_commit v0.3 &&1959 test_commit v0.4 &&1960 test_commit v0.5 &&1961 cat >expected <<-\EOF &&1962 v0.21963 v0.31964 v0.41965 EOF1966 git tag --contains v0.2 --no-contains v0.5 >actual &&1967 test_cmp expected actual1968 )1969'19701971# As the docs say, list tags which contain a specified *commit*. We1972# don't recurse down to tags for trees or blobs pointed to by *those*1973# commits.1974test_expect_success 'Does --[no-]contains stop at commits? Yes!''1975 cd no-contains &&1976 blob=$(git rev-parse v0.3:v0.3.t)&&1977 tree=$(git rev-parse v0.3^{tree})&&1978 git tag tag-blob$blob&&1979 git tag tag-tree$tree&&1980 git tag --contains v0.3 >actual &&1981 cat >expected <<-\EOF &&1982 v0.31983 v0.41984 v0.51985 EOF1986 test_cmp expected actual &&1987 git tag --no-contains v0.3 >actual &&1988 cat >expected <<-\EOF &&1989 v0.11990 v0.21991 EOF1992 test_cmp expected actual1993'19941995test_done