{"thread":{"id":"18510","subject":"[PATCH] builtin-tag.c: remove global variable to use the callback data of git-config.","startedAt":"2009-03-24T19:54:45Z","lastAt":"2009-03-24T19:54:45Z","messageCount":1,"participants":["Carlos Rica"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"109237","messageId":"1237924485.9871.33.camel@luis-desktop","threadId":"18510","inReplyTo":null,"subject":"[PATCH] builtin-tag.c: remove global variable to use the callback data of git-config.","fromName":"Carlos Rica","fromEmail":"jasampler@gmail.com","sentAt":"2009-03-24T19:54:45Z","receivedAt":"2009-03-24T19:54:45Z","isPatch":true,"sender":{"key":"jasampler@gmail.com","avatar":null},"body":"By using strbuf to save the signing-key id, now there's no limit\nto the length of the string obtained from the config or command-line.\nThis string is then passed to gpg to sign the tag, when appropriate.\n\nSigned-off-by: Carlos Rica <jasampler@gmail.com>\n---\n\n\nNOTES: As Johannes Schindelin suggested, now strbuf is correctly used,\n       using setlen() for chopping the end data of the committer info,\n       instead of just setting '\\0' and forgetting the len field.\n\n       Although git_committer_info() seems to return always the email\n       field between <angle brackets>, I left unchanged the \"if (bracket)\"\n       condition (as in builtin-log.c) to prevent errors or future changes.\n\n       Trying to test it, I found that gpg accepts any non-empty substring\n       of the name or email to identify the signing key ID, just as it is\n       stated in its manpage at end of section HOW TO SPECIFY A USER ID.\n\n\n builtin-tag.c |   41 +++++++++++++++++------------------------\n 1 files changed, 17 insertions(+), 24 deletions(-)\n\ndiff --git a/builtin-tag.c b/builtin-tag.c\nindex 01e7374..ad54e4a 100644\n--- a/builtin-tag.c\n+++ b/builtin-tag.c\n@@ -21,8 +21,6 @@ static const char * const git_tag_usage[] = {\n \tNULL\n };\n \n-static char signingkey[1000];\n-\n struct tag_filter {\n \tconst char *pattern;\n \tint lines;\n@@ -156,7 +154,7 @@ static int verify_tag(const char *name, const char *ref,\n \treturn 0;\n }\n \n-static int do_sign(struct strbuf *buffer)\n+static int do_sign(struct strbuf *signingkey, struct strbuf *buffer)\n {\n \tstruct child_process gpg;\n \tconst char *args[4];\n@@ -164,13 +162,12 @@ static int do_sign(struct strbuf *buffer)\n \tint len;\n \tint i, j;\n \n-\tif (!*signingkey) {\n-\t\tif (strlcpy(signingkey, git_committer_info(IDENT_ERROR_ON_NO_NAME),\n-\t\t\t\tsizeof(signingkey)) > sizeof(signingkey) - 1)\n-\t\t\treturn error(\"committer info too long.\");\n-\t\tbracket = strchr(signingkey, '>');\n+\tif (!signingkey->len) {\n+\t\tstrbuf_addstr(signingkey,\n+\t\t\t\tgit_committer_info(IDENT_ERROR_ON_NO_NAME));\n+\t\tbracket = strchr(signingkey->buf, '>');\n \t\tif (bracket)\n-\t\t\tbracket[1] = '\\0';\n+\t\t\tstrbuf_setlen(signingkey, bracket + 1 - signingkey->buf);\n \t}\n \n \t/* When the username signingkey is bad, program could be terminated\n@@ -183,7 +180,7 @@ static int do_sign(struct strbuf *buffer)\n \tgpg.out = -1;\n \targs[0] = \"gpg\";\n \targs[1] = \"-bsau\";\n-\targs[2] = signingkey;\n+\targs[2] = signingkey->buf;\n \targs[3] = NULL;\n \n \tif (start_command(&gpg))\n@@ -220,18 +217,12 @@ static const char tag_template[] =\n \t\"# Write a tag message\\n\"\n \t\"#\\n\";\n \n-static void set_signingkey(const char *value)\n-{\n-\tif (strlcpy(signingkey, value, sizeof(signingkey)) >= sizeof(signingkey))\n-\t\tdie(\"signing key value too long (%.10s...)\", value);\n-}\n-\n static int git_tag_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"user.signingkey\")) {\n \t\tif (!value)\n \t\t\treturn config_error_nonbool(var);\n-\t\tset_signingkey(value);\n+\t\tstrbuf_addstr((struct strbuf *) cb, value);\n \t\treturn 0;\n \t}\n \n@@ -266,9 +257,10 @@ static void write_tag_body(int fd, const unsigned char *sha1)\n \tfree(buf);\n }\n \n-static int build_tag_object(struct strbuf *buf, int sign, unsigned char *result)\n+static int build_tag_object(struct strbuf *buf, int sign,\n+\t\t\tstruct strbuf *signingkey, unsigned char *result)\n {\n-\tif (sign && do_sign(buf) < 0)\n+\tif (sign && do_sign(signingkey, buf) < 0)\n \t\treturn error(\"unable to sign the tag\");\n \tif (write_sha1_file(buf->buf, buf->len, tag_type, result) < 0)\n \t\treturn error(\"unable to write tag file\");\n@@ -277,6 +269,7 @@ static int build_tag_object(struct strbuf *buf, int sign, unsigned char *result)\n \n static void create_tag(const unsigned char *object, const char *tag,\n \t\t       struct strbuf *buf, int message, int sign,\n+\t\t       struct strbuf *signingkey,\n \t\t       unsigned char *prev, unsigned char *result)\n {\n \tenum object_type type;\n@@ -331,7 +324,7 @@ static void create_tag(const unsigned char *object, const char *tag,\n \n \tstrbuf_insert(buf, 0, header_buf, header_len);\n \n-\tif (build_tag_object(buf, sign, result) < 0) {\n+\tif (build_tag_object(buf, sign, signingkey, result) < 0) {\n \t\tif (path)\n \t\t\tfprintf(stderr, \"The tag message has been left in %s\\n\",\n \t\t\t\tpath);\n@@ -363,7 +356,7 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)\n \n int cmd_tag(int argc, const char **argv, const char *prefix)\n {\n-\tstruct strbuf buf = STRBUF_INIT;\n+\tstruct strbuf buf = STRBUF_INIT, signingkey = STRBUF_INIT;\n \tunsigned char object[20], prev[20];\n \tchar ref[PATH_MAX];\n \tconst char *object_ref, *tag;\n@@ -403,14 +396,14 @@ int cmd_tag(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n \n-\tgit_config(git_tag_config, NULL);\n+\tgit_config(git_tag_config, &signingkey);\n \n \targc = parse_options(argc, argv, options, git_tag_usage, 0);\n \tmsgfile = parse_options_fix_filename(prefix, msgfile);\n \n \tif (keyid) {\n \t\tsign = 1;\n-\t\tset_signingkey(keyid);\n+\t\tstrbuf_addstr(&signingkey, keyid);\n \t}\n \tif (sign)\n \t\tannotate = 1;\n@@ -474,7 +467,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)\n \n \tif (annotate)\n \t\tcreate_tag(object, tag, &buf, msg.given || msgfile,\n-\t\t\t   sign, prev, object);\n+\t\t\t   sign, &signingkey, prev, object);\n \n \tlock = lock_any_ref_for_update(ref, prev, 0);\n \tif (!lock)\n-- \n1.5.4.3\n"}]}