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_cmp 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_cmp 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 '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 'verifying a forged tag with --format fail and format accordingly'' 946 cat >expect <<-\EOF 947 tagname : forged-tag 948 EOF && 949 test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual && 950 test_cmp expect actual 951' 952 953# blank and empty messages for signed tags: 954 955get_tag_header empty-signed-tag$commit commit $time>expect 956echo'-----BEGIN PGP SIGNATURE-----'>>expect 957test_expect_success GPG \ 958'creating a signed tag with an empty -m message should succeed'' 959 git tag -s -m "" empty-signed-tag && 960 get_tag_msg empty-signed-tag >actual && 961 test_cmp expect actual && 962 git tag -v empty-signed-tag 963' 964 965>sigemptyfile 966get_tag_header emptyfile-signed-tag$commit commit $time>expect 967echo'-----BEGIN PGP SIGNATURE-----'>>expect 968test_expect_success GPG \ 969'creating a signed tag with an empty -F messagefile should succeed'' 970 git tag -s -F sigemptyfile emptyfile-signed-tag && 971 get_tag_msg emptyfile-signed-tag >actual && 972 test_cmp expect actual && 973 git tag -v emptyfile-signed-tag 974' 975 976printf'\n\n \n\t\nLeading blank lines\n'> sigblanksfile 977printf'\n\t \t \nRepeated blank lines\n'>>sigblanksfile 978printf'\n\n\nTrailing spaces\t \n'>>sigblanksfile 979printf'\nTrailing blank lines\n\n\t \n\n'>>sigblanksfile 980get_tag_header blanks-signed-tag$commit commit $time>expect 981cat>>expect <<EOF 982Leading blank lines 983 984Repeated blank lines 985 986Trailing spaces 987 988Trailing blank lines 989EOF 990echo'-----BEGIN PGP SIGNATURE-----'>>expect 991test_expect_success GPG \ 992'extra blanks in the message for a signed tag should be removed'' 993 git tag -s -F sigblanksfile blanks-signed-tag && 994 get_tag_msg blanks-signed-tag >actual && 995 test_cmp expect actual && 996 git tag -v blanks-signed-tag 997' 998 999get_tag_header blank-signed-tag$commit commit $time>expect1000echo'-----BEGIN PGP SIGNATURE-----'>>expect1001test_expect_success GPG \1002'creating a signed tag with a blank -m message should succeed''1003 git tag -s -m " " blank-signed-tag &&1004 get_tag_msg blank-signed-tag >actual &&1005 test_cmp expect actual &&1006 git tag -v blank-signed-tag1007'10081009echo' '>sigblankfile1010echo''>>sigblankfile1011echo' '>>sigblankfile1012get_tag_header blankfile-signed-tag$commit commit $time>expect1013echo'-----BEGIN PGP SIGNATURE-----'>>expect1014test_expect_success GPG \1015'creating a signed tag with blank -F file with spaces should succeed''1016 git tag -s -F sigblankfile blankfile-signed-tag &&1017 get_tag_msg blankfile-signed-tag >actual &&1018 test_cmp expect actual &&1019 git tag -v blankfile-signed-tag1020'10211022printf' '>sigblanknonlfile1023get_tag_header blanknonlfile-signed-tag$commit commit $time>expect1024echo'-----BEGIN PGP SIGNATURE-----'>>expect1025test_expect_success GPG \1026'creating a signed tag with spaces and no newline should succeed''1027 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&1028 get_tag_msg blanknonlfile-signed-tag >actual &&1029 test_cmp expect actual &&1030 git tag -v signed-tag1031'10321033# messages with commented lines for signed tags:10341035cat>sigcommentsfile <<EOF1036# A comment10371038############1039The message.1040############1041One line.104210431044# commented lines1045# commented lines10461047Another line.1048# comments10491050Last line.1051EOF1052get_tag_header comments-signed-tag$commit commit $time>expect1053cat>>expect <<EOF1054The message.1055One line.10561057Another line.10581059Last line.1060EOF1061echo'-----BEGIN PGP SIGNATURE-----'>>expect1062test_expect_success GPG \1063'creating a signed tag with a -F file with #comments should succeed''1064 git tag -s -F sigcommentsfile comments-signed-tag &&1065 get_tag_msg comments-signed-tag >actual &&1066 test_cmp expect actual &&1067 git tag -v comments-signed-tag1068'10691070get_tag_header comment-signed-tag$commit commit $time>expect1071echo'-----BEGIN PGP SIGNATURE-----'>>expect1072test_expect_success GPG \1073'creating a signed tag with #commented -m message should succeed''1074 git tag -s -m "#comment" comment-signed-tag &&1075 get_tag_msg comment-signed-tag >actual &&1076 test_cmp expect actual &&1077 git tag -v comment-signed-tag1078'10791080echo'#comment'>sigcommentfile1081echo''>>sigcommentfile1082echo'####'>>sigcommentfile1083get_tag_header commentfile-signed-tag$commit commit $time>expect1084echo'-----BEGIN PGP SIGNATURE-----'>>expect1085test_expect_success GPG \1086'creating a signed tag with #commented -F messagefile should succeed''1087 git tag -s -F sigcommentfile commentfile-signed-tag &&1088 get_tag_msg commentfile-signed-tag >actual &&1089 test_cmp expect actual &&1090 git tag -v commentfile-signed-tag1091'10921093printf'#comment'>sigcommentnonlfile1094get_tag_header commentnonlfile-signed-tag$commit commit $time>expect1095echo'-----BEGIN PGP SIGNATURE-----'>>expect1096test_expect_success GPG \1097'creating a signed tag with a #comment and no newline should succeed''1098 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&1099 get_tag_msg commentnonlfile-signed-tag >actual &&1100 test_cmp expect actual &&1101 git tag -v commentnonlfile-signed-tag1102'11031104# listing messages for signed tags:11051106test_expect_success GPG \1107'listing the one-line message of a signed tag should succeed''1108 git tag -s -m "A message line signed" stag-one-line &&11091110 echo "stag-one-line" >expect &&1111 git tag -l | grep "^stag-one-line" >actual &&1112 test_cmp expect actual &&1113 git tag -n0 -l | grep "^stag-one-line" >actual &&1114 test_cmp expect actual &&1115 git tag -n0 -l stag-one-line >actual &&1116 test_cmp expect actual &&11171118 echo "stag-one-line A message line signed" >expect &&1119 git tag -n1 -l | grep "^stag-one-line" >actual &&1120 test_cmp expect actual &&1121 git tag -n -l | grep "^stag-one-line" >actual &&1122 test_cmp expect actual &&1123 git tag -n1 -l stag-one-line >actual &&1124 test_cmp expect actual &&1125 git tag -n2 -l stag-one-line >actual &&1126 test_cmp expect actual &&1127 git tag -n999 -l stag-one-line >actual &&1128 test_cmp expect actual1129'11301131test_expect_success GPG \1132'listing the zero-lines message of a signed tag should succeed''1133 git tag -s -m "" stag-zero-lines &&11341135 echo "stag-zero-lines" >expect &&1136 git tag -l | grep "^stag-zero-lines" >actual &&1137 test_cmp expect actual &&1138 git tag -n0 -l | grep "^stag-zero-lines" >actual &&1139 test_cmp expect actual &&1140 git tag -n0 -l stag-zero-lines >actual &&1141 test_cmp expect actual &&11421143 echo "stag-zero-lines " >expect &&1144 git tag -n1 -l | grep "^stag-zero-lines" >actual &&1145 test_cmp expect actual &&1146 git tag -n -l | grep "^stag-zero-lines" >actual &&1147 test_cmp expect actual &&1148 git tag -n1 -l stag-zero-lines >actual &&1149 test_cmp expect actual &&1150 git tag -n2 -l stag-zero-lines >actual &&1151 test_cmp expect actual &&1152 git tag -n999 -l stag-zero-lines >actual &&1153 test_cmp expect actual1154'11551156echo'stag line one'>sigtagmsg1157echo'stag line two'>>sigtagmsg1158echo'stag line three'>>sigtagmsg1159test_expect_success GPG \1160'listing many message lines of a signed tag should succeed''1161 git tag -s -F sigtagmsg stag-lines &&11621163 echo "stag-lines" >expect &&1164 git tag -l | grep "^stag-lines" >actual &&1165 test_cmp expect actual &&1166 git tag -n0 -l | grep "^stag-lines" >actual &&1167 test_cmp expect actual &&1168 git tag -n0 -l stag-lines >actual &&1169 test_cmp expect actual &&11701171 echo "stag-lines stag line one" >expect &&1172 git tag -n1 -l | grep "^stag-lines" >actual &&1173 test_cmp expect actual &&1174 git tag -n -l | grep "^stag-lines" >actual &&1175 test_cmp expect actual &&1176 git tag -n1 -l stag-lines >actual &&1177 test_cmp expect actual &&11781179 echo " stag line two" >>expect &&1180 git tag -n2 -l | grep "^ *stag.line" >actual &&1181 test_cmp expect actual &&1182 git tag -n2 -l stag-lines >actual &&1183 test_cmp expect actual &&11841185 echo " stag line three" >>expect &&1186 git tag -n3 -l | grep "^ *stag.line" >actual &&1187 test_cmp expect actual &&1188 git tag -n3 -l stag-lines >actual &&1189 test_cmp expect actual &&1190 git tag -n4 -l | grep "^ *stag.line" >actual &&1191 test_cmp expect actual &&1192 git tag -n4 -l stag-lines >actual &&1193 test_cmp expect actual &&1194 git tag -n99 -l | grep "^ *stag.line" >actual &&1195 test_cmp expect actual &&1196 git tag -n99 -l stag-lines >actual &&1197 test_cmp expect actual1198'11991200# tags pointing to objects different from commits:12011202tree=$(git rev-parse HEAD^{tree})1203blob=$(git rev-parse HEAD:foo)1204tag=$(git rev-parse signed-tag 2>/dev/null)12051206get_tag_header tree-signed-tag$tree tree $time>expect1207echo"A message for a tree">>expect1208echo'-----BEGIN PGP SIGNATURE-----'>>expect1209test_expect_success GPG \1210'creating a signed tag pointing to a tree should succeed''1211 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&1212 get_tag_msg tree-signed-tag >actual &&1213 test_cmp expect actual1214'12151216get_tag_header blob-signed-tag$blob blob $time>expect1217echo"A message for a blob">>expect1218echo'-----BEGIN PGP SIGNATURE-----'>>expect1219test_expect_success GPG \1220'creating a signed tag pointing to a blob should succeed''1221 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&1222 get_tag_msg blob-signed-tag >actual &&1223 test_cmp expect actual1224'12251226get_tag_header tag-signed-tag$tag tag $time>expect1227echo"A message for another tag">>expect1228echo'-----BEGIN PGP SIGNATURE-----'>>expect1229test_expect_success GPG \1230'creating a signed tag pointing to another tag should succeed''1231 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&1232 get_tag_msg tag-signed-tag >actual &&1233 test_cmp expect actual1234'12351236# usage with rfc1991 signatures1237get_tag_header rfc1991-signed-tag$commit commit $time>expect1238echo"RFC1991 signed tag">>expect1239echo'-----BEGIN PGP MESSAGE-----'>>expect1240test_expect_success GPG,RFC1991 \1241'creating a signed tag with rfc1991''1242 echo "rfc1991" >gpghome/gpg.conf &&1243 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag$commit&&1244 get_tag_msg rfc1991-signed-tag >actual &&1245 test_cmp expect actual1246'12471248cat>fakeeditor <<'EOF'1249#!/bin/sh1250cp "$1" actual1251EOF1252chmod+x fakeeditor12531254test_expect_success GPG,RFC1991 \1255'reediting a signed tag body omits signature''1256 echo "rfc1991" >gpghome/gpg.conf &&1257 echo "RFC1991 signed tag" >expect &&1258 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1259 test_cmp expect actual1260'12611262test_expect_success GPG,RFC1991 \1263'verifying rfc1991 signature''1264 echo "rfc1991" >gpghome/gpg.conf &&1265 git tag -v rfc1991-signed-tag1266'12671268test_expect_success GPG,RFC1991 \1269'list tag with rfc1991 signature''1270 echo "rfc1991" >gpghome/gpg.conf &&1271 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1272 git tag -l -n1 rfc1991-signed-tag >actual &&1273 test_cmp expect actual &&1274 git tag -l -n2 rfc1991-signed-tag >actual &&1275 test_cmp expect actual &&1276 git tag -l -n999 rfc1991-signed-tag >actual &&1277 test_cmp expect actual1278'12791280rm-f gpghome/gpg.conf12811282test_expect_success GPG,RFC1991 \1283'verifying rfc1991 signature without --rfc1991''1284 git tag -v rfc1991-signed-tag1285'12861287test_expect_success GPG,RFC1991 \1288'list tag with rfc1991 signature without --rfc1991''1289 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1290 git tag -l -n1 rfc1991-signed-tag >actual &&1291 test_cmp expect actual &&1292 git tag -l -n2 rfc1991-signed-tag >actual &&1293 test_cmp expect actual &&1294 git tag -l -n999 rfc1991-signed-tag >actual &&1295 test_cmp expect actual1296'12971298test_expect_success GPG,RFC1991 \1299'reediting a signed tag body omits signature''1300 echo "RFC1991 signed tag" >expect &&1301 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1302 test_cmp expect actual1303'13041305# try to sign with bad user.signingkey1306test_expect_success GPG \1307'git tag -s fails if gpg is misconfigured (bad key)' \1308'test_config user.signingkey BobTheMouse &&1309 test_must_fail git tag -s -m tail tag-gpg-failure'13101311# try to produce invalid signature1312test_expect_success GPG \1313'git tag -s fails if gpg is misconfigured (bad signature format)' \1314'test_config gpg.program echo &&1315 test_must_fail git tag -s -m tail tag-gpg-failure'131613171318# try to verify without gpg:13191320rm-rf gpghome1321test_expect_success GPG \1322'verify signed tag fails when public key is not present' \1323'test_must_fail git tag -v signed-tag'13241325test_expect_success \1326'git tag -a fails if tag annotation is empty''1327 ! (GIT_EDITOR=cat git tag -a initial-comment)1328'13291330test_expect_success \1331'message in editor has initial comment''1332 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)1333'13341335test_expect_success 'message in editor has initial comment: first line''1336 # check the first line --- should be empty1337 echo >first.expect &&1338 sed -e 1q <actual >first.actual &&1339 test_i18ncmp first.expect first.actual1340'13411342test_expect_success \1343'message in editor has initial comment: remainder''1344 # remove commented lines from the remainder -- should be empty1345 >rest.expect &&1346 sed -e 1d -e "/^#/d" <actual >rest.actual &&1347 test_cmp rest.expect rest.actual1348'13491350get_tag_header reuse $commit commit $time>expect1351echo"An annotation to be reused">> expect1352test_expect_success \1353'overwriting an annoted tag should use its previous body''1354 git tag -a -m "An annotation to be reused" reuse &&1355 GIT_EDITOR=true git tag -f -a reuse &&1356 get_tag_msg reuse >actual &&1357 test_cmp expect actual1358'13591360test_expect_success 'filename for the message is relative to cwd''1361 mkdir subdir &&1362 echo "Tag message in top directory" >msgfile-5 &&1363 echo "Tag message in sub directory" >subdir/msgfile-5 &&1364 (1365 cd subdir &&1366 git tag -a -F msgfile-5 tag-from-subdir1367 ) &&1368 git cat-file tag tag-from-subdir | grep "in sub directory"1369'13701371test_expect_success 'filename for the message is relative to cwd''1372 echo "Tag message in sub directory" >subdir/msgfile-6 &&1373 (1374 cd subdir &&1375 git tag -a -F msgfile-6 tag-from-subdir-21376 ) &&1377 git cat-file tag tag-from-subdir-2 | grep "in sub directory"1378'13791380# create a few more commits to test --contains13811382hash1=$(git rev-parse HEAD)13831384test_expect_success 'creating second commit and tag''1385 echo foo-2.0 >foo &&1386 git add foo &&1387 git commit -m second &&1388 git tag v2.01389'13901391hash2=$(git rev-parse HEAD)13921393test_expect_success 'creating third commit without tag''1394 echo foo-dev >foo &&1395 git add foo &&1396 git commit -m third1397'13981399hash3=$(git rev-parse HEAD)14001401# simple linear checks of --continue14021403cat> expected <<EOF1404v0.2.11405v1.01406v1.0.11407v1.1.31408v2.01409EOF14101411test_expect_success 'checking that first commit is in all tags (hash)'"1412 git tag -l --contains$hash1v* >actual &&1413 test_cmp expected actual1414"14151416# other ways of specifying the commit1417test_expect_success 'checking that first commit is in all tags (tag)'"1418 git tag -l --contains v1.0 v* >actual &&1419 test_cmp expected actual1420"14211422test_expect_success 'checking that first commit is in all tags (relative)'"1423 git tag -l --contains HEAD~2 v* >actual &&1424 test_cmp expected actual1425"14261427# All the --contains tests above, but with --no-contains1428test_expect_success 'checking that first commit is not listed in any tag with --no-contains (hash)'"1429 >expected &&1430 git tag -l --no-contains$hash1v* >actual &&1431 test_cmp expected actual1432"14331434test_expect_success 'checking that first commit is in all tags (tag)'"1435 git tag -l --no-contains v1.0 v* >actual &&1436 test_cmp expected actual1437"14381439test_expect_success 'checking that first commit is in all tags (relative)'"1440 git tag -l --no-contains HEAD~2 v* >actual &&1441 test_cmp expected actual1442"14431444cat> expected <<EOF1445v2.01446EOF14471448test_expect_success 'checking that second commit only has one tag'"1449 git tag -l --contains$hash2v* >actual &&1450 test_cmp expected actual1451"14521453cat> expected <<EOF1454v0.2.11455v1.01456v1.0.11457v1.1.31458EOF14591460test_expect_success 'inverse of the last test, with --no-contains'"1461 git tag -l --no-contains$hash2v* >actual &&1462 test_cmp expected actual1463"14641465cat> expected <<EOF1466EOF14671468test_expect_success 'checking that third commit has no tags'"1469 git tag -l --contains$hash3v* >actual &&1470 test_cmp expected actual1471"14721473cat> expected <<EOF1474v0.2.11475v1.01476v1.0.11477v1.1.31478v2.01479EOF14801481test_expect_success 'conversely --no-contains on the third commit lists all tags'"1482 git tag -l --no-contains$hash3v* >actual &&1483 test_cmp expected actual1484"14851486# how about a simple merge?14871488test_expect_success 'creating simple branch''1489 git branch stable v2.0 &&1490 git checkout stable &&1491 echo foo-3.0 > foo &&1492 git commit foo -m fourth &&1493 git tag v3.01494'14951496hash4=$(git rev-parse HEAD)14971498cat> expected <<EOF1499v3.01500EOF15011502test_expect_success 'checking that branch head only has one tag'"1503 git tag -l --contains$hash4v* >actual &&1504 test_cmp expected actual1505"15061507cat> expected <<EOF1508v0.2.11509v1.01510v1.0.11511v1.1.31512v2.01513EOF15141515test_expect_success 'checking that branch head with --no-contains lists all but one tag'"1516 git tag -l --no-contains$hash4v* >actual &&1517 test_cmp expected actual1518"15191520test_expect_success 'merging original branch into this branch''1521 git merge --strategy=ours master &&1522 git tag v4.01523'15241525cat> expected <<EOF1526v4.01527EOF15281529test_expect_success 'checking that original branch head has one tag now'"1530 git tag -l --contains$hash3v* >actual &&1531 test_cmp expected actual1532"15331534cat> expected <<EOF1535v0.2.11536v1.01537v1.0.11538v1.1.31539v2.01540v3.01541EOF15421543test_expect_success 'checking that original branch head with --no-contains lists all but one tag now'"1544 git tag -l --no-contains$hash3v* >actual &&1545 test_cmp expected actual1546"15471548cat> expected <<EOF1549v0.2.11550v1.01551v1.0.11552v1.1.31553v2.01554v3.01555v4.01556EOF15571558test_expect_success 'checking that initial commit is in all tags'"1559 git tag -l --contains$hash1v* >actual &&1560 test_cmp expected actual1561"15621563test_expect_success 'checking that --contains can be used in non-list mode''1564 git tag --contains$hash1v* >actual &&1565 test_cmp expected actual1566'15671568test_expect_success 'checking that initial commit is in all tags with --no-contains'"1569 >expected &&1570 git tag -l --no-contains$hash1v* >actual &&1571 test_cmp expected actual1572"15731574# mixing modes and options:15751576test_expect_success 'mixing incompatibles modes and options is forbidden''1577 test_must_fail git tag -a &&1578 test_must_fail git tag -a -l &&1579 test_must_fail git tag -s &&1580 test_must_fail git tag -s -l &&1581 test_must_fail git tag -m &&1582 test_must_fail git tag -m -l &&1583 test_must_fail git tag -m "hlagh" &&1584 test_must_fail git tag -m "hlagh" -l &&1585 test_must_fail git tag -F &&1586 test_must_fail git tag -F -l &&1587 test_must_fail git tag -f &&1588 test_must_fail git tag -f -l &&1589 test_must_fail git tag -a -s -m -F &&1590 test_must_fail git tag -a -s -m -F -l &&1591 test_must_fail git tag -l -v &&1592 test_must_fail git tag -l -d &&1593 test_must_fail git tag -l -v -d &&1594 test_must_fail git tag -n 100 -v &&1595 test_must_fail git tag -l -m msg &&1596 test_must_fail git tag -l -F some file &&1597 test_must_fail git tag -v -s &&1598 test_must_fail git tag --contains tag-tree &&1599 test_must_fail git tag --contains tag-blob &&1600 test_must_fail git tag --no-contains tag-tree &&1601 test_must_fail git tag --no-contains tag-blob &&1602 test_must_fail git tag --contains --no-contains &&1603 test_must_fail git tag --no-with HEAD &&1604 test_must_fail git tag --no-without HEAD1605'16061607for option in--contains --with --no-contains --without --merged --no-merged --points-at1608do1609 test_expect_success "mixing incompatible modes with$optionis forbidden""1610 test_must_fail git tag -d$optionHEAD &&1611 test_must_fail git tag -d$optionHEAD some-tag &&1612 test_must_fail git tag -v$optionHEAD1613 "1614 test_expect_success "Doing 'git tag --list-like$option<commit> <pattern> is permitted""1615 git tag -n$optionHEAD HEAD &&1616 git tag$optionHEAD HEAD &&1617 git tag$option1618 "1619done16201621# check points-at16221623test_expect_success '--points-at can be used in non-list mode''1624 echo v4.0 >expect &&1625 git tag --points-at=v4.0 "v*" >actual &&1626 test_cmp expect actual1627'16281629test_expect_success '--points-at is a synonym for --points-at HEAD''1630 echo v4.0 >expect &&1631 git tag --points-at >actual &&1632 test_cmp expect actual1633'16341635test_expect_success '--points-at finds lightweight tags''1636 echo v4.0 >expect &&1637 git tag --points-at v4.0 >actual &&1638 test_cmp expect actual1639'16401641test_expect_success '--points-at finds annotated tags of commits''1642 git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&1643 echo annotated-v4.0 >expect &&1644 git tag -l --points-at v4.0 "annotated*" >actual &&1645 test_cmp expect actual1646'16471648test_expect_success '--points-at finds annotated tags of tags''1649 git tag -m "describing the v4.0 tag object" \1650 annotated-again-v4.0 annotated-v4.0 &&1651 cat >expect <<-\EOF &&1652 annotated-again-v4.01653 annotated-v4.01654 EOF1655 git tag --points-at=annotated-v4.0 >actual &&1656 test_cmp expect actual1657'16581659test_expect_success 'multiple --points-at are OR-ed together''1660 cat >expect <<-\EOF &&1661 v2.01662 v3.01663 EOF1664 git tag --points-at=v2.0 --points-at=v3.0 >actual &&1665 test_cmp expect actual1666'16671668test_expect_success 'lexical sort''1669 git tag foo1.3 &&1670 git tag foo1.6 &&1671 git tag foo1.10 &&1672 git tag -l --sort=refname "foo*" >actual &&1673 cat >expect <<-\EOF &&1674 foo1.101675 foo1.31676 foo1.61677 EOF1678 test_cmp expect actual1679'16801681test_expect_success 'version sort''1682 git tag -l --sort=version:refname "foo*" >actual &&1683 cat >expect <<-\EOF &&1684 foo1.31685 foo1.61686 foo1.101687 EOF1688 test_cmp expect actual1689'16901691test_expect_success 'reverse version sort''1692 git tag -l --sort=-version:refname "foo*" >actual &&1693 cat >expect <<-\EOF &&1694 foo1.101695 foo1.61696 foo1.31697 EOF1698 test_cmp expect actual1699'17001701test_expect_success 'reverse lexical sort''1702 git tag -l --sort=-refname "foo*" >actual &&1703 cat >expect <<-\EOF &&1704 foo1.61705 foo1.31706 foo1.101707 EOF1708 test_cmp expect actual1709'17101711test_expect_success 'configured lexical sort''1712 test_config tag.sort "v:refname" &&1713 git tag -l "foo*" >actual &&1714 cat >expect <<-\EOF &&1715 foo1.31716 foo1.61717 foo1.101718 EOF1719 test_cmp expect actual1720'17211722test_expect_success 'option override configured sort''1723 test_config tag.sort "v:refname" &&1724 git tag -l --sort=-refname "foo*" >actual &&1725 cat >expect <<-\EOF &&1726 foo1.61727 foo1.31728 foo1.101729 EOF1730 test_cmp expect actual1731'17321733test_expect_success 'invalid sort parameter on command line''1734 test_must_fail git tag -l --sort=notvalid "foo*" >actual1735'17361737test_expect_success 'invalid sort parameter in configuratoin''1738 test_config tag.sort "v:notvalid" &&1739 test_must_fail git tag -l "foo*"1740'17411742test_expect_success 'version sort with prerelease reordering''1743 test_config versionsort.prereleaseSuffix -rc &&1744 git tag foo1.6-rc1 &&1745 git tag foo1.6-rc2 &&1746 git tag -l --sort=version:refname "foo*" >actual &&1747 cat >expect <<-\EOF &&1748 foo1.31749 foo1.6-rc11750 foo1.6-rc21751 foo1.61752 foo1.101753 EOF1754 test_cmp expect actual1755'17561757test_expect_success 'reverse version sort with prerelease reordering''1758 test_config versionsort.prereleaseSuffix -rc &&1759 git tag -l --sort=-version:refname "foo*" >actual &&1760 cat >expect <<-\EOF &&1761 foo1.101762 foo1.61763 foo1.6-rc21764 foo1.6-rc11765 foo1.31766 EOF1767 test_cmp expect actual1768'17691770test_expect_success 'version sort with prerelease reordering and common leading character''1771 test_config versionsort.prereleaseSuffix -before &&1772 git tag foo1.7-before1 &&1773 git tag foo1.7 &&1774 git tag foo1.7-after1 &&1775 git tag -l --sort=version:refname "foo1.7*" >actual &&1776 cat >expect <<-\EOF &&1777 foo1.7-before11778 foo1.71779 foo1.7-after11780 EOF1781 test_cmp expect actual1782'17831784test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character''1785 test_config versionsort.prereleaseSuffix -before &&1786 git config --add versionsort.prereleaseSuffix -after &&1787 git tag -l --sort=version:refname "foo1.7*" >actual &&1788 cat >expect <<-\EOF &&1789 foo1.7-before11790 foo1.7-after11791 foo1.71792 EOF1793 test_cmp expect actual1794'17951796test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag''1797 test_config versionsort.prereleaseSuffix -bar &&1798 git config --add versionsort.prereleaseSuffix -foo-baz &&1799 git config --add versionsort.prereleaseSuffix -foo-bar &&1800 git tag foo1.8-foo-bar &&1801 git tag foo1.8-foo-baz &&1802 git tag foo1.8 &&1803 git tag -l --sort=version:refname "foo1.8*" >actual &&1804 cat >expect <<-\EOF &&1805 foo1.8-foo-baz1806 foo1.8-foo-bar1807 foo1.81808 EOF1809 test_cmp expect actual1810'18111812test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position''1813 test_config versionsort.prereleaseSuffix -pre &&1814 git config --add versionsort.prereleaseSuffix -prerelease &&1815 git tag foo1.9-pre1 &&1816 git tag foo1.9-pre2 &&1817 git tag foo1.9-prerelease1 &&1818 git tag -l --sort=version:refname "foo1.9*" >actual &&1819 cat >expect <<-\EOF &&1820 foo1.9-pre11821 foo1.9-pre21822 foo1.9-prerelease11823 EOF1824 test_cmp expect actual1825'18261827test_expect_success 'version sort with general suffix reordering''1828 test_config versionsort.suffix -alpha &&1829 git config --add versionsort.suffix -beta &&1830 git config --add versionsort.suffix "" &&1831 git config --add versionsort.suffix -gamma &&1832 git config --add versionsort.suffix -delta &&1833 git tag foo1.10-alpha &&1834 git tag foo1.10-beta &&1835 git tag foo1.10-gamma &&1836 git tag foo1.10-delta &&1837 git tag foo1.10-unlisted-suffix &&1838 git tag -l --sort=version:refname "foo1.10*" >actual &&1839 cat >expect <<-\EOF &&1840 foo1.10-alpha1841 foo1.10-beta1842 foo1.101843 foo1.10-unlisted-suffix1844 foo1.10-gamma1845 foo1.10-delta1846 EOF1847 test_cmp expect actual1848'18491850test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix''1851 test_config versionsort.suffix -before &&1852 test_config versionsort.prereleaseSuffix -after &&1853 git tag -l --sort=version:refname "foo1.7*" >actual &&1854 cat >expect <<-\EOF &&1855 foo1.7-before11856 foo1.71857 foo1.7-after11858 EOF1859 test_cmp expect actual1860'18611862test_expect_success 'version sort with very long prerelease suffix''1863 test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&1864 git tag -l --sort=version:refname1865'18661867run_with_limited_stack () {1868(ulimit -s128&&"$@")1869}18701871test_lazy_prereq ULIMIT_STACK_SIZE 'run_with_limited_stack true'18721873# we require ulimit, this excludes Windows1874test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo''1875 >expect &&1876 i=1 &&1877 while test$i-lt 80001878 do1879 echo "commit refs/heads/master1880committer A U Thor <author@example.com>$((1000000000 + $i * 100)) +02001881data <<EOF1882commit #$i1883EOF"1884 test$i= 1 && echo "from refs/heads/master^0"1885 i=$(($i + 1))1886 done | git fast-import &&1887 git checkout master &&1888 git tag far-far-away HEAD^ &&1889 run_with_limited_stack git tag --contains HEAD >actual &&1890 test_cmp expect actual &&1891 run_with_limited_stack git tag --no-contains HEAD >actual &&1892 test_line_count ">" 10 actual1893'18941895test_expect_success '--format should list tags as per format given''1896 cat >expect <<-\EOF &&1897 refname : refs/tags/v1.01898 refname : refs/tags/v1.0.11899 refname : refs/tags/v1.1.31900 EOF1901 git tag -l --format="refname : %(refname)" "v1*" >actual &&1902 test_cmp expect actual1903'19041905test_expect_success 'setup --merged test tags''1906 git tag mergetest-1 HEAD~2 &&1907 git tag mergetest-2 HEAD~1 &&1908 git tag mergetest-3 HEAD1909'19101911test_expect_success '--merged can be used in non-list mode''1912 cat >expect <<-\EOF &&1913 mergetest-11914 mergetest-21915 EOF1916 git tag --merged=mergetest-2 "mergetest*" >actual &&1917 test_cmp expect actual1918'19191920test_expect_success '--merged is incompatible with --no-merged''1921 test_must_fail git tag --merged HEAD --no-merged HEAD1922'19231924test_expect_success '--merged shows merged tags''1925 cat >expect <<-\EOF &&1926 mergetest-11927 mergetest-21928 EOF1929 git tag -l --merged=mergetest-2 mergetest-* >actual &&1930 test_cmp expect actual1931'19321933test_expect_success '--no-merged show unmerged tags''1934 cat >expect <<-\EOF &&1935 mergetest-31936 EOF1937 git tag -l --no-merged=mergetest-2 mergetest-* >actual &&1938 test_cmp expect actual1939'19401941test_expect_success '--no-merged can be used in non-list mode''1942 git tag --no-merged=mergetest-2 mergetest-* >actual &&1943 test_cmp expect actual1944'19451946test_expect_success 'ambiguous branch/tags not marked''1947 git tag ambiguous &&1948 git branch ambiguous &&1949 echo ambiguous >expect &&1950 git tag -l ambiguous >actual &&1951 test_cmp expect actual1952'19531954test_expect_success '--contains combined with --no-contains''1955 (1956 git init no-contains &&1957 cd no-contains &&1958 test_commit v0.1 &&1959 test_commit v0.2 &&1960 test_commit v0.3 &&1961 test_commit v0.4 &&1962 test_commit v0.5 &&1963 cat >expected <<-\EOF &&1964 v0.21965 v0.31966 v0.41967 EOF1968 git tag --contains v0.2 --no-contains v0.5 >actual &&1969 test_cmp expected actual1970 )1971'19721973# As the docs say, list tags which contain a specified *commit*. We1974# don't recurse down to tags for trees or blobs pointed to by *those*1975# commits.1976test_expect_success 'Does --[no-]contains stop at commits? Yes!''1977 cd no-contains &&1978 blob=$(git rev-parse v0.3:v0.3.t)&&1979 tree=$(git rev-parse v0.3^{tree})&&1980 git tag tag-blob$blob&&1981 git tag tag-tree$tree&&1982 git tag --contains v0.3 >actual &&1983 cat >expected <<-\EOF &&1984 v0.31985 v0.41986 v0.51987 EOF1988 test_cmp expected actual &&1989 git tag --no-contains v0.3 >actual &&1990 cat >expected <<-\EOF &&1991 v0.11992 v0.21993 EOF1994 test_cmp expected actual1995'19961997test_done