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 12# creating and listing lightweight tags: 13 14tag_exists () { 15 git show-ref --quiet --verify refs/tags/"$1" 16} 17 18# todo: git tag -l now returns always zero, when fixed, change this test 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 'looking for a tag in an empty tree should fail' \ 30'! (tag_exists mytag)' 31 32test_expect_success 'creating a tag in an empty tree should fail'' 33 test_must_fail git tag mynotag && 34 ! tag_exists mynotag 35' 36 37test_expect_success 'creating a tag for HEAD in an empty tree should fail'' 38 test_must_fail git tag mytaghead HEAD && 39 ! tag_exists mytaghead 40' 41 42test_expect_success 'creating a tag for an unknown revision should fail'' 43 test_must_fail git tag mytagnorev aaaaaaaaaaa && 44 ! tag_exists mytagnorev 45' 46 47# commit used in the tests, test_tick is also called here to freeze the date: 48test_expect_success 'creating a tag using default HEAD should succeed'' 49 test_tick && 50 echo foo >foo && 51 git add foo && 52 git commit -m Foo && 53 git tag mytag 54' 55 56test_expect_success 'listing all tags if one exists should succeed'' 57 git tag -l && 58 git tag 59' 60 61test_expect_success 'listing all tags if one exists should output that tag'' 62 test `git tag -l` = mytag && 63 test `git tag` = mytag 64' 65 66# pattern matching: 67 68test_expect_success 'listing a tag using a matching pattern should succeed' \ 69'git tag -l mytag' 70 71test_expect_success \ 72'listing a tag using a matching pattern should output that tag' \ 73'test `git tag -l mytag` = mytag' 74 75# todo: git tag -l now returns always zero, when fixed, change this test 76test_expect_success \ 77'listing tags using a non-matching pattern should suceed' \ 78'git tag -l xxx' 79 80test_expect_success \ 81'listing tags using a non-matching pattern should output nothing' \ 82'test `git tag -l xxx | wc -l` -eq 0' 83 84# special cases for creating tags: 85 86test_expect_success \ 87'trying to create a tag with the name of one existing should fail' \ 88'test_must_fail git tag mytag' 89 90test_expect_success \ 91'trying to create a tag with a non-valid name should fail'' 92 test `git tag -l | wc -l` -eq 1 && 93 test_must_fail git tag "" && 94 test_must_fail git tag .othertag && 95 test_must_fail git tag "other tag" && 96 test_must_fail git tag "othertag^" && 97 test_must_fail git tag "other~tag" && 98 test `git tag -l | wc -l` -eq 1 99' 100 101test_expect_success 'creating a tag using HEAD directly should succeed'' 102 git tag myhead HEAD && 103 tag_exists myhead 104' 105 106# deleting tags: 107 108test_expect_success 'trying to delete an unknown tag should fail'' 109 ! tag_exists unknown-tag && 110 test_must_fail git tag -d unknown-tag 111' 112 113cat>expect <<EOF 114myhead 115mytag 116EOF 117test_expect_success \ 118'trying to delete tags without params should succeed and do nothing'' 119 git tag -l > actual && test_cmp expect actual && 120 git tag -d && 121 git tag -l > actual && test_cmp expect actual 122' 123 124test_expect_success \ 125'deleting two existing tags in one command should succeed'' 126 tag_exists mytag && 127 tag_exists myhead && 128 git tag -d mytag myhead && 129 ! tag_exists mytag && 130 ! tag_exists myhead 131' 132 133test_expect_success \ 134'creating a tag with the name of another deleted one should succeed'' 135 ! tag_exists mytag && 136 git tag mytag && 137 tag_exists mytag 138' 139 140test_expect_success \ 141'trying to delete two tags, existing and not, should fail in the 2nd'' 142 tag_exists mytag && 143 ! tag_exists myhead && 144 test_must_fail git tag -d mytag anothertag && 145 ! tag_exists mytag && 146 ! tag_exists myhead 147' 148 149test_expect_success 'trying to delete an already deleted tag should fail' \ 150'test_must_fail git tag -d mytag' 151 152# listing various tags with pattern matching: 153 154cat>expect <<EOF 155a1 156aa1 157cba 158t210 159t211 160v0.2.1 161v1.0 162v1.0.1 163v1.1.3 164EOF 165test_expect_success 'listing all tags should print them ordered'' 166 git tag v1.0.1 && 167 git tag t211 && 168 git tag aa1 && 169 git tag v0.2.1 && 170 git tag v1.1.3 && 171 git tag cba && 172 git tag a1 && 173 git tag v1.0 && 174 git tag t210 && 175 git tag -l > actual && 176 test_cmp expect actual && 177 git tag > actual && 178 test_cmp expect actual 179' 180 181cat>expect <<EOF 182a1 183aa1 184cba 185EOF 186test_expect_success \ 187'listing tags with substring as pattern must print those matching'' 188 rm *a* && 189 git tag -l "*a*" > current && 190 test_cmp expect current 191' 192 193cat>expect <<EOF 194v0.2.1 195v1.0.1 196EOF 197test_expect_success \ 198'listing tags with a suffix as pattern must print those matching'' 199 git tag -l "*.1" > actual && 200 test_cmp expect actual 201' 202 203cat>expect <<EOF 204t210 205t211 206EOF 207test_expect_success \ 208'listing tags with a prefix as pattern must print those matching'' 209 git tag -l "t21*" > actual && 210 test_cmp expect actual 211' 212 213cat>expect <<EOF 214a1 215EOF 216test_expect_success \ 217'listing tags using a name as pattern must print that one matching'' 218 git tag -l a1 > actual && 219 test_cmp expect actual 220' 221 222cat>expect <<EOF 223v1.0 224EOF 225test_expect_success \ 226'listing tags using a name as pattern must print that one matching'' 227 git tag -l v1.0 > actual && 228 test_cmp expect actual 229' 230 231cat>expect <<EOF 232v1.0.1 233v1.1.3 234EOF 235test_expect_success \ 236'listing tags with ? in the pattern should print those matching'' 237 git tag -l "v1.?.?" > actual && 238 test_cmp expect actual 239' 240 241>expect 242test_expect_success \ 243'listing tags using v.* should print nothing because none have v.'' 244 git tag -l "v.*" > actual && 245 test_cmp expect actual 246' 247 248cat>expect <<EOF 249v0.2.1 250v1.0 251v1.0.1 252v1.1.3 253EOF 254test_expect_success \ 255'listing tags using v* should print only those having v'' 256 git tag -l "v*" > actual && 257 test_cmp expect actual 258' 259 260# creating and verifying lightweight tags: 261 262test_expect_success \ 263'a non-annotated tag created without parameters should point to HEAD'' 264 git tag non-annotated-tag && 265 test$(git cat-file -t non-annotated-tag)= commit && 266 test$(git rev-parse non-annotated-tag)=$(git rev-parse HEAD) 267' 268 269test_expect_success 'trying to verify an unknown tag should fail' \ 270'test_must_fail git tag -v unknown-tag' 271 272test_expect_success \ 273'trying to verify a non-annotated and non-signed tag should fail' \ 274'test_must_fail git tag -v non-annotated-tag' 275 276test_expect_success \ 277'trying to verify many non-annotated or unknown tags, should fail' \ 278'test_must_fail git tag -v unknown-tag1 non-annotated-tag unknown-tag2' 279 280# creating annotated tags: 281 282get_tag_msg () { 283 git cat-file tag "$1"|sed-e"/BEGIN PGP/q" 284} 285 286# run test_tick before committing always gives the time in that timezone 287get_tag_header () { 288cat<<EOF 289object$2 290type$3 291tag$1 292tagger C O Mitter <committer@example.com>$4-0700 293 294EOF 295} 296 297commit=$(git rev-parse HEAD) 298time=$test_tick 299 300get_tag_header annotated-tag$commit commit $time>expect 301echo"A message">>expect 302test_expect_success \ 303'creating an annotated tag with -m message should succeed'' 304 git tag -m "A message" annotated-tag && 305 get_tag_msg annotated-tag >actual && 306 test_cmp expect actual 307' 308 309cat>msgfile <<EOF 310Another message 311in a file. 312EOF 313get_tag_header file-annotated-tag$commit commit $time>expect 314cat msgfile >>expect 315test_expect_success \ 316'creating an annotated tag with -F messagefile should succeed'' 317 git tag -F msgfile file-annotated-tag && 318 get_tag_msg file-annotated-tag >actual && 319 test_cmp expect actual 320' 321 322cat>inputmsg <<EOF 323A message from the 324standard input 325EOF 326get_tag_header stdin-annotated-tag$commit commit $time>expect 327cat inputmsg >>expect 328test_expect_success 'creating an annotated tag with -F - should succeed'' 329 git tag -F - stdin-annotated-tag <inputmsg && 330 get_tag_msg stdin-annotated-tag >actual && 331 test_cmp expect actual 332' 333 334test_expect_success \ 335'trying to create a tag with a non-existing -F file should fail'' 336 ! test -f nonexistingfile && 337 ! tag_exists notag && 338 test_must_fail git tag -F nonexistingfile notag && 339 ! tag_exists notag 340' 341 342test_expect_success \ 343'trying to create tags giving both -m or -F options should fail'' 344 echo "message file 1" >msgfile1 && 345 echo "message file 2" >msgfile2 && 346 ! tag_exists msgtag && 347 test_must_fail git tag -m "message 1" -F msgfile1 msgtag && 348 ! tag_exists msgtag && 349 test_must_fail git tag -F msgfile1 -m "message 1" msgtag && 350 ! tag_exists msgtag && 351 test_must_fail git tag -m "message 1" -F msgfile1 \ 352 -m "message 2" msgtag && 353 ! tag_exists msgtag 354' 355 356# blank and empty messages: 357 358get_tag_header empty-annotated-tag$commit commit $time>expect 359test_expect_success \ 360'creating a tag with an empty -m message should succeed'' 361 git tag -m "" empty-annotated-tag && 362 get_tag_msg empty-annotated-tag >actual && 363 test_cmp expect actual 364' 365 366>emptyfile 367get_tag_header emptyfile-annotated-tag$commit commit $time>expect 368test_expect_success \ 369'creating a tag with an empty -F messagefile should succeed'' 370 git tag -F emptyfile emptyfile-annotated-tag && 371 get_tag_msg emptyfile-annotated-tag >actual && 372 test_cmp expect actual 373' 374 375printf'\n\n \n\t\nLeading blank lines\n'>blanksfile 376printf'\n\t \t \nRepeated blank lines\n'>>blanksfile 377printf'\n\n\nTrailing spaces\t \n'>>blanksfile 378printf'\nTrailing blank lines\n\n\t \n\n'>>blanksfile 379get_tag_header blanks-annotated-tag$commit commit $time>expect 380cat>>expect <<EOF 381Leading blank lines 382 383Repeated blank lines 384 385Trailing spaces 386 387Trailing blank lines 388EOF 389test_expect_success \ 390'extra blanks in the message for an annotated tag should be removed'' 391 git tag -F blanksfile blanks-annotated-tag && 392 get_tag_msg blanks-annotated-tag >actual && 393 test_cmp expect actual 394' 395 396get_tag_header blank-annotated-tag$commit commit $time>expect 397test_expect_success \ 398'creating a tag with blank -m message with spaces should succeed'' 399 git tag -m " " blank-annotated-tag && 400 get_tag_msg blank-annotated-tag >actual && 401 test_cmp expect actual 402' 403 404echo' '>blankfile 405echo''>>blankfile 406echo' '>>blankfile 407get_tag_header blankfile-annotated-tag$commit commit $time>expect 408test_expect_success \ 409'creating a tag with blank -F messagefile with spaces should succeed'' 410 git tag -F blankfile blankfile-annotated-tag && 411 get_tag_msg blankfile-annotated-tag >actual && 412 test_cmp expect actual 413' 414 415printf' '>blanknonlfile 416get_tag_header blanknonlfile-annotated-tag$commit commit $time>expect 417test_expect_success \ 418'creating a tag with -F file of spaces and no newline should succeed'' 419 git tag -F blanknonlfile blanknonlfile-annotated-tag && 420 get_tag_msg blanknonlfile-annotated-tag >actual && 421 test_cmp expect actual 422' 423 424# messages with commented lines: 425 426cat>commentsfile <<EOF 427# A comment 428 429############ 430The message. 431############ 432One line. 433 434 435# commented lines 436# commented lines 437 438Another line. 439# comments 440 441Last line. 442EOF 443get_tag_header comments-annotated-tag$commit commit $time>expect 444cat>>expect <<EOF 445The message. 446One line. 447 448Another line. 449 450Last line. 451EOF 452test_expect_success \ 453'creating a tag using a -F messagefile with #comments should succeed'' 454 git tag -F commentsfile comments-annotated-tag && 455 get_tag_msg comments-annotated-tag >actual && 456 test_cmp expect actual 457' 458 459get_tag_header comment-annotated-tag$commit commit $time>expect 460test_expect_success \ 461'creating a tag with a #comment in the -m message should succeed'' 462 git tag -m "#comment" comment-annotated-tag && 463 get_tag_msg comment-annotated-tag >actual && 464 test_cmp expect actual 465' 466 467echo'#comment'>commentfile 468echo''>>commentfile 469echo'####'>>commentfile 470get_tag_header commentfile-annotated-tag$commit commit $time>expect 471test_expect_success \ 472'creating a tag with #comments in the -F messagefile should succeed'' 473 git tag -F commentfile commentfile-annotated-tag && 474 get_tag_msg commentfile-annotated-tag >actual && 475 test_cmp expect actual 476' 477 478printf'#comment'>commentnonlfile 479get_tag_header commentnonlfile-annotated-tag$commit commit $time>expect 480test_expect_success \ 481'creating a tag with a file of #comment and no newline should succeed'' 482 git tag -F commentnonlfile commentnonlfile-annotated-tag && 483 get_tag_msg commentnonlfile-annotated-tag >actual && 484 test_cmp expect actual 485' 486 487# listing messages for annotated non-signed tags: 488 489test_expect_success \ 490'listing the one-line message of a non-signed tag should succeed'' 491 git tag -m "A msg" tag-one-line && 492 493 echo "tag-one-line" >expect && 494 git tag -l | grep "^tag-one-line" >actual && 495 test_cmp expect actual && 496 git tag -n0 -l | grep "^tag-one-line" >actual && 497 test_cmp expect actual && 498 git tag -n0 -l tag-one-line >actual && 499 test_cmp expect actual && 500 501 echo "tag-one-line A msg" >expect && 502 git tag -n1 -l | grep "^tag-one-line" >actual && 503 test_cmp expect actual && 504 git tag -n -l | grep "^tag-one-line" >actual && 505 test_cmp expect actual && 506 git tag -n1 -l tag-one-line >actual && 507 test_cmp expect actual && 508 git tag -n2 -l tag-one-line >actual && 509 test_cmp expect actual && 510 git tag -n999 -l tag-one-line >actual && 511 test_cmp expect actual 512' 513 514test_expect_success \ 515'listing the zero-lines message of a non-signed tag should succeed'' 516 git tag -m "" tag-zero-lines && 517 518 echo "tag-zero-lines" >expect && 519 git tag -l | grep "^tag-zero-lines" >actual && 520 test_cmp expect actual && 521 git tag -n0 -l | grep "^tag-zero-lines" >actual && 522 test_cmp expect actual && 523 git tag -n0 -l tag-zero-lines >actual && 524 test_cmp expect actual && 525 526 echo "tag-zero-lines " >expect && 527 git tag -n1 -l | grep "^tag-zero-lines" >actual && 528 test_cmp expect actual && 529 git tag -n -l | grep "^tag-zero-lines" >actual && 530 test_cmp expect actual && 531 git tag -n1 -l tag-zero-lines >actual && 532 test_cmp expect actual && 533 git tag -n2 -l tag-zero-lines >actual && 534 test_cmp expect actual && 535 git tag -n999 -l tag-zero-lines >actual && 536 test_cmp expect actual 537' 538 539echo'tag line one'>annotagmsg 540echo'tag line two'>>annotagmsg 541echo'tag line three'>>annotagmsg 542test_expect_success \ 543'listing many message lines of a non-signed tag should succeed'' 544 git tag -F annotagmsg tag-lines && 545 546 echo "tag-lines" >expect && 547 git tag -l | grep "^tag-lines" >actual && 548 test_cmp expect actual && 549 git tag -n0 -l | grep "^tag-lines" >actual && 550 test_cmp expect actual && 551 git tag -n0 -l tag-lines >actual && 552 test_cmp expect actual && 553 554 echo "tag-lines tag line one" >expect && 555 git tag -n1 -l | grep "^tag-lines" >actual && 556 test_cmp expect actual && 557 git tag -n -l | grep "^tag-lines" >actual && 558 test_cmp expect actual && 559 git tag -n1 -l tag-lines >actual && 560 test_cmp expect actual && 561 562 echo " tag line two" >>expect && 563 git tag -n2 -l | grep "^ *tag.line" >actual && 564 test_cmp expect actual && 565 git tag -n2 -l tag-lines >actual && 566 test_cmp expect actual && 567 568 echo " tag line three" >>expect && 569 git tag -n3 -l | grep "^ *tag.line" >actual && 570 test_cmp expect actual && 571 git tag -n3 -l tag-lines >actual && 572 test_cmp expect actual && 573 git tag -n4 -l | grep "^ *tag.line" >actual && 574 test_cmp expect actual && 575 git tag -n4 -l tag-lines >actual && 576 test_cmp expect actual && 577 git tag -n99 -l | grep "^ *tag.line" >actual && 578 test_cmp expect actual && 579 git tag -n99 -l tag-lines >actual && 580 test_cmp expect actual 581' 582 583# subsequent tests require gpg; check if it is available 584gpg --version>/dev/null 585if[ $? -eq127];then 586 say "gpg not found - skipping tag signing and verification tests" 587 test_done 588exit 589fi 590 591# trying to verify annotated non-signed tags: 592 593test_expect_success \ 594'trying to verify an annotated non-signed tag should fail'' 595 tag_exists annotated-tag && 596 test_must_fail git tag -v annotated-tag 597' 598 599test_expect_success \ 600'trying to verify a file-annotated non-signed tag should fail'' 601 tag_exists file-annotated-tag && 602 test_must_fail git tag -v file-annotated-tag 603' 604 605test_expect_success \ 606'trying to verify two annotated non-signed tags should fail'' 607 tag_exists annotated-tag file-annotated-tag && 608 test_must_fail git tag -v annotated-tag file-annotated-tag 609' 610 611# creating and verifying signed tags: 612 613# As said here: http://www.gnupg.org/documentation/faqs.html#q6.19 614# the gpg version 1.0.6 didn't parse trust packets correctly, so for 615# that version, creation of signed tags using the generated key fails. 616case"$(gpg --version)"in 617'gpg (GnuPG) 1.0.6'*) 618 say "Skipping signed tag tests, because a bug in 1.0.6 version" 619 test_done 620exit 621;; 622esac 623 624# key generation info: gpg --homedir t/t7004 --gen-key 625# Type DSA and Elgamal, size 2048 bits, no expiration date. 626# Name and email: C O Mitter <committer@example.com> 627# No password given, to enable non-interactive operation. 628 629cp-R"$TEST_DIRECTORY"/t7004 ./gpghome 630chmod0700 gpghome 631GNUPGHOME="$(pwd)/gpghome" 632export GNUPGHOME 633 634get_tag_header signed-tag$commit commit $time>expect 635echo'A signed tag message'>>expect 636echo'-----BEGIN PGP SIGNATURE-----'>>expect 637test_expect_success 'creating a signed tag with -m message should succeed'' 638 git tag -s -m "A signed tag message" signed-tag && 639 get_tag_msg signed-tag >actual && 640 test_cmp expect actual 641' 642 643get_tag_header u-signed-tag$commit commit $time>expect 644echo'Another message'>>expect 645echo'-----BEGIN PGP SIGNATURE-----'>>expect 646test_expect_success 'sign with a given key id'' 647 648 git tag -u committer@example.com -m "Another message" u-signed-tag && 649 get_tag_msg u-signed-tag >actual && 650 test_cmp expect actual 651 652' 653 654test_expect_success 'sign with an unknown id (1)'' 655 656 test_must_fail git tag -u author@example.com \ 657 -m "Another message" o-signed-tag 658 659' 660 661test_expect_success 'sign with an unknown id (2)'' 662 663 test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag 664 665' 666 667cat>fakeeditor <<'EOF' 668#!/bin/sh 669test -n "$1" && exec >"$1" 670echo A signed tag message 671echo from a fake editor. 672EOF 673chmod+x fakeeditor 674 675get_tag_header implied-sign$commit commit $time>expect 676./fakeeditor >>expect 677echo'-----BEGIN PGP SIGNATURE-----'>>expect 678test_expect_success '-u implies signed tag'' 679 GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign && 680 get_tag_msg implied-sign >actual && 681 test_cmp expect actual 682' 683 684cat>sigmsgfile <<EOF 685Another signed tag 686message in a file. 687EOF 688get_tag_header file-signed-tag$commit commit $time>expect 689cat sigmsgfile >>expect 690echo'-----BEGIN PGP SIGNATURE-----'>>expect 691test_expect_success \ 692'creating a signed tag with -F messagefile should succeed'' 693 git tag -s -F sigmsgfile file-signed-tag && 694 get_tag_msg file-signed-tag >actual && 695 test_cmp expect actual 696' 697 698cat>siginputmsg <<EOF 699A signed tag message from 700the standard input 701EOF 702get_tag_header stdin-signed-tag$commit commit $time>expect 703cat siginputmsg >>expect 704echo'-----BEGIN PGP SIGNATURE-----'>>expect 705test_expect_success 'creating a signed tag with -F - should succeed'' 706 git tag -s -F - stdin-signed-tag <siginputmsg && 707 get_tag_msg stdin-signed-tag >actual && 708 test_cmp expect actual 709' 710 711get_tag_header implied-annotate$commit commit $time>expect 712./fakeeditor >>expect 713echo'-----BEGIN PGP SIGNATURE-----'>>expect 714test_expect_success '-s implies annotated tag'' 715 GIT_EDITOR=./fakeeditor git tag -s implied-annotate && 716 get_tag_msg implied-annotate >actual && 717 test_cmp expect actual 718' 719 720test_expect_success \ 721'trying to create a signed tag with non-existing -F file should fail'' 722 ! test -f nonexistingfile && 723 ! tag_exists nosigtag && 724 test_must_fail git tag -s -F nonexistingfile nosigtag && 725 ! tag_exists nosigtag 726' 727 728test_expect_success 'verifying a signed tag should succeed' \ 729'git tag -v signed-tag' 730 731test_expect_success 'verifying two signed tags in one command should succeed' \ 732'git tag -v signed-tag file-signed-tag' 733 734test_expect_success \ 735'verifying many signed and non-signed tags should fail'' 736 test_must_fail git tag -v signed-tag annotated-tag && 737 test_must_fail git tag -v file-annotated-tag file-signed-tag && 738 test_must_fail git tag -v annotated-tag \ 739 file-signed-tag file-annotated-tag && 740 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag 741' 742 743test_expect_success 'verifying a forged tag should fail'' 744 forged=$(git cat-file tag signed-tag | 745 sed -e "s/signed-tag/forged-tag/" | 746 git mktag) && 747 git tag forged-tag$forged&& 748 test_must_fail git tag -v forged-tag 749' 750 751# blank and empty messages for signed tags: 752 753get_tag_header empty-signed-tag$commit commit $time>expect 754echo'-----BEGIN PGP SIGNATURE-----'>>expect 755test_expect_success \ 756'creating a signed tag with an empty -m message should succeed'' 757 git tag -s -m "" empty-signed-tag && 758 get_tag_msg empty-signed-tag >actual && 759 test_cmp expect actual && 760 git tag -v empty-signed-tag 761' 762 763>sigemptyfile 764get_tag_header emptyfile-signed-tag$commit commit $time>expect 765echo'-----BEGIN PGP SIGNATURE-----'>>expect 766test_expect_success \ 767'creating a signed tag with an empty -F messagefile should succeed'' 768 git tag -s -F sigemptyfile emptyfile-signed-tag && 769 get_tag_msg emptyfile-signed-tag >actual && 770 test_cmp expect actual && 771 git tag -v emptyfile-signed-tag 772' 773 774printf'\n\n \n\t\nLeading blank lines\n'> sigblanksfile 775printf'\n\t \t \nRepeated blank lines\n'>>sigblanksfile 776printf'\n\n\nTrailing spaces\t \n'>>sigblanksfile 777printf'\nTrailing blank lines\n\n\t \n\n'>>sigblanksfile 778get_tag_header blanks-signed-tag$commit commit $time>expect 779cat>>expect <<EOF 780Leading blank lines 781 782Repeated blank lines 783 784Trailing spaces 785 786Trailing blank lines 787EOF 788echo'-----BEGIN PGP SIGNATURE-----'>>expect 789test_expect_success \ 790'extra blanks in the message for a signed tag should be removed'' 791 git tag -s -F sigblanksfile blanks-signed-tag && 792 get_tag_msg blanks-signed-tag >actual && 793 test_cmp expect actual && 794 git tag -v blanks-signed-tag 795' 796 797get_tag_header blank-signed-tag$commit commit $time>expect 798echo'-----BEGIN PGP SIGNATURE-----'>>expect 799test_expect_success \ 800'creating a signed tag with a blank -m message should succeed'' 801 git tag -s -m " " blank-signed-tag && 802 get_tag_msg blank-signed-tag >actual && 803 test_cmp expect actual && 804 git tag -v blank-signed-tag 805' 806 807echo' '>sigblankfile 808echo''>>sigblankfile 809echo' '>>sigblankfile 810get_tag_header blankfile-signed-tag$commit commit $time>expect 811echo'-----BEGIN PGP SIGNATURE-----'>>expect 812test_expect_success \ 813'creating a signed tag with blank -F file with spaces should succeed'' 814 git tag -s -F sigblankfile blankfile-signed-tag && 815 get_tag_msg blankfile-signed-tag >actual && 816 test_cmp expect actual && 817 git tag -v blankfile-signed-tag 818' 819 820printf' '>sigblanknonlfile 821get_tag_header blanknonlfile-signed-tag$commit commit $time>expect 822echo'-----BEGIN PGP SIGNATURE-----'>>expect 823test_expect_success \ 824'creating a signed tag with spaces and no newline should succeed'' 825 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag && 826 get_tag_msg blanknonlfile-signed-tag >actual && 827 test_cmp expect actual && 828 git tag -v signed-tag 829' 830 831# messages with commented lines for signed tags: 832 833cat>sigcommentsfile <<EOF 834# A comment 835 836############ 837The message. 838############ 839One line. 840 841 842# commented lines 843# commented lines 844 845Another line. 846# comments 847 848Last line. 849EOF 850get_tag_header comments-signed-tag$commit commit $time>expect 851cat>>expect <<EOF 852The message. 853One line. 854 855Another line. 856 857Last line. 858EOF 859echo'-----BEGIN PGP SIGNATURE-----'>>expect 860test_expect_success \ 861'creating a signed tag with a -F file with #comments should succeed'' 862 git tag -s -F sigcommentsfile comments-signed-tag && 863 get_tag_msg comments-signed-tag >actual && 864 test_cmp expect actual && 865 git tag -v comments-signed-tag 866' 867 868get_tag_header comment-signed-tag$commit commit $time>expect 869echo'-----BEGIN PGP SIGNATURE-----'>>expect 870test_expect_success \ 871'creating a signed tag with #commented -m message should succeed'' 872 git tag -s -m "#comment" comment-signed-tag && 873 get_tag_msg comment-signed-tag >actual && 874 test_cmp expect actual && 875 git tag -v comment-signed-tag 876' 877 878echo'#comment'>sigcommentfile 879echo''>>sigcommentfile 880echo'####'>>sigcommentfile 881get_tag_header commentfile-signed-tag$commit commit $time>expect 882echo'-----BEGIN PGP SIGNATURE-----'>>expect 883test_expect_success \ 884'creating a signed tag with #commented -F messagefile should succeed'' 885 git tag -s -F sigcommentfile commentfile-signed-tag && 886 get_tag_msg commentfile-signed-tag >actual && 887 test_cmp expect actual && 888 git tag -v commentfile-signed-tag 889' 890 891printf'#comment'>sigcommentnonlfile 892get_tag_header commentnonlfile-signed-tag$commit commit $time>expect 893echo'-----BEGIN PGP SIGNATURE-----'>>expect 894test_expect_success \ 895'creating a signed tag with a #comment and no newline should succeed'' 896 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag && 897 get_tag_msg commentnonlfile-signed-tag >actual && 898 test_cmp expect actual && 899 git tag -v commentnonlfile-signed-tag 900' 901 902# listing messages for signed tags: 903 904test_expect_success \ 905'listing the one-line message of a signed tag should succeed'' 906 git tag -s -m "A message line signed" stag-one-line && 907 908 echo "stag-one-line" >expect && 909 git tag -l | grep "^stag-one-line" >actual && 910 test_cmp expect actual && 911 git tag -n0 -l | grep "^stag-one-line" >actual && 912 test_cmp expect actual && 913 git tag -n0 -l stag-one-line >actual && 914 test_cmp expect actual && 915 916 echo "stag-one-line A message line signed" >expect && 917 git tag -n1 -l | grep "^stag-one-line" >actual && 918 test_cmp expect actual && 919 git tag -n -l | grep "^stag-one-line" >actual && 920 test_cmp expect actual && 921 git tag -n1 -l stag-one-line >actual && 922 test_cmp expect actual && 923 git tag -n2 -l stag-one-line >actual && 924 test_cmp expect actual && 925 git tag -n999 -l stag-one-line >actual && 926 test_cmp expect actual 927' 928 929test_expect_success \ 930'listing the zero-lines message of a signed tag should succeed'' 931 git tag -s -m "" stag-zero-lines && 932 933 echo "stag-zero-lines" >expect && 934 git tag -l | grep "^stag-zero-lines" >actual && 935 test_cmp expect actual && 936 git tag -n0 -l | grep "^stag-zero-lines" >actual && 937 test_cmp expect actual && 938 git tag -n0 -l stag-zero-lines >actual && 939 test_cmp expect actual && 940 941 echo "stag-zero-lines " >expect && 942 git tag -n1 -l | grep "^stag-zero-lines" >actual && 943 test_cmp expect actual && 944 git tag -n -l | grep "^stag-zero-lines" >actual && 945 test_cmp expect actual && 946 git tag -n1 -l stag-zero-lines >actual && 947 test_cmp expect actual && 948 git tag -n2 -l stag-zero-lines >actual && 949 test_cmp expect actual && 950 git tag -n999 -l stag-zero-lines >actual && 951 test_cmp expect actual 952' 953 954echo'stag line one'>sigtagmsg 955echo'stag line two'>>sigtagmsg 956echo'stag line three'>>sigtagmsg 957test_expect_success \ 958'listing many message lines of a signed tag should succeed'' 959 git tag -s -F sigtagmsg stag-lines && 960 961 echo "stag-lines" >expect && 962 git tag -l | grep "^stag-lines" >actual && 963 test_cmp expect actual && 964 git tag -n0 -l | grep "^stag-lines" >actual && 965 test_cmp expect actual && 966 git tag -n0 -l stag-lines >actual && 967 test_cmp expect actual && 968 969 echo "stag-lines stag line one" >expect && 970 git tag -n1 -l | grep "^stag-lines" >actual && 971 test_cmp expect actual && 972 git tag -n -l | grep "^stag-lines" >actual && 973 test_cmp expect actual && 974 git tag -n1 -l stag-lines >actual && 975 test_cmp expect actual && 976 977 echo " stag line two" >>expect && 978 git tag -n2 -l | grep "^ *stag.line" >actual && 979 test_cmp expect actual && 980 git tag -n2 -l stag-lines >actual && 981 test_cmp expect actual && 982 983 echo " stag line three" >>expect && 984 git tag -n3 -l | grep "^ *stag.line" >actual && 985 test_cmp expect actual && 986 git tag -n3 -l stag-lines >actual && 987 test_cmp expect actual && 988 git tag -n4 -l | grep "^ *stag.line" >actual && 989 test_cmp expect actual && 990 git tag -n4 -l stag-lines >actual && 991 test_cmp expect actual && 992 git tag -n99 -l | grep "^ *stag.line" >actual && 993 test_cmp expect actual && 994 git tag -n99 -l stag-lines >actual && 995 test_cmp expect actual 996' 997 998# tags pointing to objects different from commits: 9991000tree=$(git rev-parse HEAD^{tree})1001blob=$(git rev-parse HEAD:foo)1002tag=$(git rev-parse signed-tag)10031004get_tag_header tree-signed-tag$tree tree $time>expect1005echo"A message for a tree">>expect1006echo'-----BEGIN PGP SIGNATURE-----'>>expect1007test_expect_success \1008'creating a signed tag pointing to a tree should succeed''1009 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&1010 get_tag_msg tree-signed-tag >actual &&1011 test_cmp expect actual1012'10131014get_tag_header blob-signed-tag$blob blob $time>expect1015echo"A message for a blob">>expect1016echo'-----BEGIN PGP SIGNATURE-----'>>expect1017test_expect_success \1018'creating a signed tag pointing to a blob should succeed''1019 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&1020 get_tag_msg blob-signed-tag >actual &&1021 test_cmp expect actual1022'10231024get_tag_header tag-signed-tag$tag tag $time>expect1025echo"A message for another tag">>expect1026echo'-----BEGIN PGP SIGNATURE-----'>>expect1027test_expect_success \1028'creating a signed tag pointing to another tag should succeed''1029 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&1030 get_tag_msg tag-signed-tag >actual &&1031 test_cmp expect actual1032'10331034# try to sign with bad user.signingkey1035git config user.signingkey BobTheMouse1036test_expect_success \1037'git tag -s fails if gpg is misconfigured' \1038'test_must_fail git tag -s -m tail tag-gpg-failure'1039git config --unset user.signingkey10401041# try to verify without gpg:10421043rm-rf gpghome1044test_expect_success \1045'verify signed tag fails when public key is not present' \1046'test_must_fail git tag -v signed-tag'10471048test_expect_success \1049'git tag -a fails if tag annotation is empty''1050 ! (GIT_EDITOR=cat git tag -a initial-comment)1051'10521053test_expect_success \1054'message in editor has initial comment''1055 GIT_EDITOR=cat git tag -a initial-comment > actual1056 # check the first line --- should be empty1057 first=$(sed -e 1q <actual)&&1058 test -z "$first" &&1059 # remove commented lines from the remainder -- should be empty1060 rest=$(sed -e 1d -e '/^#/d' <actual)&&1061 test -z "$rest"1062'10631064get_tag_header reuse $commit commit $time>expect1065echo"An annotation to be reused">> expect1066test_expect_success \1067'overwriting an annoted tag should use its previous body''1068 git tag -a -m "An annotation to be reused" reuse &&1069 GIT_EDITOR=true git tag -f -a reuse &&1070 get_tag_msg reuse >actual &&1071 test_cmp expect actual1072'10731074test_expect_success 'filename for the message is relative to cwd''1075 mkdir subdir &&1076 echo "Tag message in top directory" >msgfile-5 &&1077 echo "Tag message in sub directory" >subdir/msgfile-5 &&1078 (1079 cd subdir &&1080 git tag -a -F msgfile-5 tag-from-subdir1081 ) &&1082 git cat-file tag tag-from-subdir | grep "in sub directory"1083'10841085test_expect_success 'filename for the message is relative to cwd''1086 echo "Tag message in sub directory" >subdir/msgfile-6 &&1087 (1088 cd subdir &&1089 git tag -a -F msgfile-6 tag-from-subdir-21090 ) &&1091 git cat-file tag tag-from-subdir-2 | grep "in sub directory"1092'10931094# create a few more commits to test --contains10951096hash1=$(git rev-parse HEAD)10971098test_expect_success 'creating second commit and tag''1099 echo foo-2.0 >foo &&1100 git add foo &&1101 git commit -m second1102 git tag v2.01103'11041105hash2=$(git rev-parse HEAD)11061107test_expect_success 'creating third commit without tag''1108 echo foo-dev >foo &&1109 git add foo &&1110 git commit -m third1111'11121113hash3=$(git rev-parse HEAD)11141115# simple linear checks of --continue11161117cat> expected <<EOF1118v0.2.11119v1.01120v1.0.11121v1.1.31122v2.01123EOF11241125test_expect_success 'checking that first commit is in all tags (hash)'"1126 git tag -l --contains$hash1v* >actual1127 test_cmp expected actual1128"11291130# other ways of specifying the commit1131test_expect_success 'checking that first commit is in all tags (tag)'"1132 git tag -l --contains v1.0 v* >actual1133 test_cmp expected actual1134"11351136test_expect_success 'checking that first commit is in all tags (relative)'"1137 git tag -l --contains HEAD~2 v* >actual1138 test_cmp expected actual1139"11401141cat> expected <<EOF1142v2.01143EOF11441145test_expect_success 'checking that second commit only has one tag'"1146 git tag -l --contains$hash2v* >actual1147 test_cmp expected actual1148"114911501151cat> expected <<EOF1152EOF11531154test_expect_success 'checking that third commit has no tags'"1155 git tag -l --contains$hash3v* >actual1156 test_cmp expected actual1157"11581159# how about a simple merge?11601161test_expect_success 'creating simple branch''1162 git branch stable v2.0 &&1163 git checkout stable &&1164 echo foo-3.0 > foo &&1165 git commit foo -m fourth1166 git tag v3.01167'11681169hash4=$(git rev-parse HEAD)11701171cat> expected <<EOF1172v3.01173EOF11741175test_expect_success 'checking that branch head only has one tag'"1176 git tag -l --contains$hash4v* >actual1177 test_cmp expected actual1178"11791180test_expect_success 'merging original branch into this branch''1181 git merge --strategy=ours master &&1182 git tag v4.01183'11841185cat> expected <<EOF1186v4.01187EOF11881189test_expect_success 'checking that original branch head has one tag now'"1190 git tag -l --contains$hash3v* >actual1191 test_cmp expected actual1192"11931194cat> expected <<EOF1195v0.2.11196v1.01197v1.0.11198v1.1.31199v2.01200v3.01201v4.01202EOF12031204test_expect_success 'checking that initial commit is in all tags'"1205 git tag -l --contains$hash1v* >actual1206 test_cmp expected actual1207"12081209# mixing modes and options:12101211test_expect_success 'mixing incompatibles modes and options is forbidden''1212 test_must_fail git tag -a1213 test_must_fail git tag -l -v1214 test_must_fail git tag -n 1001215 test_must_fail git tag -l -m msg1216 test_must_fail git tag -l -F some file1217 test_must_fail git tag -v -s1218'12191220test_done