Skip to content

Commit

Permalink
New tests and en-passant modifications to mktag.
Browse files Browse the repository at this point in the history
These changes were originally part of the next patch, but have been
split out since they were peripheral to the main purpose of that patch.

  - update comment describing the signature format to reflect
    the current code.
  - remove trailing \n in calls to error(), since a \n is already
    provided by error().
  - remove redundant call to get_sha1_hex().
  - call sha1_to_hex(sha1) to convert to ascii, rather than attempting
    to print the raw sha1.

The new tests provide a regression suite to support the modifications
to git-mktag in this and the next patch.

Signed-off-by: Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Ramsay Allan Jones authored and Junio C Hamano committed Aug 2, 2006
1 parent 7ffe709 commit 446c6fa
Show file tree
Hide file tree
Showing 2 changed files with 245 additions and 17 deletions.
35 changes: 18 additions & 17 deletions mktag.c
Expand Up @@ -2,10 +2,11 @@
#include "tag.h"

/*
* A signature file has a very simple fixed format: three lines
* of "object <sha1>" + "type <typename>" + "tag <tagname>",
* followed by some free-form signature that git itself doesn't
* care about, but that can be verified with gpg or similar.
* A signature file has a very simple fixed format: four lines
* of "object <sha1>" + "type <typename>" + "tag <tagname>" +
* "tagger <committer>", followed by a blank line, a free-form tag
* message and a signature block that git itself doesn't care about,
* but that can be verified with gpg or similar.
*
* The first three lines are guaranteed to be at least 63 bytes:
* "object <sha1>\n" is 48 bytes, "type tag\n" at 9 bytes is the
Expand Down Expand Up @@ -46,45 +47,42 @@ static int verify_tag(char *buffer, unsigned long size)
const char *object, *type_line, *tag_line, *tagger_line;

if (size < 64)
return error("wanna fool me ? you obviously got the size wrong !\n");
return error("wanna fool me ? you obviously got the size wrong !");

buffer[size] = 0;

/* Verify object line */
object = buffer;
if (memcmp(object, "object ", 7))
return error("char%d: does not start with \"object \"\n", 0);
return error("char%d: does not start with \"object \"", 0);

if (get_sha1_hex(object + 7, sha1))
return error("char%d: could not get SHA1 hash\n", 7);
return error("char%d: could not get SHA1 hash", 7);

/* Verify type line */
type_line = object + 48;
if (memcmp(type_line - 1, "\ntype ", 6))
return error("char%d: could not find \"\\ntype \"\n", 47);
return error("char%d: could not find \"\\ntype \"", 47);

/* Verify tag-line */
tag_line = strchr(type_line, '\n');
if (!tag_line)
return error("char%td: could not find next \"\\n\"\n", type_line - buffer);
return error("char%td: could not find next \"\\n\"", type_line - buffer);
tag_line++;
if (memcmp(tag_line, "tag ", 4) || tag_line[4] == '\n')
return error("char%td: no \"tag \" found\n", tag_line - buffer);
return error("char%td: no \"tag \" found", tag_line - buffer);

/* Get the actual type */
typelen = tag_line - type_line - strlen("type \n");
if (typelen >= sizeof(type))
return error("char%td: type too long\n", type_line+5 - buffer);
return error("char%td: type too long", type_line+5 - buffer);

memcpy(type, type_line+5, typelen);
type[typelen] = 0;

/* Verify that the object matches */
if (get_sha1_hex(object + 7, sha1))
return error("char%d: could not get SHA1 hash but this is really odd since i got it before !\n", 7);

if (verify_object(sha1, type))
return error("char%d: could not verify object %s\n", 7, sha1);
return error("char%d: could not verify object %s", 7, sha1_to_hex(sha1));

/* Verify the tag-name: we don't allow control characters or spaces in it */
tag_line += 4;
Expand All @@ -94,14 +92,17 @@ static int verify_tag(char *buffer, unsigned long size)
break;
if (c > ' ')
continue;
return error("char%td: could not verify tag name\n", tag_line - buffer);
return error("char%td: could not verify tag name", tag_line - buffer);
}

/* Verify the tagger line */
tagger_line = tag_line;

if (memcmp(tagger_line, "tagger", 6) || (tagger_line[6] == '\n'))
return error("char%td: could not find \"tagger\"\n", tagger_line - buffer);
return error("char%td: could not find \"tagger\"", tagger_line - buffer);

/* TODO: check for committer info + blank line? */
/* Also, the minimum length is probably + "tagger .", or 63+8=71 */

