#!/bin/sh # # test_description='git mktag: tag object verify test' . ./test-lib.sh ########################################################### # check the tag.sig file, expecting verify_tag() to fail, # and checking that the error message matches the pattern # given in the expect.pat file. check_verify_failure () { subject=$1 && message=$2 && shift 2 && no_strict= && fsck_obj_ok= && no_strict= && while test $# != 0 do case "$1" in --no-strict) no_strict=yes ;; --fsck-obj-ok) fsck_obj_ok=yes ;; esac && shift done && test_expect_success "fail with [--[no-]strict]: $subject" ' test_must_fail git mktag <tag.sig 2>err && if test -z "$no_strict" then test_must_fail git mktag <tag.sig 2>err2 && test_cmp err err2 else git mktag --no-strict <tag.sig fi ' test_expect_success "setup: $subject" ' tag_ref=refs/tags/bad_tag && # Reset any leftover state from the last $subject rm -rf bad-tag && git init --bare bad-tag && bad_tag=$(git -C bad-tag hash-object -t tag -w --stdin --literally <tag.sig) ' test_expect_success "hash-object & fsck unreachable: $subject" ' if test -n "$fsck_obj_ok" then git -C bad-tag fsck else test_must_fail git -C bad-tag fsck fi ' test_expect_success "update-ref & fsck reachable: $subject" ' # Make sure the earlier test created it for us git rev-parse "$bad_tag" && # The update-ref of the bad content will fail, do it # anyway to see if it segfaults test_might_fail git -C bad-tag update-ref "$tag_ref" "$bad_tag" && # Manually create the broken, we cannot do it with # update-ref test-tool -C bad-tag ref-store main delete-refs 0 msg "$tag_ref" && test-tool -C bad-tag ref-store main update-ref msg "$tag_ref" $bad_tag $ZERO_OID REF_SKIP_OID_VERIFICATION && # Unlike fsck-ing unreachable content above, this # will always fail. test_must_fail git -C bad-tag fsck ' test_expect_success "for-each-ref: $subject" ' # Make sure the earlier test created it for us git rev-parse "$bad_tag" && test-tool -C bad-tag ref-store main delete-refs 0 msg "$tag_ref" && test-tool -C bad-tag ref-store main update-ref msg "$tag_ref" $bad_tag $ZERO_OID REF_SKIP_OID_VERIFICATION && printf "%s tag\t%s\n" "$bad_tag" "$tag_ref" >expected && git -C bad-tag for-each-ref "$tag_ref" >actual && test_cmp expected actual && test_must_fail git -C bad-tag for-each-ref --format="%(*objectname)" ' test_expect_success "fast-export & fast-import: $subject" ' # Make sure the earlier test created it for us git rev-parse "$bad_tag" && test_must_fail git -C bad-tag fast-export --all && test_must_fail git -C bad-tag fast-export "$bad_tag" ' } test_expect_mktag_success() { test_expect_success "$1" ' git hash-object -t tag -w --stdin <tag.sig >expected && git fsck --strict && git mktag <tag.sig >hash && test_cmp expected hash && test_when_finished "git update-ref -d refs/tags/mytag $(cat hash)" && git update-ref refs/tags/mytag $(cat hash) $(test_oid zero) && git fsck --strict ' } ########################################################### # first create a commit, so we have a valid object/type # for the tag. test_expect_success 'setup' ' test_commit A && test_commit B && head=$(git rev-parse --verify HEAD) && head_parent=$(git rev-parse --verify HEAD~) && tree=$(git rev-parse HEAD^{tree}) && blob=$(git rev-parse --verify HEAD:B.t) ' test_expect_success 'basic usage' ' cat >tag.sig <<-EOF && object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 EOF git mktag <tag.sig && git mktag --end-of-options <tag.sig && test_expect_code 129 git mktag --unknown-option ' ############################################################ # 1. length check cat >tag.sig <<EOF too short for a tag EOF check_verify_failure 'Tag object length check' \ '^error:.* missingObject:' 'strict' ############################################################ # 2. object line label check cat >tag.sig <<EOF xxxxxx $head type tag tag mytag tagger . <> 0 +0000 EOF check_verify_failure '"object" line label check' '^error:.* missingObject:' ############################################################ # 3. object line hash check cat >tag.sig <<EOF object $(echo $head | tr 0-9a-f z) type tag tag mytag tagger . <> 0 +0000 EOF check_verify_failure '"object" line check' '^error:.* badObjectSha1:' ############################################################ # 4. type line label check cat >tag.sig <<EOF object $head xxxx tag tag mytag tagger . <> 0 +0000 EOF check_verify_failure '"type" line label check' '^error:.* missingTypeEntry:' ############################################################ # 5. type line eol check echo "object $head" >tag.sig printf "type tagsssssssssssssssssssssssssssssss" >>tag.sig check_verify_failure '"type" line eol check' '^error:.* unterminatedHeader:' ############################################################ # 6. tag line label check #1 cat >tag.sig <<EOF object $head type tag xxx mytag tagger . <> 0 +0000 EOF check_verify_failure '"tag" line label check #1' \ '^error:.* missingTagEntry:' ############################################################ # 7. tag line label check #2 cat >tag.sig <<EOF object $head type taggggggggggggggggggggggggggggggg tag EOF check_verify_failure '"tag" line label check #2' \ '^error:.* badType:' ############################################################ # 8. type line type-name length check cat >tag.sig <<EOF object $head type taggggggggggggggggggggggggggggggg tag mytag EOF check_verify_failure '"type" line type-name length check' \ '^error:.* badType:' ############################################################ # 9. verify object (hash/type) check cat >tag.sig <<EOF object $(test_oid deadbeef) type tag tag mytag tagger . <> 0 +0000 EOF check_verify_failure 'verify object (hash/type) check -- correct type, nonexisting object' \ '^fatal: could not read tagged object' \ --fsck-obj-ok cat >tag.sig <<EOF object $head type tagggg tag mytag tagger . <> 0 +0000 EOF check_verify_failure 'verify object (hash/type) check -- made-up type, valid object' \ '^error:.* badType:' cat >tag.sig <<EOF object $(test_oid deadbeef) type tagggg tag mytag tagger . <> 0 +0000 EOF check_verify_failure 'verify object (hash/type) check -- made-up type, nonexisting object' \ '^error:.* badType:' cat >tag.sig <<EOF object $head type tree tag mytag tagger . <> 0 +0000 EOF check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \ '^fatal: object.*tagged as.*tree.*but is.*commit' \ --fsck-obj-ok ############################################################ # 9.5. verify object (hash/type) check -- replacement test_expect_success 'setup replacement of commit -> commit and tree -> blob' ' git replace $head_parent $head && git replace -f $tree $blob ' cat >tag.sig <<EOF object $head_parent type commit tag mytag tagger . <> 0 +0000 EOF test_expect_mktag_success 'tag to a commit replaced by another commit' cat >tag.sig <<EOF object $tree type tree tag mytag tagger . <> 0 +0000 EOF check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \ '^fatal: object.*tagged as.*tree.*but is.*blob' \ --fsck-obj-ok ############################################################ # 10. verify tag-name check cat >tag.sig <<EOF object $head type commit tag my tag tagger . <> 0 +0000 EOF check_verify_failure 'verify tag-name check' \ '^error:.* badTagName:' \ --no-strict \ --fsck-obj-ok ############################################################ # 11. tagger line label check #1 cat >tag.sig <<EOF object $head type commit tag mytag This is filler EOF check_verify_failure '"tagger" line label check #1' \ '^error:.* missingTaggerEntry:' \ --no-strict \ --fsck-obj-ok ############################################################ # 12. tagger line label check #2 cat >tag.sig <<EOF object $head type commit tag mytag tagger This is filler EOF check_verify_failure '"tagger" line label check #2' \ '^error:.* missingTaggerEntry:' \ --no-strict \ --fsck-obj-ok ############################################################ # 13. allow missing tag author name like fsck cat >tag.sig <<EOF object $head type commit tag mytag tagger <> 0 +0000 This is filler EOF test_expect_mktag_success 'allow missing tag author name' ############################################################ # 14. disallow missing tag author name cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger < > 0 +0000 EOF check_verify_failure 'disallow malformed tagger' \ '^error:.* badEmail:' \ --no-strict \ --fsck-obj-ok ############################################################ # 15. allow empty tag email cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <> 0 +0000 EOF test_expect_mktag_success 'allow empty tag email' ############################################################ # 16. allow spaces in tag email like fsck cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tag ger@example.com> 0 +0000 EOF test_expect_mktag_success 'allow spaces in tag email like fsck' ############################################################ # 17. disallow missing tag timestamp tr '_' ' ' >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com>__ EOF check_verify_failure 'disallow missing tag timestamp' \ '^error:.* badDate:' ############################################################ # 18. detect invalid tag timestamp1 cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> Tue Mar 25 15:47:44 2008 EOF check_verify_failure 'detect invalid tag timestamp1' \ '^error:.* badDate:' ############################################################ # 19. detect invalid tag timestamp2 cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 2008-03-31T12:20:15-0500 EOF check_verify_failure 'detect invalid tag timestamp2' \ '^error:.* badDate:' ############################################################ # 20. detect invalid tag timezone1 cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 GMT EOF check_verify_failure 'detect invalid tag timezone1' \ '^error:.* badTimezone:' ############################################################ # 21. detect invalid tag timezone2 cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 + 30 EOF check_verify_failure 'detect invalid tag timezone2' \ '^error:.* badTimezone:' ############################################################ # 22. allow invalid tag timezone3 (the maximum is -1200/+1400) cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -1430 EOF test_expect_mktag_success 'allow invalid tag timezone' ############################################################ # 23. detect invalid header entry cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 this line should not be here EOF check_verify_failure 'detect invalid header entry' \ '^error:.* extraHeaderEntry:' \ --no-strict \ --fsck-obj-ok test_expect_success 'invalid header entry config & fsck' ' test_must_fail git mktag <tag.sig && git mktag --no-strict <tag.sig && test_must_fail git -c fsck.extraHeaderEntry=error mktag <tag.sig && test_must_fail git -c fsck.extraHeaderEntry=error mktag --no-strict <tag.sig && test_must_fail git -c fsck.extraHeaderEntry=warn mktag <tag.sig && git -c fsck.extraHeaderEntry=warn mktag --no-strict <tag.sig && git -c fsck.extraHeaderEntry=ignore mktag <tag.sig && git -c fsck.extraHeaderEntry=ignore mktag --no-strict <tag.sig && git fsck && git -c fsck.extraHeaderEntry=warn fsck 2>err && grep "warning .*extraHeaderEntry:" err && test_must_fail git -c fsck.extraHeaderEntry=error 2>err fsck && grep "error .* extraHeaderEntry:" err ' cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 this line comes after an extra newline EOF test_expect_mktag_success 'allow extra newlines at start of body' cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 EOF test_expect_mktag_success 'allow a blank line before an empty body (1)' cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 EOF test_expect_mktag_success 'allow no blank line before an empty body (2)' ############################################################ # 24. create valid tag cat >tag.sig <<EOF object $head type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 EOF test_expect_mktag_success 'create valid tag object' test_done