{"thread":{"id":"5080","subject":"[PATCH 4/10] New tests and en-passant modifications to mktag.","startedAt":"2006-08-02T01:03:22Z","lastAt":"2006-08-02T01:03:22Z","messageCount":1,"participants":["Ramsay Jones"],"isPatch":true,"patchVersion":1,"patchTotal":10},"messages":[{"id":"24537","messageId":"00ae01c6b5cf$737a7220$c47eedc1@ramsay1.demon.co.uk","threadId":"5080","inReplyTo":null,"subject":"[PATCH 4/10] New tests and en-passant modifications to mktag.","fromName":"Ramsay Jones","fromEmail":"ramsay@ramsay1.demon.co.uk","sentAt":"2006-08-02T01:03:22Z","receivedAt":"2006-08-02T01:03:22Z","isPatch":true,"sender":{"key":"ramsay@ramsayjones.plus.com","avatar":"https://avatars.githubusercontent.com/u/33702710?v=4"},"body":"These changes were originally part of the next patch, but have been\nsplit out since they were peripheral to the main purpose of that patch.\n\n  - update comment describing the signature format to reflect\n    the current code.\n  - remove trailing \\n in calls to error(), since a \\n is already\n    provided by error().\n  - remove redundant call to get_sha1_hex().\n  - call sha1_to_hex(sha1) to convert to ascii, rather than attempting\n    to print the raw sha1.\n\nThe new tests provide a regression suite to support the modifications\nto git-mktag in this and the next patch.\n\nSigned-off-by: Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk>\n---\n mktag.c          |   35 ++++----\n t/t3800-mktag.sh |  227\n++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 245 insertions(+), 17 deletions(-)\n\ndiff --git a/mktag.c b/mktag.c\nindex f0fe528..9bae223 100644\n--- a/mktag.c\n+++ b/mktag.c\n@@ -2,10 +2,11 @@ #include \"cache.h\"\n #include \"tag.h\"\n\n /*\n- * A signature file has a very simple fixed format: three lines\n- * of \"object <sha1>\" + \"type <typename>\" + \"tag <tagname>\",\n- * followed by some free-form signature that git itself doesn't\n- * care about, but that can be verified with gpg or similar.\n+ * A signature file has a very simple fixed format: four lines\n+ * of \"object <sha1>\" + \"type <typename>\" + \"tag <tagname>\" +\n+ * \"tagger <committer>\", followed by a blank line, a free-form tag\n+ * message and a signature block that git itself doesn't care about,\n+ * but that can be verified with gpg or similar.\n  *\n  * The first three lines are guaranteed to be at least 63 bytes:\n  * \"object <sha1>\\n\" is 48 bytes, \"type tag\\n\" at 9 bytes is the\n@@ -46,45 +47,42 @@ static int verify_tag(char *buffer, unsi\n \tconst char *object, *type_line, *tag_line, *tagger_line;\n\n \tif (size < 64)\n-\t\treturn error(\"wanna fool me ? you obviously got the size wrong !\\n\");\n+\t\treturn error(\"wanna fool me ? you obviously got the size wrong !\");\n\n \tbuffer[size] = 0;\n\n \t/* Verify object line */\n \tobject = buffer;\n \tif (memcmp(object, \"object \", 7))\n-\t\treturn error(\"char%d: does not start with \\\"object \\\"\\n\", 0);\n+\t\treturn error(\"char%d: does not start with \\\"object \\\"\", 0);\n\n \tif (get_sha1_hex(object + 7, sha1))\n-\t\treturn error(\"char%d: could not get SHA1 hash\\n\", 7);\n+\t\treturn error(\"char%d: could not get SHA1 hash\", 7);\n\n \t/* Verify type line */\n \ttype_line = object + 48;\n \tif (memcmp(type_line - 1, \"\\ntype \", 6))\n-\t\treturn error(\"char%d: could not find \\\"\\\\ntype \\\"\\n\", 47);\n+\t\treturn error(\"char%d: could not find \\\"\\\\ntype \\\"\", 47);\n\n \t/* Verify tag-line */\n \ttag_line = strchr(type_line, '\\n');\n \tif (!tag_line)\n-\t\treturn error(\"char%td: could not find next \\\"\\\\n\\\"\\n\", type_line -\nbuffer);\n+\t\treturn error(\"char%td: could not find next \\\"\\\\n\\\"\", type_line - buffer);\n \ttag_line++;\n \tif (memcmp(tag_line, \"tag \", 4) || tag_line[4] == '\\n')\n-\t\treturn error(\"char%td: no \\\"tag \\\" found\\n\", tag_line - buffer);\n+\t\treturn error(\"char%td: no \\\"tag \\\" found\", tag_line - buffer);\n\n \t/* Get the actual type */\n \ttypelen = tag_line - type_line - strlen(\"type \\n\");\n \tif (typelen >= sizeof(type))\n-\t\treturn error(\"char%td: type too long\\n\", type_line+5 - buffer);\n+\t\treturn error(\"char%td: type too long\", type_line+5 - buffer);\n\n \tmemcpy(type, type_line+5, typelen);\n \ttype[typelen] = 0;\n\n \t/* Verify that the object matches */\n-\tif (get_sha1_hex(object + 7, sha1))\n-\t\treturn error(\"char%d: could not get SHA1 hash but this is really odd\nsince i got it before !\\n\", 7);\n-\n \tif (verify_object(sha1, type))\n-\t\treturn error(\"char%d: could not verify object %s\\n\", 7, sha1);\n+\t\treturn error(\"char%d: could not verify object %s\", 7, sha1_to_hex(sha1));\n\n \t/* Verify the tag-name: we don't allow control characters or spaces in it\n*/\n \ttag_line += 4;\n@@ -94,14 +92,17 @@ static int verify_tag(char *buffer, unsi\n \t\t\tbreak;\n \t\tif (c > ' ')\n \t\t\tcontinue;\n-\t\treturn error(\"char%td: could not verify tag name\\n\", tag_line - buffer);\n+\t\treturn error(\"char%td: could not verify tag name\", tag_line - buffer);\n \t}\n\n \t/* Verify the tagger line */\n \ttagger_line = tag_line;\n\n \tif (memcmp(tagger_line, \"tagger\", 6) || (tagger_line[6] == '\\n'))\n-\t\treturn error(\"char%td: could not find \\\"tagger\\\"\\n\", tagger_line -\nbuffer);\n+\t\treturn error(\"char%td: could not find \\\"tagger\\\"\", tagger_line - buffer);\n+\n+\t/* TODO: check for committer info + blank line? */\n+\t/* Also, the minimum length is probably + \"tagger .\", or 63+8=71 */\n\n \t/* The actual stuff afterwards we don't care about.. */\n \treturn 0;\ndiff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh\nnew file mode 100755\nindex 0000000..b833e19\n--- /dev/null\n+++ b/t/t3800-mktag.sh\n@@ -0,0 +1,227 @@\n+#!/bin/sh\n+#\n+#\n+\n+test_description='git-mktag: tag object verify test'\n+\n+. ./test-lib.sh\n+\n+###########################################################\n+# check the tag.sig file, expecting verify_tag() to fail,\n+# and checking that the error message matches the pattern\n+# given in the expect.pat file.\n+\n+check_verify_failure () {\n+    test_expect_success \\\n+        \"$1\" \\\n+        'git-mktag <tag.sig 2>message ||\n+         egrep -q -f expect.pat message'\n+}\n+\n+###########################################################\n+# first create a commit, so we have a valid object/type\n+# for the tag.\n+echo Hello >A\n+git-update-index --add A\n+git-commit -m \"Initial commit\"\n+head=$(git-rev-parse --verify HEAD)\n+\n+############################################################\n+#  1. length check\n+\n+cat >tag.sig <<EOF\n+too short for a tag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: .*size wrong.*$\n+EOF\n+\n+check_verify_failure 'Tag object length check'\n+\n+############################################################\n+#  2. object line label check\n+\n+cat >tag.sig <<EOF\n+xxxxxx 139e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char0: .*\"object \"$\n+EOF\n+\n+check_verify_failure '\"object\" line label check'\n+\n+############################################################\n+#  3. object line SHA1 check\n+\n+cat >tag.sig <<EOF\n+object zz9e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char7: .*SHA1 hash$\n+EOF\n+\n+check_verify_failure '\"object\" line SHA1 check'\n+\n+############################################################\n+#  4. type line label check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+xxxx tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char47: .*\"[\\]ntype \"$\n+EOF\n+\n+check_verify_failure '\"type\" line label check'\n+\n+############################################################\n+#  5. type line eol check\n+\n+echo \"object 779e9b33986b1c2670fff52c5067603117b3e895\" >tag.sig\n+echo -n \"type tagsssssssssssssssssssssssssssssss\" >>tag.sig\n+\n+cat >expect.pat <<EOF\n+^error: char48: .*\"[\\]n\"$\n+EOF\n+\n+check_verify_failure '\"type\" line eol check'\n+\n+############################################################\n+#  6. tag line label check #1\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+xxx mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char57: no \"tag \" found$\n+EOF\n+\n+check_verify_failure '\"tag\" line label check #1'\n+\n+############################################################\n+#  7. tag line label check #2\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type taggggggggggggggggggggggggggggggg\n+tag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char87: no \"tag \" found$\n+EOF\n+\n+check_verify_failure '\"tag\" line label check #2'\n+\n+############################################################\n+#  8. type line type-name length check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type taggggggggggggggggggggggggggggggg\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char53: type too long$\n+EOF\n+\n+check_verify_failure '\"type\" line type-name length check'\n+\n+############################################################\n+#  9. verify object (SHA1/type) check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type tagggg\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char7: could not verify object.*$\n+EOF\n+\n+check_verify_failure 'verify object (SHA1/type) check'\n+\n+############################################################\n+# 10. verify tag-name check\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag my\ttag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char67: could not verify tag name$\n+EOF\n+\n+check_verify_failure 'verify tag-name check'\n+\n+############################################################\n+# 11. tagger line lable check #1\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char70: could not find \"tagger\"$\n+EOF\n+\n+check_verify_failure '\"tagger\" line label check #1'\n+\n+############################################################\n+# 12. tagger line lable check #2\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+tagger\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char70: could not find \"tagger\"$\n+EOF\n+\n+check_verify_failure '\"tagger\" line label check #2'\n+\n+############################################################\n+# 13. create valid tag\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+tagger another@example.com\n+EOF\n+\n+test_expect_success \\\n+    'create valid tag' \\\n+    'git-mktag <tag.sig >.git/refs/tags/mytag 2>message'\n+\n+############################################################\n+# 14. check mytag\n+\n+test_expect_success \\\n+    'check mytag' \\\n+    'git-tag -l | grep mytag'\n+\n+\n+test_done\n--\n1.4.1\n\n\nFrom 3916b937e735e71b6bc2f22038cc21cbd4a15eb1 Mon Sep 17 00:00:00 2001\nFrom: Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk>\nDate: Sat, 29 Jul 2006 18:15:47 +0100\nSubject: [PATCH 4/10] New tests and en-passant modifications to mktag.\n\nThese changes were originally part of the next patch, but have been\nsplit out since they were peripheral to the main purpose of that patch.\n\n  - update comment describing the signature format to reflect\n    the current code.\n  - remove trailing \\n in calls to error(), since a \\n is already\n    provided by error().\n  - remove redundant call to get_sha1_hex().\n  - call sha1_to_hex(sha1) to convert to ascii, rather than attempting\n    to print the raw sha1.\n\nThe new tests provide a regression suite to support the modifications\nto git-mktag in this and the next patch.\n\nSigned-off-by: Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk>\n---\n mktag.c          |   35 ++++----\n t/t3800-mktag.sh |  227 ++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 245 insertions(+), 17 deletions(-)\n\ndiff --git a/mktag.c b/mktag.c\nindex f0fe528..9bae223 100644\n--- a/mktag.c\n+++ b/mktag.c\n@@ -2,10 +2,11 @@ #include \"cache.h\"\n #include \"tag.h\"\n \n /*\n- * A signature file has a very simple fixed format: three lines\n- * of \"object <sha1>\" + \"type <typename>\" + \"tag <tagname>\",\n- * followed by some free-form signature that git itself doesn't\n- * care about, but that can be verified with gpg or similar.\n+ * A signature file has a very simple fixed format: four lines\n+ * of \"object <sha1>\" + \"type <typename>\" + \"tag <tagname>\" +\n+ * \"tagger <committer>\", followed by a blank line, a free-form tag\n+ * message and a signature block that git itself doesn't care about,\n+ * but that can be verified with gpg or similar.\n  *\n  * The first three lines are guaranteed to be at least 63 bytes:\n  * \"object <sha1>\\n\" is 48 bytes, \"type tag\\n\" at 9 bytes is the\n@@ -46,45 +47,42 @@ static int verify_tag(char *buffer, unsi\n \tconst char *object, *type_line, *tag_line, *tagger_line;\n \n \tif (size < 64)\n-\t\treturn error(\"wanna fool me ? you obviously got the size wrong !\\n\");\n+\t\treturn error(\"wanna fool me ? you obviously got the size wrong !\");\n \n \tbuffer[size] = 0;\n \n \t/* Verify object line */\n \tobject = buffer;\n \tif (memcmp(object, \"object \", 7))\n-\t\treturn error(\"char%d: does not start with \\\"object \\\"\\n\", 0);\n+\t\treturn error(\"char%d: does not start with \\\"object \\\"\", 0);\n \n \tif (get_sha1_hex(object + 7, sha1))\n-\t\treturn error(\"char%d: could not get SHA1 hash\\n\", 7);\n+\t\treturn error(\"char%d: could not get SHA1 hash\", 7);\n \n \t/* Verify type line */\n \ttype_line = object + 48;\n \tif (memcmp(type_line - 1, \"\\ntype \", 6))\n-\t\treturn error(\"char%d: could not find \\\"\\\\ntype \\\"\\n\", 47);\n+\t\treturn error(\"char%d: could not find \\\"\\\\ntype \\\"\", 47);\n \n \t/* Verify tag-line */\n \ttag_line = strchr(type_line, '\\n');\n \tif (!tag_line)\n-\t\treturn error(\"char%td: could not find next \\\"\\\\n\\\"\\n\", type_line - buffer);\n+\t\treturn error(\"char%td: could not find next \\\"\\\\n\\\"\", type_line - buffer);\n \ttag_line++;\n \tif (memcmp(tag_line, \"tag \", 4) || tag_line[4] == '\\n')\n-\t\treturn error(\"char%td: no \\\"tag \\\" found\\n\", tag_line - buffer);\n+\t\treturn error(\"char%td: no \\\"tag \\\" found\", tag_line - buffer);\n \n \t/* Get the actual type */\n \ttypelen = tag_line - type_line - strlen(\"type \\n\");\n \tif (typelen >= sizeof(type))\n-\t\treturn error(\"char%td: type too long\\n\", type_line+5 - buffer);\n+\t\treturn error(\"char%td: type too long\", type_line+5 - buffer);\n \n \tmemcpy(type, type_line+5, typelen);\n \ttype[typelen] = 0;\n \n \t/* Verify that the object matches */\n-\tif (get_sha1_hex(object + 7, sha1))\n-\t\treturn error(\"char%d: could not get SHA1 hash but this is really odd since i got it before !\\n\", 7);\n-\n \tif (verify_object(sha1, type))\n-\t\treturn error(\"char%d: could not verify object %s\\n\", 7, sha1);\n+\t\treturn error(\"char%d: could not verify object %s\", 7, sha1_to_hex(sha1));\n \n \t/* Verify the tag-name: we don't allow control characters or spaces in it */\n \ttag_line += 4;\n@@ -94,14 +92,17 @@ static int verify_tag(char *buffer, unsi\n \t\t\tbreak;\n \t\tif (c > ' ')\n \t\t\tcontinue;\n-\t\treturn error(\"char%td: could not verify tag name\\n\", tag_line - buffer);\n+\t\treturn error(\"char%td: could not verify tag name\", tag_line - buffer);\n \t}\n \n \t/* Verify the tagger line */\n \ttagger_line = tag_line;\n \n \tif (memcmp(tagger_line, \"tagger\", 6) || (tagger_line[6] == '\\n'))\n-\t\treturn error(\"char%td: could not find \\\"tagger\\\"\\n\", tagger_line - buffer);\n+\t\treturn error(\"char%td: could not find \\\"tagger\\\"\", tagger_line - buffer);\n+\n+\t/* TODO: check for committer info + blank line? */\n+\t/* Also, the minimum length is probably + \"tagger .\", or 63+8=71 */\n \n \t/* The actual stuff afterwards we don't care about.. */\n \treturn 0;\ndiff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh\nnew file mode 100755\nindex 0000000..b833e19\n--- /dev/null\n+++ b/t/t3800-mktag.sh\n@@ -0,0 +1,227 @@\n+#!/bin/sh\n+#\n+#\n+\n+test_description='git-mktag: tag object verify test'\n+\n+. ./test-lib.sh\n+\n+###########################################################\n+# check the tag.sig file, expecting verify_tag() to fail,\n+# and checking that the error message matches the pattern\n+# given in the expect.pat file.\n+\n+check_verify_failure () {\n+    test_expect_success \\\n+        \"$1\" \\\n+        'git-mktag <tag.sig 2>message ||\n+         egrep -q -f expect.pat message'\n+}\n+\n+###########################################################\n+# first create a commit, so we have a valid object/type\n+# for the tag.\n+echo Hello >A\n+git-update-index --add A\n+git-commit -m \"Initial commit\"\n+head=$(git-rev-parse --verify HEAD)\n+\n+############################################################\n+#  1. length check\n+\n+cat >tag.sig <<EOF\n+too short for a tag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: .*size wrong.*$\n+EOF\n+\n+check_verify_failure 'Tag object length check'\n+\n+############################################################\n+#  2. object line label check\n+\n+cat >tag.sig <<EOF\n+xxxxxx 139e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char0: .*\"object \"$\n+EOF\n+\n+check_verify_failure '\"object\" line label check'\n+\n+############################################################\n+#  3. object line SHA1 check\n+\n+cat >tag.sig <<EOF\n+object zz9e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char7: .*SHA1 hash$\n+EOF\n+\n+check_verify_failure '\"object\" line SHA1 check'\n+\n+############################################################\n+#  4. type line label check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+xxxx tag\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char47: .*\"[\\]ntype \"$\n+EOF\n+\n+check_verify_failure '\"type\" line label check'\n+\n+############################################################\n+#  5. type line eol check\n+\n+echo \"object 779e9b33986b1c2670fff52c5067603117b3e895\" >tag.sig\n+echo -n \"type tagsssssssssssssssssssssssssssssss\" >>tag.sig\n+\n+cat >expect.pat <<EOF\n+^error: char48: .*\"[\\]n\"$\n+EOF\n+\n+check_verify_failure '\"type\" line eol check'\n+\n+############################################################\n+#  6. tag line label check #1\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type tag\n+xxx mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char57: no \"tag \" found$\n+EOF\n+\n+check_verify_failure '\"tag\" line label check #1'\n+\n+############################################################\n+#  7. tag line label check #2\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type taggggggggggggggggggggggggggggggg\n+tag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char87: no \"tag \" found$\n+EOF\n+\n+check_verify_failure '\"tag\" line label check #2'\n+\n+############################################################\n+#  8. type line type-name length check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type taggggggggggggggggggggggggggggggg\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char53: type too long$\n+EOF\n+\n+check_verify_failure '\"type\" line type-name length check'\n+\n+############################################################\n+#  9. verify object (SHA1/type) check\n+\n+cat >tag.sig <<EOF\n+object 779e9b33986b1c2670fff52c5067603117b3e895\n+type tagggg\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char7: could not verify object.*$\n+EOF\n+\n+check_verify_failure 'verify object (SHA1/type) check'\n+\n+############################################################\n+# 10. verify tag-name check\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag my\ttag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char67: could not verify tag name$\n+EOF\n+\n+check_verify_failure 'verify tag-name check'\n+\n+############################################################\n+# 11. tagger line lable check #1\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char70: could not find \"tagger\"$\n+EOF\n+\n+check_verify_failure '\"tagger\" line label check #1'\n+\n+############################################################\n+# 12. tagger line lable check #2\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+tagger\n+EOF\n+\n+cat >expect.pat <<EOF\n+^error: char70: could not find \"tagger\"$\n+EOF\n+\n+check_verify_failure '\"tagger\" line label check #2'\n+\n+############################################################\n+# 13. create valid tag\n+\n+cat >tag.sig <<EOF\n+object $head\n+type commit\n+tag mytag\n+tagger another@example.com\n+EOF\n+\n+test_expect_success \\\n+    'create valid tag' \\\n+    'git-mktag <tag.sig >.git/refs/tags/mytag 2>message'\n+\n+############################################################\n+# 14. check mytag\n+\n+test_expect_success \\\n+    'check mytag' \\\n+    'git-tag -l | grep mytag'\n+\n+\n+test_done\n-- \n1.4.1\n\n"}]}