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 260test_expect_success 'tag -l can accept multiple patterns'' 261 git tag -l "v1*" "v0*" >actual && 262 test_cmp expect actual 263' 264 265# creating and verifying lightweight tags: 266 267test_expect_success \ 268'a non-annotated tag created without parameters should point to HEAD'' 269 git tag non-annotated-tag && 270 test$(git cat-file -t non-annotated-tag)= commit && 271 test$(git rev-parse non-annotated-tag)=$(git rev-parse HEAD) 272' 273 274test_expect_success 'trying to verify an unknown tag should fail' \ 275'test_must_fail git tag -v unknown-tag' 276 277test_expect_success \ 278'trying to verify a non-annotated and non-signed tag should fail' \ 279'test_must_fail git tag -v non-annotated-tag' 280 281test_expect_success \ 282'trying to verify many non-annotated or unknown tags, should fail' \ 283'test_must_fail git tag -v unknown-tag1 non-annotated-tag unknown-tag2' 284 285# creating annotated tags: 286 287get_tag_msg () { 288 git cat-file tag "$1"|sed-e"/BEGIN PGP/q" 289} 290 291# run test_tick before committing always gives the time in that timezone 292get_tag_header () { 293cat<<EOF 294object$2 295type$3 296tag$1 297tagger C O Mitter <committer@example.com>$4-0700 298 299EOF 300} 301 302commit=$(git rev-parse HEAD) 303time=$test_tick 304 305get_tag_header annotated-tag$commit commit $time>expect 306echo"A message">>expect 307test_expect_success \ 308'creating an annotated tag with -m message should succeed'' 309 git tag -m "A message" annotated-tag && 310 get_tag_msg annotated-tag >actual && 311 test_cmp expect actual 312' 313 314cat>msgfile <<EOF 315Another message 316in a file. 317EOF 318get_tag_header file-annotated-tag$commit commit $time>expect 319cat msgfile >>expect 320test_expect_success \ 321'creating an annotated tag with -F messagefile should succeed'' 322 git tag -F msgfile file-annotated-tag && 323 get_tag_msg file-annotated-tag >actual && 324 test_cmp expect actual 325' 326 327cat>inputmsg <<EOF 328A message from the 329standard input 330EOF 331get_tag_header stdin-annotated-tag$commit commit $time>expect 332cat inputmsg >>expect 333test_expect_success 'creating an annotated tag with -F - should succeed'' 334 git tag -F - stdin-annotated-tag <inputmsg && 335 get_tag_msg stdin-annotated-tag >actual && 336 test_cmp expect actual 337' 338 339test_expect_success \ 340'trying to create a tag with a non-existing -F file should fail'' 341 ! test -f nonexistingfile && 342 ! tag_exists notag && 343 test_must_fail git tag -F nonexistingfile notag && 344 ! tag_exists notag 345' 346 347test_expect_success \ 348'trying to create tags giving both -m or -F options should fail'' 349 echo "message file 1" >msgfile1 && 350 echo "message file 2" >msgfile2 && 351 ! tag_exists msgtag && 352 test_must_fail git tag -m "message 1" -F msgfile1 msgtag && 353 ! tag_exists msgtag && 354 test_must_fail git tag -F msgfile1 -m "message 1" msgtag && 355 ! tag_exists msgtag && 356 test_must_fail git tag -m "message 1" -F msgfile1 \ 357 -m "message 2" msgtag && 358 ! tag_exists msgtag 359' 360 361# blank and empty messages: 362 363get_tag_header empty-annotated-tag$commit commit $time>expect 364test_expect_success \ 365'creating a tag with an empty -m message should succeed'' 366 git tag -m "" empty-annotated-tag && 367 get_tag_msg empty-annotated-tag >actual && 368 test_cmp expect actual 369' 370 371>emptyfile 372get_tag_header emptyfile-annotated-tag$commit commit $time>expect 373test_expect_success \ 374'creating a tag with an empty -F messagefile should succeed'' 375 git tag -F emptyfile emptyfile-annotated-tag && 376 get_tag_msg emptyfile-annotated-tag >actual && 377 test_cmp expect actual 378' 379 380printf'\n\n \n\t\nLeading blank lines\n'>blanksfile 381printf'\n\t \t \nRepeated blank lines\n'>>blanksfile 382printf'\n\n\nTrailing spaces\t \n'>>blanksfile 383printf'\nTrailing blank lines\n\n\t \n\n'>>blanksfile 384get_tag_header blanks-annotated-tag$commit commit $time>expect 385cat>>expect <<EOF 386Leading blank lines 387 388Repeated blank lines 389 390Trailing spaces 391 392Trailing blank lines 393EOF 394test_expect_success \ 395'extra blanks in the message for an annotated tag should be removed'' 396 git tag -F blanksfile blanks-annotated-tag && 397 get_tag_msg blanks-annotated-tag >actual && 398 test_cmp expect actual 399' 400 401get_tag_header blank-annotated-tag$commit commit $time>expect 402test_expect_success \ 403'creating a tag with blank -m message with spaces should succeed'' 404 git tag -m " " blank-annotated-tag && 405 get_tag_msg blank-annotated-tag >actual && 406 test_cmp expect actual 407' 408 409echo' '>blankfile 410echo''>>blankfile 411echo' '>>blankfile 412get_tag_header blankfile-annotated-tag$commit commit $time>expect 413test_expect_success \ 414'creating a tag with blank -F messagefile with spaces should succeed'' 415 git tag -F blankfile blankfile-annotated-tag && 416 get_tag_msg blankfile-annotated-tag >actual && 417 test_cmp expect actual 418' 419 420printf' '>blanknonlfile 421get_tag_header blanknonlfile-annotated-tag$commit commit $time>expect 422test_expect_success \ 423'creating a tag with -F file of spaces and no newline should succeed'' 424 git tag -F blanknonlfile blanknonlfile-annotated-tag && 425 get_tag_msg blanknonlfile-annotated-tag >actual && 426 test_cmp expect actual 427' 428 429# messages with commented lines: 430 431cat>commentsfile <<EOF 432# A comment 433 434############ 435The message. 436############ 437One line. 438 439 440# commented lines 441# commented lines 442 443Another line. 444# comments 445 446Last line. 447EOF 448get_tag_header comments-annotated-tag$commit commit $time>expect 449cat>>expect <<EOF 450The message. 451One line. 452 453Another line. 454 455Last line. 456EOF 457test_expect_success \ 458'creating a tag using a -F messagefile with #comments should succeed'' 459 git tag -F commentsfile comments-annotated-tag && 460 get_tag_msg comments-annotated-tag >actual && 461 test_cmp expect actual 462' 463 464get_tag_header comment-annotated-tag$commit commit $time>expect 465test_expect_success \ 466'creating a tag with a #comment in the -m message should succeed'' 467 git tag -m "#comment" comment-annotated-tag && 468 get_tag_msg comment-annotated-tag >actual && 469 test_cmp expect actual 470' 471 472echo'#comment'>commentfile 473echo''>>commentfile 474echo'####'>>commentfile 475get_tag_header commentfile-annotated-tag$commit commit $time>expect 476test_expect_success \ 477'creating a tag with #comments in the -F messagefile should succeed'' 478 git tag -F commentfile commentfile-annotated-tag && 479 get_tag_msg commentfile-annotated-tag >actual && 480 test_cmp expect actual 481' 482 483printf'#comment'>commentnonlfile 484get_tag_header commentnonlfile-annotated-tag$commit commit $time>expect 485test_expect_success \ 486'creating a tag with a file of #comment and no newline should succeed'' 487 git tag -F commentnonlfile commentnonlfile-annotated-tag && 488 get_tag_msg commentnonlfile-annotated-tag >actual && 489 test_cmp expect actual 490' 491 492# listing messages for annotated non-signed tags: 493 494test_expect_success \ 495'listing the one-line message of a non-signed tag should succeed'' 496 git tag -m "A msg" tag-one-line && 497 498 echo "tag-one-line" >expect && 499 git tag -l | grep "^tag-one-line" >actual && 500 test_cmp expect actual && 501 git tag -n0 -l | grep "^tag-one-line" >actual && 502 test_cmp expect actual && 503 git tag -n0 -l tag-one-line >actual && 504 test_cmp expect actual && 505 506 echo "tag-one-line A msg" >expect && 507 git tag -n1 -l | grep "^tag-one-line" >actual && 508 test_cmp expect actual && 509 git tag -n -l | grep "^tag-one-line" >actual && 510 test_cmp expect actual && 511 git tag -n1 -l tag-one-line >actual && 512 test_cmp expect actual && 513 git tag -n2 -l tag-one-line >actual && 514 test_cmp expect actual && 515 git tag -n999 -l tag-one-line >actual && 516 test_cmp expect actual 517' 518 519test_expect_success \ 520'listing the zero-lines message of a non-signed tag should succeed'' 521 git tag -m "" tag-zero-lines && 522 523 echo "tag-zero-lines" >expect && 524 git tag -l | grep "^tag-zero-lines" >actual && 525 test_cmp expect actual && 526 git tag -n0 -l | grep "^tag-zero-lines" >actual && 527 test_cmp expect actual && 528 git tag -n0 -l tag-zero-lines >actual && 529 test_cmp expect actual && 530 531 echo "tag-zero-lines " >expect && 532 git tag -n1 -l | grep "^tag-zero-lines" >actual && 533 test_cmp expect actual && 534 git tag -n -l | grep "^tag-zero-lines" >actual && 535 test_cmp expect actual && 536 git tag -n1 -l tag-zero-lines >actual && 537 test_cmp expect actual && 538 git tag -n2 -l tag-zero-lines >actual && 539 test_cmp expect actual && 540 git tag -n999 -l tag-zero-lines >actual && 541 test_cmp expect actual 542' 543 544echo'tag line one'>annotagmsg 545echo'tag line two'>>annotagmsg 546echo'tag line three'>>annotagmsg 547test_expect_success \ 548'listing many message lines of a non-signed tag should succeed'' 549 git tag -F annotagmsg tag-lines && 550 551 echo "tag-lines" >expect && 552 git tag -l | grep "^tag-lines" >actual && 553 test_cmp expect actual && 554 git tag -n0 -l | grep "^tag-lines" >actual && 555 test_cmp expect actual && 556 git tag -n0 -l tag-lines >actual && 557 test_cmp expect actual && 558 559 echo "tag-lines tag line one" >expect && 560 git tag -n1 -l | grep "^tag-lines" >actual && 561 test_cmp expect actual && 562 git tag -n -l | grep "^tag-lines" >actual && 563 test_cmp expect actual && 564 git tag -n1 -l tag-lines >actual && 565 test_cmp expect actual && 566 567 echo " tag line two" >>expect && 568 git tag -n2 -l | grep "^ *tag.line" >actual && 569 test_cmp expect actual && 570 git tag -n2 -l tag-lines >actual && 571 test_cmp expect actual && 572 573 echo " tag line three" >>expect && 574 git tag -n3 -l | grep "^ *tag.line" >actual && 575 test_cmp expect actual && 576 git tag -n3 -l tag-lines >actual && 577 test_cmp expect actual && 578 git tag -n4 -l | grep "^ *tag.line" >actual && 579 test_cmp expect actual && 580 git tag -n4 -l tag-lines >actual && 581 test_cmp expect actual && 582 git tag -n99 -l | grep "^ *tag.line" >actual && 583 test_cmp expect actual && 584 git tag -n99 -l tag-lines >actual && 585 test_cmp expect actual 586' 587 588# subsequent tests require gpg; check if it is available 589gpg --version>/dev/null 2>/dev/null 590if[ $? -eq127];then 591 say "# gpg not found - skipping tag signing and verification tests" 592else 593# As said here: http://www.gnupg.org/documentation/faqs.html#q6.19 594# the gpg version 1.0.6 didn't parse trust packets correctly, so for 595# that version, creation of signed tags using the generated key fails. 596case"$(gpg --version)"in 597'gpg (GnuPG) 1.0.6'*) 598 say "Skipping signed tag tests, because a bug in 1.0.6 version" 599;; 600*) 601 test_set_prereq GPG 602;; 603esac 604fi 605 606# trying to verify annotated non-signed tags: 607 608test_expect_success GPG \ 609'trying to verify an annotated non-signed tag should fail'' 610 tag_exists annotated-tag && 611 test_must_fail git tag -v annotated-tag 612' 613 614test_expect_success GPG \ 615'trying to verify a file-annotated non-signed tag should fail'' 616 tag_exists file-annotated-tag && 617 test_must_fail git tag -v file-annotated-tag 618' 619 620test_expect_success GPG \ 621'trying to verify two annotated non-signed tags should fail'' 622 tag_exists annotated-tag file-annotated-tag && 623 test_must_fail git tag -v annotated-tag file-annotated-tag 624' 625 626# creating and verifying signed tags: 627 628# key generation info: gpg --homedir t/t7004 --gen-key 629# Type DSA and Elgamal, size 2048 bits, no expiration date. 630# Name and email: C O Mitter <committer@example.com> 631# No password given, to enable non-interactive operation. 632 633cp-R"$TEST_DIRECTORY"/t7004 ./gpghome 634chmod0700 gpghome 635GNUPGHOME="$(pwd)/gpghome" 636export GNUPGHOME 637 638get_tag_header signed-tag$commit commit $time>expect 639echo'A signed tag message'>>expect 640echo'-----BEGIN PGP SIGNATURE-----'>>expect 641test_expect_success GPG 'creating a signed tag with -m message should succeed'' 642 git tag -s -m "A signed tag message" signed-tag && 643 get_tag_msg signed-tag >actual && 644 test_cmp expect actual 645' 646 647get_tag_header u-signed-tag$commit commit $time>expect 648echo'Another message'>>expect 649echo'-----BEGIN PGP SIGNATURE-----'>>expect 650test_expect_success GPG 'sign with a given key id'' 651 652 git tag -u committer@example.com -m "Another message" u-signed-tag && 653 get_tag_msg u-signed-tag >actual && 654 test_cmp expect actual 655 656' 657 658test_expect_success GPG 'sign with an unknown id (1)'' 659 660 test_must_fail git tag -u author@example.com \ 661 -m "Another message" o-signed-tag 662 663' 664 665test_expect_success GPG 'sign with an unknown id (2)'' 666 667 test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag 668 669' 670 671cat>fakeeditor <<'EOF' 672#!/bin/sh 673test -n "$1" && exec >"$1" 674echo A signed tag message 675echo from a fake editor. 676EOF 677chmod+x fakeeditor 678 679get_tag_header implied-sign$commit commit $time>expect 680./fakeeditor >>expect 681echo'-----BEGIN PGP SIGNATURE-----'>>expect 682test_expect_success GPG '-u implies signed tag'' 683 GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign && 684 get_tag_msg implied-sign >actual && 685 test_cmp expect actual 686' 687 688cat>sigmsgfile <<EOF 689Another signed tag 690message in a file. 691EOF 692get_tag_header file-signed-tag$commit commit $time>expect 693cat sigmsgfile >>expect 694echo'-----BEGIN PGP SIGNATURE-----'>>expect 695test_expect_success GPG \ 696'creating a signed tag with -F messagefile should succeed'' 697 git tag -s -F sigmsgfile file-signed-tag && 698 get_tag_msg file-signed-tag >actual && 699 test_cmp expect actual 700' 701 702cat>siginputmsg <<EOF 703A signed tag message from 704the standard input 705EOF 706get_tag_header stdin-signed-tag$commit commit $time>expect 707cat siginputmsg >>expect 708echo'-----BEGIN PGP SIGNATURE-----'>>expect 709test_expect_success GPG 'creating a signed tag with -F - should succeed'' 710 git tag -s -F - stdin-signed-tag <siginputmsg && 711 get_tag_msg stdin-signed-tag >actual && 712 test_cmp expect actual 713' 714 715get_tag_header implied-annotate$commit commit $time>expect 716./fakeeditor >>expect 717echo'-----BEGIN PGP SIGNATURE-----'>>expect 718test_expect_success GPG '-s implies annotated tag'' 719 GIT_EDITOR=./fakeeditor git tag -s implied-annotate && 720 get_tag_msg implied-annotate >actual && 721 test_cmp expect actual 722' 723 724test_expect_success GPG \ 725'trying to create a signed tag with non-existing -F file should fail'' 726 ! test -f nonexistingfile && 727 ! tag_exists nosigtag && 728 test_must_fail git tag -s -F nonexistingfile nosigtag && 729 ! tag_exists nosigtag 730' 731 732test_expect_success GPG 'verifying a signed tag should succeed' \ 733'git tag -v signed-tag' 734 735test_expect_success GPG 'verifying two signed tags in one command should succeed' \ 736'git tag -v signed-tag file-signed-tag' 737 738test_expect_success GPG \ 739'verifying many signed and non-signed tags should fail'' 740 test_must_fail git tag -v signed-tag annotated-tag && 741 test_must_fail git tag -v file-annotated-tag file-signed-tag && 742 test_must_fail git tag -v annotated-tag \ 743 file-signed-tag file-annotated-tag && 744 test_must_fail git tag -v signed-tag annotated-tag file-signed-tag 745' 746 747test_expect_success GPG 'verifying a forged tag should fail'' 748 forged=$(git cat-file tag signed-tag | 749 sed -e "s/signed-tag/forged-tag/" | 750 git mktag) && 751 git tag forged-tag$forged&& 752 test_must_fail git tag -v forged-tag 753' 754 755# blank and empty messages for signed tags: 756 757get_tag_header empty-signed-tag$commit commit $time>expect 758echo'-----BEGIN PGP SIGNATURE-----'>>expect 759test_expect_success GPG \ 760'creating a signed tag with an empty -m message should succeed'' 761 git tag -s -m "" empty-signed-tag && 762 get_tag_msg empty-signed-tag >actual && 763 test_cmp expect actual && 764 git tag -v empty-signed-tag 765' 766 767>sigemptyfile 768get_tag_header emptyfile-signed-tag$commit commit $time>expect 769echo'-----BEGIN PGP SIGNATURE-----'>>expect 770test_expect_success GPG \ 771'creating a signed tag with an empty -F messagefile should succeed'' 772 git tag -s -F sigemptyfile emptyfile-signed-tag && 773 get_tag_msg emptyfile-signed-tag >actual && 774 test_cmp expect actual && 775 git tag -v emptyfile-signed-tag 776' 777 778printf'\n\n \n\t\nLeading blank lines\n'> sigblanksfile 779printf'\n\t \t \nRepeated blank lines\n'>>sigblanksfile 780printf'\n\n\nTrailing spaces\t \n'>>sigblanksfile 781printf'\nTrailing blank lines\n\n\t \n\n'>>sigblanksfile 782get_tag_header blanks-signed-tag$commit commit $time>expect 783cat>>expect <<EOF 784Leading blank lines 785 786Repeated blank lines 787 788Trailing spaces 789 790Trailing blank lines 791EOF 792echo'-----BEGIN PGP SIGNATURE-----'>>expect 793test_expect_success GPG \ 794'extra blanks in the message for a signed tag should be removed'' 795 git tag -s -F sigblanksfile blanks-signed-tag && 796 get_tag_msg blanks-signed-tag >actual && 797 test_cmp expect actual && 798 git tag -v blanks-signed-tag 799' 800 801get_tag_header blank-signed-tag$commit commit $time>expect 802echo'-----BEGIN PGP SIGNATURE-----'>>expect 803test_expect_success GPG \ 804'creating a signed tag with a blank -m message should succeed'' 805 git tag -s -m " " blank-signed-tag && 806 get_tag_msg blank-signed-tag >actual && 807 test_cmp expect actual && 808 git tag -v blank-signed-tag 809' 810 811echo' '>sigblankfile 812echo''>>sigblankfile 813echo' '>>sigblankfile 814get_tag_header blankfile-signed-tag$commit commit $time>expect 815echo'-----BEGIN PGP SIGNATURE-----'>>expect 816test_expect_success GPG \ 817'creating a signed tag with blank -F file with spaces should succeed'' 818 git tag -s -F sigblankfile blankfile-signed-tag && 819 get_tag_msg blankfile-signed-tag >actual && 820 test_cmp expect actual && 821 git tag -v blankfile-signed-tag 822' 823 824printf' '>sigblanknonlfile 825get_tag_header blanknonlfile-signed-tag$commit commit $time>expect 826echo'-----BEGIN PGP SIGNATURE-----'>>expect 827test_expect_success GPG \ 828'creating a signed tag with spaces and no newline should succeed'' 829 git tag -s -F sigblanknonlfile blanknonlfile-signed-tag && 830 get_tag_msg blanknonlfile-signed-tag >actual && 831 test_cmp expect actual && 832 git tag -v signed-tag 833' 834 835# messages with commented lines for signed tags: 836 837cat>sigcommentsfile <<EOF 838# A comment 839 840############ 841The message. 842############ 843One line. 844 845 846# commented lines 847# commented lines 848 849Another line. 850# comments 851 852Last line. 853EOF 854get_tag_header comments-signed-tag$commit commit $time>expect 855cat>>expect <<EOF 856The message. 857One line. 858 859Another line. 860 861Last line. 862EOF 863echo'-----BEGIN PGP SIGNATURE-----'>>expect 864test_expect_success GPG \ 865'creating a signed tag with a -F file with #comments should succeed'' 866 git tag -s -F sigcommentsfile comments-signed-tag && 867 get_tag_msg comments-signed-tag >actual && 868 test_cmp expect actual && 869 git tag -v comments-signed-tag 870' 871 872get_tag_header comment-signed-tag$commit commit $time>expect 873echo'-----BEGIN PGP SIGNATURE-----'>>expect 874test_expect_success GPG \ 875'creating a signed tag with #commented -m message should succeed'' 876 git tag -s -m "#comment" comment-signed-tag && 877 get_tag_msg comment-signed-tag >actual && 878 test_cmp expect actual && 879 git tag -v comment-signed-tag 880' 881 882echo'#comment'>sigcommentfile 883echo''>>sigcommentfile 884echo'####'>>sigcommentfile 885get_tag_header commentfile-signed-tag$commit commit $time>expect 886echo'-----BEGIN PGP SIGNATURE-----'>>expect 887test_expect_success GPG \ 888'creating a signed tag with #commented -F messagefile should succeed'' 889 git tag -s -F sigcommentfile commentfile-signed-tag && 890 get_tag_msg commentfile-signed-tag >actual && 891 test_cmp expect actual && 892 git tag -v commentfile-signed-tag 893' 894 895printf'#comment'>sigcommentnonlfile 896get_tag_header commentnonlfile-signed-tag$commit commit $time>expect 897echo'-----BEGIN PGP SIGNATURE-----'>>expect 898test_expect_success GPG \ 899'creating a signed tag with a #comment and no newline should succeed'' 900 git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag && 901 get_tag_msg commentnonlfile-signed-tag >actual && 902 test_cmp expect actual && 903 git tag -v commentnonlfile-signed-tag 904' 905 906# listing messages for signed tags: 907 908test_expect_success GPG \ 909'listing the one-line message of a signed tag should succeed'' 910 git tag -s -m "A message line signed" stag-one-line && 911 912 echo "stag-one-line" >expect && 913 git tag -l | grep "^stag-one-line" >actual && 914 test_cmp expect actual && 915 git tag -n0 -l | grep "^stag-one-line" >actual && 916 test_cmp expect actual && 917 git tag -n0 -l stag-one-line >actual && 918 test_cmp expect actual && 919 920 echo "stag-one-line A message line signed" >expect && 921 git tag -n1 -l | grep "^stag-one-line" >actual && 922 test_cmp expect actual && 923 git tag -n -l | grep "^stag-one-line" >actual && 924 test_cmp expect actual && 925 git tag -n1 -l stag-one-line >actual && 926 test_cmp expect actual && 927 git tag -n2 -l stag-one-line >actual && 928 test_cmp expect actual && 929 git tag -n999 -l stag-one-line >actual && 930 test_cmp expect actual 931' 932 933test_expect_success GPG \ 934'listing the zero-lines message of a signed tag should succeed'' 935 git tag -s -m "" stag-zero-lines && 936 937 echo "stag-zero-lines" >expect && 938 git tag -l | grep "^stag-zero-lines" >actual && 939 test_cmp expect actual && 940 git tag -n0 -l | grep "^stag-zero-lines" >actual && 941 test_cmp expect actual && 942 git tag -n0 -l stag-zero-lines >actual && 943 test_cmp expect actual && 944 945 echo "stag-zero-lines " >expect && 946 git tag -n1 -l | grep "^stag-zero-lines" >actual && 947 test_cmp expect actual && 948 git tag -n -l | grep "^stag-zero-lines" >actual && 949 test_cmp expect actual && 950 git tag -n1 -l stag-zero-lines >actual && 951 test_cmp expect actual && 952 git tag -n2 -l stag-zero-lines >actual && 953 test_cmp expect actual && 954 git tag -n999 -l stag-zero-lines >actual && 955 test_cmp expect actual 956' 957 958echo'stag line one'>sigtagmsg 959echo'stag line two'>>sigtagmsg 960echo'stag line three'>>sigtagmsg 961test_expect_success GPG \ 962'listing many message lines of a signed tag should succeed'' 963 git tag -s -F sigtagmsg stag-lines && 964 965 echo "stag-lines" >expect && 966 git tag -l | grep "^stag-lines" >actual && 967 test_cmp expect actual && 968 git tag -n0 -l | grep "^stag-lines" >actual && 969 test_cmp expect actual && 970 git tag -n0 -l stag-lines >actual && 971 test_cmp expect actual && 972 973 echo "stag-lines stag line one" >expect && 974 git tag -n1 -l | grep "^stag-lines" >actual && 975 test_cmp expect actual && 976 git tag -n -l | grep "^stag-lines" >actual && 977 test_cmp expect actual && 978 git tag -n1 -l stag-lines >actual && 979 test_cmp expect actual && 980 981 echo " stag line two" >>expect && 982 git tag -n2 -l | grep "^ *stag.line" >actual && 983 test_cmp expect actual && 984 git tag -n2 -l stag-lines >actual && 985 test_cmp expect actual && 986 987 echo " stag line three" >>expect && 988 git tag -n3 -l | grep "^ *stag.line" >actual && 989 test_cmp expect actual && 990 git tag -n3 -l stag-lines >actual && 991 test_cmp expect actual && 992 git tag -n4 -l | grep "^ *stag.line" >actual && 993 test_cmp expect actual && 994 git tag -n4 -l stag-lines >actual && 995 test_cmp expect actual && 996 git tag -n99 -l | grep "^ *stag.line" >actual && 997 test_cmp expect actual && 998 git tag -n99 -l stag-lines >actual && 999 test_cmp expect actual1000'10011002# tags pointing to objects different from commits:10031004tree=$(git rev-parse HEAD^{tree})1005blob=$(git rev-parse HEAD:foo)1006tag=$(git rev-parse signed-tag 2>/dev/null)10071008get_tag_header tree-signed-tag$tree tree $time>expect1009echo"A message for a tree">>expect1010echo'-----BEGIN PGP SIGNATURE-----'>>expect1011test_expect_success GPG \1012'creating a signed tag pointing to a tree should succeed''1013 git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&1014 get_tag_msg tree-signed-tag >actual &&1015 test_cmp expect actual1016'10171018get_tag_header blob-signed-tag$blob blob $time>expect1019echo"A message for a blob">>expect1020echo'-----BEGIN PGP SIGNATURE-----'>>expect1021test_expect_success GPG \1022'creating a signed tag pointing to a blob should succeed''1023 git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&1024 get_tag_msg blob-signed-tag >actual &&1025 test_cmp expect actual1026'10271028get_tag_header tag-signed-tag$tag tag $time>expect1029echo"A message for another tag">>expect1030echo'-----BEGIN PGP SIGNATURE-----'>>expect1031test_expect_success GPG \1032'creating a signed tag pointing to another tag should succeed''1033 git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&1034 get_tag_msg tag-signed-tag >actual &&1035 test_cmp expect actual1036'10371038# usage with rfc1991 signatures1039echo"rfc1991"> gpghome/gpg.conf1040get_tag_header rfc1991-signed-tag$commit commit $time>expect1041echo"RFC1991 signed tag">>expect1042echo'-----BEGIN PGP MESSAGE-----'>>expect1043test_expect_success GPG \1044'creating a signed tag with rfc1991''1045 git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag$commit&&1046 get_tag_msg rfc1991-signed-tag >actual &&1047 test_cmp expect actual1048'10491050cat>fakeeditor <<'EOF'1051#!/bin/sh1052cp "$1" actual1053EOF1054chmod+x fakeeditor10551056test_expect_success GPG \1057'reediting a signed tag body omits signature''1058 echo "RFC1991 signed tag" >expect &&1059 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1060 test_cmp expect actual1061'10621063test_expect_success GPG \1064'verifying rfc1991 signature''1065 git tag -v rfc1991-signed-tag1066'10671068test_expect_success GPG \1069'list tag with rfc1991 signature''1070 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1071 git tag -l -n1 rfc1991-signed-tag >actual &&1072 test_cmp expect actual &&1073 git tag -l -n2 rfc1991-signed-tag >actual &&1074 test_cmp expect actual &&1075 git tag -l -n999 rfc1991-signed-tag >actual &&1076 test_cmp expect actual1077'10781079rm-f gpghome/gpg.conf10801081test_expect_success GPG \1082'verifying rfc1991 signature without --rfc1991''1083 git tag -v rfc1991-signed-tag1084'10851086test_expect_success GPG \1087'list tag with rfc1991 signature without --rfc1991''1088 echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&1089 git tag -l -n1 rfc1991-signed-tag >actual &&1090 test_cmp expect actual &&1091 git tag -l -n2 rfc1991-signed-tag >actual &&1092 test_cmp expect actual &&1093 git tag -l -n999 rfc1991-signed-tag >actual &&1094 test_cmp expect actual1095'10961097test_expect_success GPG \1098'reediting a signed tag body omits signature''1099 echo "RFC1991 signed tag" >expect &&1100 GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag$commit&&1101 test_cmp expect actual1102'11031104# try to sign with bad user.signingkey1105git config user.signingkey BobTheMouse1106test_expect_success GPG \1107'git tag -s fails if gpg is misconfigured' \1108'test_must_fail git tag -s -m tail tag-gpg-failure'1109git config --unset user.signingkey11101111# try to verify without gpg:11121113rm-rf gpghome1114test_expect_success GPG \1115'verify signed tag fails when public key is not present' \1116'test_must_fail git tag -v signed-tag'11171118test_expect_success \1119'git tag -a fails if tag annotation is empty''1120 ! (GIT_EDITOR=cat git tag -a initial-comment)1121'11221123test_expect_success \1124'message in editor has initial comment''1125 ! (GIT_EDITOR=cat git tag -a initial-comment > actual)1126'11271128test_expect_success 'message in editor has initial comment: first line''1129 # check the first line --- should be empty1130 echo >first.expect &&1131 sed -e 1q <actual >first.actual &&1132 test_i18ncmp first.expect first.actual1133'11341135test_expect_success \1136'message in editor has initial comment: remainder''1137 # remove commented lines from the remainder -- should be empty1138 >rest.expect1139 sed -e 1d -e '/^#/d' <actual >rest.actual &&1140 test_cmp rest.expect rest.actual1141'11421143get_tag_header reuse$commitcommit$time>expect1144echo "An annotation to be reused" >> expect1145test_expect_success \1146 'overwriting an annoted tag should use its previous body' '1147 git tag -a -m"An annotation to be reused" reuse &&1148 GIT_EDITOR=true git tag -f -a reuse &&1149 get_tag_msg reuse >actual &&1150 test_cmp expect actual1151'11521153test_expect_success 'filename for the message is relative to cwd' '1154mkdir subdir &&1155echo"Tag message in top directory">msgfile-5&&1156echo"Tag message in sub directory">subdir/msgfile-5&&1157(1158cd subdir &&1159 git tag -a -F msgfile-5 tag-from-subdir1160) &&1161 git cat-file tag tag-from-subdir|grep"in sub directory"1162'11631164test_expect_success 'filename for the message is relative to cwd' '1165echo"Tag message in sub directory">subdir/msgfile-6&&1166(1167cd subdir &&1168 git tag -a -F msgfile-6 tag-from-subdir-21169) &&1170 git cat-file tag tag-from-subdir-2|grep"in sub directory"1171'11721173# create a few more commits to test --contains11741175hash1=$(git rev-parse HEAD)11761177test_expect_success 'creating second commit and tag' '1178echo foo-2.0 >foo &&1179 git add foo &&1180 git commit -m second &&1181 git tag v2.01182'11831184hash2=$(git rev-parse HEAD)11851186test_expect_success 'creating third commit without tag' '1187echo foo-dev>foo &&1188 git add foo &&1189 git commit -m third1190'11911192hash3=$(git rev-parse HEAD)11931194# simple linear checks of --continue11951196cat > expected <<EOF1197v0.2.11198v1.01199v1.0.11200v1.1.31201v2.01202EOF12031204test_expect_success 'checking that first commit is in all tags (hash)' "1205 git tag -l --contains$hash1v* >actual &&1206 test_cmp expected actual1207"12081209# other ways of specifying the commit1210test_expect_success 'checking that first commit is in all tags (tag)' "1211 git tag -l --contains v1.0 v* >actual &&1212 test_cmp expected actual1213"12141215test_expect_success 'checking that first commit is in all tags (relative)' "1216 git tag -l --contains HEAD~2 v* >actual &&1217 test_cmp expected actual1218"12191220cat > expected <<EOF1221v2.01222EOF12231224test_expect_success 'checking that second commit only has one tag' "1225 git tag -l --contains$hash2v* >actual &&1226 test_cmp expected actual1227"122812291230cat > expected <<EOF1231EOF12321233test_expect_success 'checking that third commit has no tags' "1234 git tag -l --contains$hash3v* >actual &&1235 test_cmp expected actual1236"12371238# how about a simple merge?12391240test_expect_success 'creating simple branch' '1241 git branch stable v2.0 &&1242 git checkout stable &&1243echo foo-3.0 > foo &&1244 git commit foo -m fourth &&1245 git tag v3.01246'12471248hash4=$(git rev-parse HEAD)12491250cat > expected <<EOF1251v3.01252EOF12531254test_expect_success 'checking that branch head only has one tag' "1255 git tag -l --contains$hash4v* >actual &&1256 test_cmp expected actual1257"12581259test_expect_success 'merging original branch into this branch' '1260 git merge --strategy=ours master &&1261 git tag v4.01262'12631264cat > expected <<EOF1265v4.01266EOF12671268test_expect_success 'checking that original branch head has one tag now' "1269 git tag -l --contains$hash3v* >actual &&1270 test_cmp expected actual1271"12721273cat > expected <<EOF1274v0.2.11275v1.01276v1.0.11277v1.1.31278v2.01279v3.01280v4.01281EOF12821283test_expect_success 'checking that initial commit is in all tags' "1284 git tag -l --contains$hash1v* >actual &&1285 test_cmp expected actual1286"12871288# mixing modes and options:12891290test_expect_success 'mixing incompatibles modes and options is forbidden' '1291 test_must_fail git tag -a&&1292 test_must_fail git tag -l -v&&1293 test_must_fail git tag -n100&&1294 test_must_fail git tag -l -m msg &&1295 test_must_fail git tag -l -F some file&&1296 test_must_fail git tag -v -s1297'12981299test_done