/* The actual stuff afterwards we don't care about.. */
return 0;
Expand Down
227 changes: 227 additions & 0 deletions t/t3800-mktag.sh
@@ -0,0 +1,227 @@
#!/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 () {
test_expect_success \
"$1" \
'git-mktag <tag.sig 2>message ||
egrep -q -f expect.pat message'
}

###########################################################
# first create a commit, so we have a valid object/type
# for the tag.
echo Hello >A
git-update-index --add A
git-commit -m "Initial commit"
head=$(git-rev-parse --verify HEAD)

############################################################
# 1. length check

cat >tag.sig <<EOF
too short for a tag
EOF

cat >expect.pat <<EOF
^error: .*size wrong.*$
EOF

check_verify_failure 'Tag object length check'

############################################################
# 2. object line label check

cat >tag.sig <<EOF
xxxxxx 139e9b33986b1c2670fff52c5067603117b3e895
type tag
tag mytag
EOF

cat >expect.pat <<EOF
^error: char0: .*"object "$
EOF

check_verify_failure '"object" line label check'

############################################################
# 3. object line SHA1 check

cat >tag.sig <<EOF
object zz9e9b33986b1c2670fff52c5067603117b3e895
type tag
tag mytag
EOF

cat >expect.pat <<EOF
^error: char7: .*SHA1 hash$
EOF

check_verify_failure '"object" line SHA1 check'

############################################################
# 4. type line label check

cat >tag.sig <<EOF
object 779e9b33986b1c2670fff52c5067603117b3e895
xxxx tag
tag mytag
EOF

cat >expect.pat <<EOF
^error: char47: .*"[\]ntype "$
EOF

check_verify_failure '"type" line label check'

############################################################
# 5. type line eol check

echo "object 779e9b33986b1c2670fff52c5067603117b3e895" >tag.sig
echo -n "type tagsssssssssssssssssssssssssssssss" >>tag.sig

cat >expect.pat <<EOF
^error: char48: .*"[\]n"$
EOF

check_verify_failure '"type" line eol check'

############################################################
# 6. tag line label check #1

cat >tag.sig <<EOF
object 779e9b33986b1c2670fff52c5067603117b3e895
type tag
xxx mytag
EOF

cat >expect.pat <<EOF
^error: char57: no "tag " found$
EOF

check_verify_failure '"tag" line label check #1'

############################################################
# 7. tag line label check #2

cat >tag.sig <<EOF
object 779e9b33986b1c2670fff52c5067603117b3e895
type taggggggggggggggggggggggggggggggg
tag
EOF

cat >expect.pat <<EOF
^error: char87: no "tag " found$
EOF

check_verify_failure '"tag" line label check #2'

############################################################
# 8. type line type-name length check

cat >tag.sig <<EOF
object 779e9b33986b1c2670fff52c5067603117b3e895
type taggggggggggggggggggggggggggggggg
tag mytag
EOF

cat >expect.pat <<EOF
^error: char53: type too long$
EOF

check_verify_failure '"type" line type-name length check'

############################################################
# 9. verify object (SHA1/type) check

cat >tag.sig <<EOF
object 779e9b33986b1c2670fff52c5067603117b3e895
type tagggg
tag mytag
EOF

cat >expect.pat <<EOF
^error: char7: could not verify object.*$
EOF

check_verify_failure 'verify object (SHA1/type) check'

############################################################
# 10. verify tag-name check

cat >tag.sig <<EOF
object $head
type commit
tag my tag
EOF

cat >expect.pat <<EOF
^error: char67: could not verify tag name$
EOF

check_verify_failure 'verify tag-name check'

############################################################
# 11. tagger line lable check #1

cat >tag.sig <<EOF
object $head
type commit
tag mytag
EOF

cat >expect.pat <<EOF
^error: char70: could not find "tagger"$
EOF

check_verify_failure '"tagger" line label check #1'

############################################################
# 12. tagger line lable check #2

cat >tag.sig <<EOF
object $head
type commit
tag mytag
tagger
EOF

cat >expect.pat <<EOF
^error: char70: could not find "tagger"$
EOF

check_verify_failure '"tagger" line label check #2'

############################################################
# 13. create valid tag

cat >tag.sig <<EOF
object $head
type commit
tag mytag
tagger another@example.com
EOF

test_expect_success \
'create valid tag' \
'git-mktag <tag.sig >.git/refs/tags/mytag 2>message'

############################################################
# 14. check mytag

test_expect_success \
'check mytag' \
'git-tag -l | grep mytag'


test_done

0 comments on commit 446c6fa

Please sign in to comment.