{"thread":{"id":"18309","subject":"[PATCH] builtin-tag.c: remove global variable to use the callback data of git-config.","startedAt":"2009-03-14T07:17:15Z","lastAt":"2009-03-16T11:46:31Z","messageCount":3,"participants":["Carlos Rica","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"108000","messageId":"1237015035.9952.10.camel@luis-desktop","threadId":"18309","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-14T07:17:15Z","receivedAt":"2009-03-14T07:17:15Z","isPatch":true,"sender":{"key":"jasampler@gmail.com","avatar":null},"body":"Signed-off-by: Carlos Rica <jasampler@gmail.com>\n---\n\nHere I declare a struct to wrap the new local array along with its size.\nQUESTION: An alternative to this is strbuf, would it be preferable?\n\n\nbuiltin-tag.c |   43 ++++++++++++++++++++++++++-----------------\n 1 files changed, 26 insertions(+), 17 deletions(-)\n\ndiff --git a/builtin-tag.c b/builtin-tag.c\nindex 01e7374..2b2d728 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,12 @@ static int verify_tag(const char *name, const char *ref,\n \treturn 0;\n }\n \n-static int do_sign(struct strbuf *buffer)\n+struct char_array {\n+\tchar *buf;\n+\tsize_t size;\n+};\n+\n+static int do_sign(struct char_array *signingkey, struct strbuf *buffer)\n {\n \tstruct child_process gpg;\n \tconst char *args[4];\n@@ -164,11 +167,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+\tif (!signingkey->buf[0]) {\n+\t\tif (strlcpy(signingkey->buf,\n+\t\t\t\tgit_committer_info(IDENT_ERROR_ON_NO_NAME),\n+\t\t\t\tsigningkey->size) > signingkey->size - 1)\n \t\t\treturn error(\"committer info too long.\");\n-\t\tbracket = strchr(signingkey, '>');\n+\t\tbracket = strchr(signingkey->buf, '>');\n \t\tif (bracket)\n \t\t\tbracket[1] = '\\0';\n \t}\n@@ -183,7 +187,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,9 +224,10 @@ 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+static void set_signingkey(struct char_array *signingkey, const char *value)\n {\n-\tif (strlcpy(signingkey, value, sizeof(signingkey)) >= sizeof(signingkey))\n+\tif (strlcpy(signingkey->buf, value, signingkey->size)\n+\t\t\t\t\t>= signingkey->size)\n \t\tdie(\"signing key value too long (%.10s...)\", value);\n }\n \n@@ -231,7 +236,7 @@ static int git_tag_config(const char *var, const char *value, void *cb)\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\tset_signingkey((struct char_array *) cb, value);\n \t\treturn 0;\n \t}\n \n@@ -266,9 +271,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 char_array *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 +283,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 char_array *signingkey,\n \t\t       unsigned char *prev, unsigned char *result)\n {\n \tenum object_type type;\n@@ -331,7 +338,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@@ -374,6 +381,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)\n \tconst char *msgfile = NULL, *keyid = NULL;\n \tstruct msg_arg msg = { 0, STRBUF_INIT };\n \tstruct commit_list *with_commit = NULL;\n+\tchar keyarr[1000] = {'\\0'};\n+\tstruct char_array signingkey = { keyarr, sizeof(keyarr) };\n \tstruct option options[] = {\n \t\tOPT_BOOLEAN('l', NULL, &list, \"list tag names\"),\n \t\t{ OPTION_INTEGER, 'n', NULL, &lines, NULL,\n@@ -403,14 +412,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\tset_signingkey(&signingkey, keyid);\n \t}\n \tif (sign)\n \t\tannotate = 1;\n@@ -474,7 +483,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"},{"id":"108022","messageId":"7vprgjakpz.fsf@gitster.siamese.dyndns.org","threadId":"18309","inReplyTo":"1237015035.9952.10.camel@luis-desktop","subject":"Re: [PATCH] builtin-tag.c: remove global variable to use the callback data of git-config.","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-03-14T20:54:48Z","receivedAt":"2009-03-14T20:54:48Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Carlos Rica <jasampler@gmail.com> writes:\n\n> Signed-off-by: Carlos Rica <jasampler@gmail.com>\n> ---\n>\n> Here I declare a struct to wrap the new local array along with its size.\n> QUESTION: An alternative to this is strbuf, would it be preferable?\n\nThe command already uses strbuf for other purposes, so why not?\n"},{"id":"108079","messageId":"1b46aba20903160446y34bf106ai100b8231a54699ab@mail.gmail.com","threadId":"18309","inReplyTo":"7vprgjakpz.fsf@gitster.siamese.dyndns.org","subject":"Re: [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-16T11:46:31Z","receivedAt":"2009-03-16T11:46:31Z","isPatch":true,"sender":{"key":"jasampler@gmail.com","avatar":null},"body":"On Sat, Mar 14, 2009 at 9:54 PM, Junio C Hamano <gitster@pobox.com> wrote:\n> Carlos Rica <jasampler@gmail.com> writes:\n>\n>> Signed-off-by: Carlos Rica <jasampler@gmail.com>\n>> ---\n>>\n>> Here I declare a struct to wrap the new local array along with its size.\n>> QUESTION: An alternative to this is strbuf, would it be preferable?\n>\n> The command already uses strbuf for other purposes, so why not?\n\nstrbuf is designed as an unlimited length buffer, and now the user\nsigning-key id (obtained from the config or as a command's argument)\nis limited to the current static array size.\n\nIt is right to remove this limit? I haven't found something like\nstrlcpy for strbuf and I'm not sure if it would be a nice adition:\n\nsize_t strbuf_lcpy(struct strbuf *dest,\n        const char *src,  size_t max);\n"}]}