{"thread":{"id":"58117","subject":"[PATCH] gpg-interface: add function for converting trust level to string","startedAt":"2022-07-07T13:58:40Z","lastAt":"2022-07-11T05:12:27Z","messageCount":13,"participants":["Jaydeep Das via GitGitGadget","Junio C Hamano","Eric Sunshine","jaydeepjd.8914@gmail.com","Jaydeep Das"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"458565","messageId":"pull.1281.git.1657202265048.gitgitgadget@gmail.com","threadId":"58117","inReplyTo":null,"subject":"[PATCH] gpg-interface: add function for converting trust level to string","fromName":"Jaydeep Das via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2022-07-07T13:57:44Z","receivedAt":"2022-07-07T13:58:40Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"From: Jaydeep P Das <jaydeepjd.8914@gmail.com>\n\nAdd new helper function `gpg_trust_level_to_str()` which will\nconvert a given member of `enum signature_trust_level` to its\ncorresponding string. For example, `TRUST_ULTIMATE`\nwill yield the string \"ULTIMATE\".\n\nThis will abstract out some code in `pretty.c` relating to gpg\nsignature trust levels.\n\nMentored-by: Christian Couder <chriscool@tuxfamily.org>\nMentored-by: Hariom Verma <hariom18599@gmail.com>\nSigned-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n---\n    gpg-interface: add function for converting trust level to string\n    \n    Add new helper function gpg_trust_level_to_str() which will convert a\n    given member of enum signature_trust_level to its corresponding string.\n    For example, TRUST_ULTIMATE will yield the string \"ULTIMATE\".\n    \n    This will abstract out some code in pretty.c relating to gpg signature\n    trust levels.\n    \n    Mentored-by: Christian Couder chriscool@tuxfamily.org Mentored-by:\n    Hariom Verma hariom18599@gmail.com Signed-off-by: Jaydeep Das\n    jaydeepjd.8914@gmail.com\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-1281%2FJDeepD%2Fgpg-wrap-v1\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1281/JDeepD/gpg-wrap-v1\nPull-Request: https://github.com/gitgitgadget/git/pull/1281\n\n gpg-interface.c |  7 +++++++\n gpg-interface.h |  8 ++++++++\n pretty.c        | 23 ++++++-----------------\n 3 files changed, 21 insertions(+), 17 deletions(-)\n\ndiff --git a/gpg-interface.c b/gpg-interface.c\nindex 947b58ad4da..fe6e5ce5127 100644\n--- a/gpg-interface.c\n+++ b/gpg-interface.c\n@@ -165,6 +165,7 @@ static struct {\n \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n };\n \n+/* Keep the order same as enum signature_trust_level */\n static struct {\n \tconst char *key;\n \tenum signature_trust_level value;\n@@ -905,6 +906,12 @@ const char *get_signing_key(void)\n \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n }\n \n+const char *gpg_trust_level_to_str(enum signature_trust_level level){\n+\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n+\t\treturn NULL;\n+\treturn sigcheck_gpg_trust_level[level].key;\n+}\n+\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n {\n \treturn use_format->sign_buffer(buffer, signature, signing_key);\ndiff --git a/gpg-interface.h b/gpg-interface.h\nindex b30cbdcd3da..48f7edd916b 100644\n--- a/gpg-interface.h\n+++ b/gpg-interface.h\n@@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature,\n \t\tconst char *signing_key);\n \n+\n+/*\n+ * Returns corresponding string for a given member of\n+ * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n+ * return \"ULTIMATE\".\n+ */\n+const char *gpg_trust_level_to_str(enum signature_trust_level level);\n+\n int git_gpg_config(const char *, const char *, void *);\n void set_signing_key(const char *);\n const char *get_signing_key(void);\ndiff --git a/pretty.c b/pretty.c\nindex ee6114e3f0a..f617dd601ac 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -1347,7 +1347,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \tconst struct commit *commit = c->commit;\n \tconst char *msg = c->message;\n \tstruct commit_list *p;\n-\tconst char *arg, *eol;\n+\tconst char *arg, *eol, *sig_str;\n \tsize_t res;\n \tchar **slot;\n \n@@ -1575,22 +1575,11 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \t\t\t\tstrbuf_addstr(sb, c->signature_check.primary_key_fingerprint);\n \t\t\tbreak;\n \t\tcase 'T':\n-\t\t\tswitch (c->signature_check.trust_level) {\n-\t\t\tcase TRUST_UNDEFINED:\n-\t\t\t\tstrbuf_addstr(sb, \"undefined\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_NEVER:\n-\t\t\t\tstrbuf_addstr(sb, \"never\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_MARGINAL:\n-\t\t\t\tstrbuf_addstr(sb, \"marginal\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_FULLY:\n-\t\t\t\tstrbuf_addstr(sb, \"fully\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_ULTIMATE:\n-\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n-\t\t\t\tbreak;\n+\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n+\t\t\tif (sig_str){\n+\t\t\t\tconst char *sig_str_lower = xstrdup_tolower(sig_str);\n+\t\t\t\tstrbuf_addstr(sb, sig_str_lower);\n+\t\t\t\tfree((char *)sig_str_lower);\n \t\t\t}\n \t\t\tbreak;\n \t\tdefault:\n\nbase-commit: 30cc8d0f147546d4dd77bf497f4dec51e7265bd8\n-- \ngitgitgadget\n"},{"id":"458587","messageId":"xmqqwncozt03.fsf@gitster.g","threadId":"58117","inReplyTo":"pull.1281.git.1657202265048.gitgitgadget@gmail.com","subject":"Re: [PATCH] gpg-interface: add function for converting trust level to string","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-07T18:18:20Z","receivedAt":"2022-07-07T18:18:28Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Jaydeep Das via GitGitGadget\" <gitgitgadget@gmail.com> writes:\n\n> diff --git a/gpg-interface.c b/gpg-interface.c\n> index 947b58ad4da..fe6e5ce5127 100644\n> --- a/gpg-interface.c\n> +++ b/gpg-interface.c\n> @@ -165,6 +165,7 @@ static struct {\n>  \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n>  };\n>  \n> +/* Keep the order same as enum signature_trust_level */\n>  static struct {\n>  \tconst char *key;\n>  \tenum signature_trust_level value;\n> @@ -905,6 +906,12 @@ const char *get_signing_key(void)\n>  \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n>  }\n>  \n> +const char *gpg_trust_level_to_str(enum signature_trust_level level){\n> +\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n> +\t\treturn NULL;\n> +\treturn sigcheck_gpg_trust_level[level].key;\n> +}\n> +\n>  int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n>  {\n>  \treturn use_format->sign_buffer(buffer, signature, signing_key);\n> diff --git a/gpg-interface.h b/gpg-interface.h\n> index b30cbdcd3da..48f7edd916b 100644\n> --- a/gpg-interface.h\n> +++ b/gpg-interface.h\n> @@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n>  int sign_buffer(struct strbuf *buffer, struct strbuf *signature,\n>  \t\tconst char *signing_key);\n>  \n> +\n> +/*\n> + * Returns corresponding string for a given member of\n> + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n> + * return \"ULTIMATE\".\n> + */\n> +const char *gpg_trust_level_to_str(enum signature_trust_level level);\n> +\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n> +\t\t\tif (sig_str){\n\nMissing SP before open-brace.\n\n> +\t\t\t\tconst char *sig_str_lower = xstrdup_tolower(sig_str);\n> +\t\t\t\tstrbuf_addstr(sb, sig_str_lower);\n> +\t\t\t\tfree((char *)sig_str_lower);\n\nUnnecessary const plus casting-away of it.  You are getting a copy\nto work with, so there is no reason to declare sig_str_lower to be\n\"const\".  This downcasing should be done in gpg_trust_level_to_str()\nfunction, shouldn't it?  After all, the \"str\" version of the trust\nlevel existing end-users are familiar with are the strings you\nremoved from pretty.c that are all lowercase.\n\nThanks.\n"},{"id":"458629","messageId":"pull.1281.v2.git.1657279447515.gitgitgadget@gmail.com","threadId":"58117","inReplyTo":"pull.1281.git.1657202265048.gitgitgadget@gmail.com","subject":"[PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Jaydeep Das via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2022-07-08T11:24:07Z","receivedAt":"2022-07-08T11:24:27Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"From: Jaydeep Das <jaydeepjd.8914@gmail.com>\n\nAdd new helper function `gpg_trust_level_to_str()` which will\nconvert a given member of `enum signature_trust_level` to its\ncorresponding string(in lowercase). For example, `TRUST_ULTIMATE`\nwill yield the string \"ultimate\".\n\nThis will abstract out some code in `pretty.c` relating to gpg\nsignature trust levels.\n\nMentored-by: Christian Couder <chriscool@tuxfamily.org>\nMentored-by: Hariom Verma <hariom18599@gmail.com>\nSigned-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n---\n    gpg-interface: add function for converting trust level to string\n    \n    Add new helper function gpg_trust_level_to_str() which will convert a\n    given member of enum signature_trust_level to its corresponding string\n    in lowercase. For example, TRUST_ULTIMATE will yield the string\n    \"ultimate\".\n    \n    This will abstract out some code in pretty.c relating to gpg signature\n    trust levels.\n    \n    Changes since v1:\n    \n     * gpg_trust_level_to_str() now returns the string in lowercase\n    \n    Mentored-by: Christian Couder chriscool@tuxfamily.org Mentored-by:\n    Hariom Verma hariom18599@gmail.com Signed-off-by: Jaydeep Das\n    jaydeepjd.8914@gmail.com\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-1281%2FJDeepD%2Fgpg-wrap-v2\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1281/JDeepD/gpg-wrap-v2\nPull-Request: https://github.com/gitgitgadget/git/pull/1281\n\nRange-diff vs v1:\n\n 1:  fbbad9cc26a ! 1:  640decc2afe gpg-interface: add function for converting trust level to string\n     @@\n       ## Metadata ##\n     -Author: Jaydeep P Das <jaydeepjd.8914@gmail.com>\n     +Author: Jaydeep Das <jaydeepjd.8914@gmail.com>\n      \n       ## Commit message ##\n          gpg-interface: add function for converting trust level to string\n      \n          Add new helper function `gpg_trust_level_to_str()` which will\n          convert a given member of `enum signature_trust_level` to its\n     -    corresponding string. For example, `TRUST_ULTIMATE`\n     -    will yield the string \"ULTIMATE\".\n     +    corresponding string(in lowercase). For example, `TRUST_ULTIMATE`\n     +    will yield the string \"ultimate\".\n      \n          This will abstract out some code in `pretty.c` relating to gpg\n          signature trust levels.\n     @@ gpg-interface.c: const char *get_signing_key(void)\n       \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n       }\n       \n     -+const char *gpg_trust_level_to_str(enum signature_trust_level level){\n     ++char *gpg_trust_level_to_str(enum signature_trust_level level){\n      +\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n      +\t\treturn NULL;\n     -+\treturn sigcheck_gpg_trust_level[level].key;\n     ++\treturn xstrdup_tolower(sigcheck_gpg_trust_level[level].key);\n      +}\n      +\n       int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n     @@ gpg-interface.h: size_t parse_signed_buffer(const char *buf, size_t size);\n       \n      +\n      +/*\n     -+ * Returns corresponding string for a given member of\n     ++ * Returns corresponding string in lowercase for a given member of\n      + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n     -+ * return \"ULTIMATE\".\n     ++ * return \"ultimate\".\n      + */\n     -+const char *gpg_trust_level_to_str(enum signature_trust_level level);\n     ++char *gpg_trust_level_to_str(enum signature_trust_level level);\n      +\n       int git_gpg_config(const char *, const char *, void *);\n       void set_signing_key(const char *);\n     @@ gpg-interface.h: size_t parse_signed_buffer(const char *buf, size_t size);\n      \n       ## pretty.c ##\n      @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n     - \tconst struct commit *commit = c->commit;\n       \tconst char *msg = c->message;\n       \tstruct commit_list *p;\n     --\tconst char *arg, *eol;\n     -+\tconst char *arg, *eol, *sig_str;\n     + \tconst char *arg, *eol;\n     ++\tchar *sig_str;\n       \tsize_t res;\n       \tchar **slot;\n       \n     @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n      -\t\t\tcase TRUST_ULTIMATE:\n      -\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n      -\t\t\t\tbreak;\n     +-\t\t\t}\n      +\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n     -+\t\t\tif (sig_str){\n     -+\t\t\t\tconst char *sig_str_lower = xstrdup_tolower(sig_str);\n     -+\t\t\t\tstrbuf_addstr(sb, sig_str_lower);\n     -+\t\t\t\tfree((char *)sig_str_lower);\n     - \t\t\t}\n     ++\t\t\tif (sig_str)\n     ++\t\t\t\tstrbuf_addstr(sb, sig_str);\n     ++\t\t\tfree(sig_str);\n       \t\t\tbreak;\n       \t\tdefault:\n     + \t\t\treturn 0;\n\n\n gpg-interface.c |  7 +++++++\n gpg-interface.h |  8 ++++++++\n pretty.c        | 22 +++++-----------------\n 3 files changed, 20 insertions(+), 17 deletions(-)\n\ndiff --git a/gpg-interface.c b/gpg-interface.c\nindex 947b58ad4da..4ef660a09fc 100644\n--- a/gpg-interface.c\n+++ b/gpg-interface.c\n@@ -165,6 +165,7 @@ static struct {\n \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n };\n \n+/* Keep the order same as enum signature_trust_level */\n static struct {\n \tconst char *key;\n \tenum signature_trust_level value;\n@@ -905,6 +906,12 @@ const char *get_signing_key(void)\n \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n }\n \n+char *gpg_trust_level_to_str(enum signature_trust_level level){\n+\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n+\t\treturn NULL;\n+\treturn xstrdup_tolower(sigcheck_gpg_trust_level[level].key);\n+}\n+\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n {\n \treturn use_format->sign_buffer(buffer, signature, signing_key);\ndiff --git a/gpg-interface.h b/gpg-interface.h\nindex b30cbdcd3da..ce2db6f3780 100644\n--- a/gpg-interface.h\n+++ b/gpg-interface.h\n@@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature,\n \t\tconst char *signing_key);\n \n+\n+/*\n+ * Returns corresponding string in lowercase for a given member of\n+ * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n+ * return \"ultimate\".\n+ */\n+char *gpg_trust_level_to_str(enum signature_trust_level level);\n+\n int git_gpg_config(const char *, const char *, void *);\n void set_signing_key(const char *);\n const char *get_signing_key(void);\ndiff --git a/pretty.c b/pretty.c\nindex ee6114e3f0a..5ee03d6fe09 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -1348,6 +1348,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \tconst char *msg = c->message;\n \tstruct commit_list *p;\n \tconst char *arg, *eol;\n+\tchar *sig_str;\n \tsize_t res;\n \tchar **slot;\n \n@@ -1575,23 +1576,10 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \t\t\t\tstrbuf_addstr(sb, c->signature_check.primary_key_fingerprint);\n \t\t\tbreak;\n \t\tcase 'T':\n-\t\t\tswitch (c->signature_check.trust_level) {\n-\t\t\tcase TRUST_UNDEFINED:\n-\t\t\t\tstrbuf_addstr(sb, \"undefined\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_NEVER:\n-\t\t\t\tstrbuf_addstr(sb, \"never\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_MARGINAL:\n-\t\t\t\tstrbuf_addstr(sb, \"marginal\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_FULLY:\n-\t\t\t\tstrbuf_addstr(sb, \"fully\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_ULTIMATE:\n-\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n-\t\t\t\tbreak;\n-\t\t\t}\n+\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n+\t\t\tif (sig_str)\n+\t\t\t\tstrbuf_addstr(sb, sig_str);\n+\t\t\tfree(sig_str);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn 0;\n\nbase-commit: 30cc8d0f147546d4dd77bf497f4dec51e7265bd8\n-- \ngitgitgadget\n"},{"id":"458674","messageId":"CAPig+cTX76ZMG_S-qOX_JDxYVWXRvtP2Ref4k8uM1KJaDwX9=w@mail.gmail.com","threadId":"58117","inReplyTo":"pull.1281.v2.git.1657279447515.gitgitgadget@gmail.com","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2022-07-09T00:58:22Z","receivedAt":"2022-07-09T00:58:38Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Fri, Jul 8, 2022 at 7:28 AM Jaydeep Das via GitGitGadget\n<gitgitgadget@gmail.com> wrote:\n> Add new helper function `gpg_trust_level_to_str()` which will\n> convert a given member of `enum signature_trust_level` to its\n> corresponding string(in lowercase). For example, `TRUST_ULTIMATE`\n\ns/g(/g (/\n\n> will yield the string \"ultimate\".\n>\n> This will abstract out some code in `pretty.c` relating to gpg\n> signature trust levels.\n>\n> Signed-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n> ---\n> diff --git a/gpg-interface.h b/gpg-interface.h\n> @@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n> +/*\n> + * Returns corresponding string in lowercase for a given member of\n> + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n> + * return \"ultimate\".\n> + */\n> +char *gpg_trust_level_to_str(enum signature_trust_level level);\n\nIt would be a good idea to update the function documentation to\nmention that the caller is responsible for freeing the returned\nstring.\n"},{"id":"458676","messageId":"123af6b4-aa4c-b528-62b6-d9d5257f441b@gmail.com","threadId":"58117","inReplyTo":"CAPig+cTX76ZMG_S-qOX_JDxYVWXRvtP2Ref4k8uM1KJaDwX9=w@mail.gmail.com","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"","fromEmail":"jaydeepjd.8914@gmail.com","sentAt":"2022-07-09T03:51:53Z","receivedAt":"2022-07-09T03:52:05Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"On 7/9/22 6:28 AM, Eric Sunshine <sunshine@sunshineco.com> wrote:\n> On Fri, Jul 8, 2022 at 7:28 AM Jaydeep Das via GitGitGadget\n> <gitgitgadget@gmail.com> wrote:\n> > Signed-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n> > ---\n> > diff --git a/gpg-interface.h b/gpg-interface.h\n> > @@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n> > +/*\n> > + * Returns corresponding string in lowercase for a given member of\n> > + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n> > + * return \"ultimate\".\n> > + */\n> > +char *gpg_trust_level_to_str(enum signature_trust_level level);\n> \n> It would be a good idea to update the function documentation to\n> mention that the caller is responsible for freeing the returned\n> string.\n\nYeah. Will do in next version.\n\nThanks,\nJaydeep.\n"},{"id":"458677","messageId":"pull.1281.v3.git.1657341817595.gitgitgadget@gmail.com","threadId":"58117","inReplyTo":"pull.1281.v2.git.1657279447515.gitgitgadget@gmail.com","subject":"[PATCH v3] gpg-interface: add function for converting trust level to string","fromName":"Jaydeep Das via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2022-07-09T04:43:37Z","receivedAt":"2022-07-09T04:43:49Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"From: Jaydeep Das <jaydeepjd.8914@gmail.com>\n\nAdd new helper function `gpg_trust_level_to_str()` which will\nconvert a given member of `enum signature_trust_level` to its\ncorresponding string (in lowercase). For example, `TRUST_ULTIMATE`\nwill yield the string \"ultimate\".\n\nThis will abstract out some code in `pretty.c` relating to gpg\nsignature trust levels.\n\nMentored-by: Christian Couder <chriscool@tuxfamily.org>\nMentored-by: Hariom Verma <hariom18599@gmail.com>\nSigned-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n---\n    gpg-interface: add function for converting trust level to string\n    \n    Add new helper function gpg_trust_level_to_str() which will convert a\n    given member of enum signature_trust_level to its corresponding string\n    in lowercase. For example, TRUST_ULTIMATE will yield the string\n    \"ultimate\".\n    \n    This will abstract out some code in pretty.c relating to gpg signature\n    trust levels.\n    \n    Changes since v1:\n    \n     * gpg_trust_level_to_str() now returns the string in lowercase.\n    \n    Changes since v2:\n    \n     * Updated docs.\n    \n    Mentored-by: Christian Couder chriscool@tuxfamily.org Mentored-by:\n    Hariom Verma hariom18599@gmail.com Signed-off-by: Jaydeep Das\n    jaydeepjd.8914@gmail.com\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-1281%2FJDeepD%2Fgpg-wrap-v3\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1281/JDeepD/gpg-wrap-v3\nPull-Request: https://github.com/gitgitgadget/git/pull/1281\n\nRange-diff vs v2:\n\n 1:  640decc2afe ! 1:  933d6caa916 gpg-interface: add function for converting trust level to string\n     @@ Commit message\n      \n          Add new helper function `gpg_trust_level_to_str()` which will\n          convert a given member of `enum signature_trust_level` to its\n     -    corresponding string(in lowercase). For example, `TRUST_ULTIMATE`\n     +    corresponding string (in lowercase). For example, `TRUST_ULTIMATE`\n          will yield the string \"ultimate\".\n      \n          This will abstract out some code in `pretty.c` relating to gpg\n     @@ gpg-interface.h: size_t parse_signed_buffer(const char *buf, size_t size);\n      +/*\n      + * Returns corresponding string in lowercase for a given member of\n      + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n     -+ * return \"ultimate\".\n     ++ * return \"ultimate\". Since it uses xstrdup_tolower(), which uses\n     ++ * xmallocz(), the caller has to free up the memory for returned string\n     ++ * after usage.\n      + */\n      +char *gpg_trust_level_to_str(enum signature_trust_level level);\n      +\n\n\n gpg-interface.c |  7 +++++++\n gpg-interface.h | 10 ++++++++++\n pretty.c        | 22 +++++-----------------\n 3 files changed, 22 insertions(+), 17 deletions(-)\n\ndiff --git a/gpg-interface.c b/gpg-interface.c\nindex 947b58ad4da..4ef660a09fc 100644\n--- a/gpg-interface.c\n+++ b/gpg-interface.c\n@@ -165,6 +165,7 @@ static struct {\n \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n };\n \n+/* Keep the order same as enum signature_trust_level */\n static struct {\n \tconst char *key;\n \tenum signature_trust_level value;\n@@ -905,6 +906,12 @@ const char *get_signing_key(void)\n \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n }\n \n+char *gpg_trust_level_to_str(enum signature_trust_level level){\n+\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n+\t\treturn NULL;\n+\treturn xstrdup_tolower(sigcheck_gpg_trust_level[level].key);\n+}\n+\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n {\n \treturn use_format->sign_buffer(buffer, signature, signing_key);\ndiff --git a/gpg-interface.h b/gpg-interface.h\nindex b30cbdcd3da..eda8b32015c 100644\n--- a/gpg-interface.h\n+++ b/gpg-interface.h\n@@ -71,6 +71,16 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature,\n \t\tconst char *signing_key);\n \n+\n+/*\n+ * Returns corresponding string in lowercase for a given member of\n+ * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n+ * return \"ultimate\". Since it uses xstrdup_tolower(), which uses\n+ * xmallocz(), the caller has to free up the memory for returned string\n+ * after usage.\n+ */\n+char *gpg_trust_level_to_str(enum signature_trust_level level);\n+\n int git_gpg_config(const char *, const char *, void *);\n void set_signing_key(const char *);\n const char *get_signing_key(void);\ndiff --git a/pretty.c b/pretty.c\nindex ee6114e3f0a..5ee03d6fe09 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -1348,6 +1348,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \tconst char *msg = c->message;\n \tstruct commit_list *p;\n \tconst char *arg, *eol;\n+\tchar *sig_str;\n \tsize_t res;\n \tchar **slot;\n \n@@ -1575,23 +1576,10 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \t\t\t\tstrbuf_addstr(sb, c->signature_check.primary_key_fingerprint);\n \t\t\tbreak;\n \t\tcase 'T':\n-\t\t\tswitch (c->signature_check.trust_level) {\n-\t\t\tcase TRUST_UNDEFINED:\n-\t\t\t\tstrbuf_addstr(sb, \"undefined\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_NEVER:\n-\t\t\t\tstrbuf_addstr(sb, \"never\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_MARGINAL:\n-\t\t\t\tstrbuf_addstr(sb, \"marginal\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_FULLY:\n-\t\t\t\tstrbuf_addstr(sb, \"fully\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_ULTIMATE:\n-\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n-\t\t\t\tbreak;\n-\t\t\t}\n+\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n+\t\t\tif (sig_str)\n+\t\t\t\tstrbuf_addstr(sb, sig_str);\n+\t\t\tfree(sig_str);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn 0;\n\nbase-commit: 30cc8d0f147546d4dd77bf497f4dec51e7265bd8\n-- \ngitgitgadget\n"},{"id":"458694","messageId":"xmqqwncmt3el.fsf@gitster.g","threadId":"58117","inReplyTo":"CAPig+cTX76ZMG_S-qOX_JDxYVWXRvtP2Ref4k8uM1KJaDwX9=w@mail.gmail.com","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-09T20:52:18Z","receivedAt":"2022-07-09T20:52:26Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Eric Sunshine <sunshine@sunshineco.com> writes:\n\n> On Fri, Jul 8, 2022 at 7:28 AM Jaydeep Das via GitGitGadget\n> <gitgitgadget@gmail.com> wrote:\n>> Add new helper function `gpg_trust_level_to_str()` which will\n>> convert a given member of `enum signature_trust_level` to its\n>> corresponding string(in lowercase). For example, `TRUST_ULTIMATE`\n>\n> s/g(/g (/\n>\n>> will yield the string \"ultimate\".\n>>\n>> This will abstract out some code in `pretty.c` relating to gpg\n>> signature trust levels.\n>>\n>> Signed-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n>> ---\n>> diff --git a/gpg-interface.h b/gpg-interface.h\n>> @@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n>> +/*\n>> + * Returns corresponding string in lowercase for a given member of\n>> + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n>> + * return \"ultimate\".\n>> + */\n>> +char *gpg_trust_level_to_str(enum signature_trust_level level);\n>\n> It would be a good idea to update the function documentation to\n> mention that the caller is responsible for freeing the returned\n> string.\n\nGiven that there are small and fixed number of trust level strings,\nI actually think that it would be more reasonable to return a static\nstring to the caller, something along the lines of the attached, so\nthat callers do not have to worry about freeing it.\n\nPerhaps along the lines of ...\n\n gpg-interface.c | 19 ++++++++++++++++++-\n gpg-interface.h |  2 ++\n 2 files changed, 20 insertions(+), 1 deletion(-)\n\ndiff --git c/gpg-interface.c w/gpg-interface.c\nindex 947b58ad4d..4a5b9d0f3a 100644\n--- c/gpg-interface.c\n+++ w/gpg-interface.c\n@@ -165,9 +165,10 @@ static struct {\n \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n };\n \n-static struct {\n+static struct sigcheck_gpg_trust_level {\n \tconst char *key;\n \tenum signature_trust_level value;\n+\tconst char *downcased;\n } sigcheck_gpg_trust_level[] = {\n \t{ \"UNDEFINED\", TRUST_UNDEFINED },\n \t{ \"NEVER\", TRUST_NEVER },\n@@ -176,6 +177,22 @@ static struct {\n \t{ \"ULTIMATE\", TRUST_ULTIMATE },\n };\n \n+const char *gpg_trust_level_to_string(enum signature_trust_level level)\n+{\n+\tstruct sigcheck_gpg_trust_level *trust;\n+\n+\tif (level < 0 || ARRAY_SIZE(sigcheck_gpg_trust_level) <= level)\n+\t\tBUG(\"invalid trust_level requested: %d\", level);\n+\n+\ttrust = &sigcheck_gpg_trust_level[level];\n+\tif (trust->value != level)\n+\t\tBUG(\"sigcheck_gpg_trust_level[] unsorted\");\n+\n+\tif (!trust->downcased)\n+\t\ttrust->downcased = xstrdup_tolower(trust->key);\n+\treturn trust->downcased;\n+}\n+\n static void replace_cstring(char **field, const char *line, const char *next)\n {\n \tfree(*field);\ndiff --git c/gpg-interface.h w/gpg-interface.h\nindex b30cbdcd3d..2dffcb836d 100644\n--- c/gpg-interface.h\n+++ w/gpg-interface.h\n@@ -85,4 +85,6 @@ int check_signature(struct signature_check *sigc,\n void print_signature_buffer(const struct signature_check *sigc,\n \t\t\t    unsigned flags);\n \n+const char *gpg_trust_level_to_string(enum signature_trust_level);\n+\n #endif\n"},{"id":"458701","messageId":"CAPig+cScKabgrh80e5rqWX8cnNEgvxP9JyVJCu+afBOJk_yopg@mail.gmail.com","threadId":"58117","inReplyTo":"xmqqwncmt3el.fsf@gitster.g","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2022-07-10T05:44:53Z","receivedAt":"2022-07-10T05:45:08Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Sat, Jul 9, 2022 at 4:52 PM Junio C Hamano <gitster@pobox.com> wrote:\n> Eric Sunshine <sunshine@sunshineco.com> writes:\n> > On Fri, Jul 8, 2022 at 7:28 AM Jaydeep Das via GitGitGadget\n> >> + * Returns corresponding string in lowercase for a given member of\n> >> + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n> >> + * return \"ultimate\".\n> >> +char *gpg_trust_level_to_str(enum signature_trust_level level);\n> >\n> > It would be a good idea to update the function documentation to\n> > mention that the caller is responsible for freeing the returned\n> > string.\n>\n> Given that there are small and fixed number of trust level strings,\n> I actually think that it would be more reasonable to return a static\n> string to the caller, something along the lines of the attached, so\n> that callers do not have to worry about freeing it.\n\nI also am not a fan of making the caller free the result, and thought\nof mentioning it but didn't know if the approach implemented by this\npatch was suggested by an earlier reviewer.\n\n> Perhaps along the lines of ...\n>\n> +static struct sigcheck_gpg_trust_level {\n>         const char *key;\n>         enum signature_trust_level value;\n> +       const char *downcased;\n>  } sigcheck_gpg_trust_level[] = {\n>\n> +const char *gpg_trust_level_to_string(enum signature_trust_level level)\n> +{\n> +       struct sigcheck_gpg_trust_level *trust;\n> +\n> +       if (level < 0 || ARRAY_SIZE(sigcheck_gpg_trust_level) <= level)\n> +               BUG(\"invalid trust_level requested: %d\", level);\n> +\n> +       trust = &sigcheck_gpg_trust_level[level];\n> +       if (trust->value != level)\n> +               BUG(\"sigcheck_gpg_trust_level[] unsorted\");\n> +\n> +       if (!trust->downcased)\n> +               trust->downcased = xstrdup_tolower(trust->key);\n> +       return trust->downcased;\n> +}\n\nGiven the small, fixed number of trust levels, and if the list is\nunlikely to change much in the future, I might suggest simply\ninitializing the fields at compile-time rather than on-demand at\nrun-time:\n\n    static struct {\n        const char *key;\n        const char *display_key;\n        enum signature_trust_level value;\n    } sigcheck_gpg_trust_level[] = {\n        { \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n        { \"NEVER\", \"never\", TRUST_NEVER },\n        { \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n        { \"FULLY\", \"fully\", TRUST_FULLY },\n        { \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n    };\n"},{"id":"458702","messageId":"xmqqilo5sel6.fsf@gitster.g","threadId":"58117","inReplyTo":"CAPig+cScKabgrh80e5rqWX8cnNEgvxP9JyVJCu+afBOJk_yopg@mail.gmail.com","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-10T05:48:21Z","receivedAt":"2022-07-10T05:48:28Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Eric Sunshine <sunshine@sunshineco.com> writes:\n\n> Given the small, fixed number of trust levels, and if the list is\n> unlikely to change much in the future, I might suggest simply\n> initializing the fields at compile-time rather than on-demand at\n> run-time:\n>\n>     static struct {\n>         const char *key;\n>         const char *display_key;\n>         enum signature_trust_level value;\n>     } sigcheck_gpg_trust_level[] = {\n>         { \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n>         { \"NEVER\", \"never\", TRUST_NEVER },\n>         { \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n>         { \"FULLY\", \"fully\", TRUST_FULLY },\n>         { \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n>     };\n\nYup, that is even better.  I wonder if we can upcase in C\npreprocessor macro?  It would be wonderful if we can do so,\nbut for just 5 entries, we can type each token three times\njust fine.\n\n\n\n\n"},{"id":"458703","messageId":"CAPig+cSqBARuXgcr3W4_1fEb_d4srXCkW=Ur20VV2jyT9sVNkA@mail.gmail.com","threadId":"58117","inReplyTo":"xmqqilo5sel6.fsf@gitster.g","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2022-07-10T06:21:16Z","receivedAt":"2022-07-10T06:21:32Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Sun, Jul 10, 2022 at 1:48 AM Junio C Hamano <gitster@pobox.com> wrote:\n> Eric Sunshine <sunshine@sunshineco.com> writes:\n> > Given the small, fixed number of trust levels, and if the list is\n> > unlikely to change much in the future, I might suggest simply\n> > initializing the fields at compile-time rather than on-demand at\n> > run-time:\n> >\n> >     static struct {\n> >         const char *key;\n> >         const char *display_key;\n> >         enum signature_trust_level value;\n> >     } sigcheck_gpg_trust_level[] = {\n> >         { \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n> >         { \"NEVER\", \"never\", TRUST_NEVER },\n> >         { \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n> >         { \"FULLY\", \"fully\", TRUST_FULLY },\n> >         { \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n> >     };\n>\n> Yup, that is even better.  I wonder if we can upcase in C\n> preprocessor macro?  It would be wonderful if we can do so,\n> but for just 5 entries, we can type each token three times\n> just fine.\n\nNo standardized way to upcase via the C preprocessor, as far as I\nknow. At any rate, I suspect such a macro would be uglier and harder\nto reason about than the code above, which is dead-simple to\nunderstand.\n"},{"id":"458745","messageId":"ac3f12de-a421-dfec-dd2c-e1aae2393515@gmail.com","threadId":"58117","inReplyTo":"CAPig+cScKabgrh80e5rqWX8cnNEgvxP9JyVJCu+afBOJk_yopg@mail.gmail.com","subject":"Re: [PATCH v2] gpg-interface: add function for converting trust level to string","fromName":"Jaydeep Das","fromEmail":"jaydeepjd.8914@gmail.com","sentAt":"2022-07-11T03:51:28Z","receivedAt":"2022-07-11T03:51:39Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"\n\nOn 7/10/22 11:14, Eric Sunshine wrote:\n  \n> I also am not a fan of making the caller free the result, and thought\n> of mentioning it but didn't know if the approach implemented by this\n> patch was suggested by an earlier reviewer.\n> \n> \n> Given the small, fixed number of trust levels, and if the list is\n> unlikely to change much in the future, I might suggest simply\n> initializing the fields at compile-time rather than on-demand at\n> run-time:\n> \n>      static struct {\n>          const char *key;\n>          const char *display_key;\n>          enum signature_trust_level value;\n>      } sigcheck_gpg_trust_level[] = {\n>          { \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n>          { \"NEVER\", \"never\", TRUST_NEVER },\n>          { \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n>          { \"FULLY\", \"fully\", TRUST_FULLY },\n>          { \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n>      };\n\nWill do in next patch.\n\nThanks,\nJaydeep\n"},{"id":"458750","messageId":"pull.1281.v4.git.1657515650587.gitgitgadget@gmail.com","threadId":"58117","inReplyTo":"pull.1281.v3.git.1657341817595.gitgitgadget@gmail.com","subject":"[PATCH v4] gpg-interface: add function for converting trust level to string","fromName":"Jaydeep Das via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2022-07-11T05:00:50Z","receivedAt":"2022-07-11T05:00:59Z","isPatch":true,"sender":{"key":"jaydeepjd.8914@gmail.com","avatar":"https://avatars.githubusercontent.com/u/64089730?v=4"},"body":"From: Jaydeep Das <jaydeepjd.8914@gmail.com>\n\nAdd new helper function `gpg_trust_level_to_str()` which will\nconvert a given member of `enum signature_trust_level` to its\ncorresponding string (in lowercase). For example, `TRUST_ULTIMATE`\nwill yield the string \"ultimate\".\n\nThis will abstract out some code in `pretty.c` relating to gpg\nsignature trust levels.\n\nMentored-by: Christian Couder <chriscool@tuxfamily.org>\nMentored-by: Hariom Verma <hariom18599@gmail.com>\nSigned-off-by: Jaydeep Das <jaydeepjd.8914@gmail.com>\n---\n    gpg-interface: add function for converting trust level to string\n    \n    Add new helper function gpg_trust_level_to_str() which will convert a\n    given member of enum signature_trust_level to its corresponding string\n    in lowercase. For example, TRUST_ULTIMATE will yield the string\n    \"ultimate\".\n    \n    This will abstract out some code in pretty.c relating to gpg signature\n    trust levels.\n    \n    Changes since v1:\n    \n     * gpg_trust_level_to_str() now returns the string in lowercase.\n    \n    Changes since v2:\n    \n     * Updated docs.\n    \n    Changes since v3:\n    \n     * gpg_trust_level_to_str() now returns a static string. So the caller\n       does not have to worry about free()ing it.\n     * Updated pretty.c and docs accordingly.\n    \n    Mentored-by: Christian Couder chriscool@tuxfamily.org Mentored-by:\n    Hariom Verma hariom18599@gmail.com Signed-off-by: Jaydeep Das\n    jaydeepjd.8914@gmail.com\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-1281%2FJDeepD%2Fgpg-wrap-v4\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1281/JDeepD/gpg-wrap-v4\nPull-Request: https://github.com/gitgitgadget/git/pull/1281\n\nRange-diff vs v3:\n\n 1:  933d6caa916 ! 1:  7692b83821d gpg-interface: add function for converting trust level to string\n     @@ gpg-interface.c: static struct {\n       \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n       };\n       \n     +-static struct {\n      +/* Keep the order same as enum signature_trust_level */\n     - static struct {\n     ++static struct sigcheck_gpg_trust_level {\n       \tconst char *key;\n     ++\tconst char *display_key;\n       \tenum signature_trust_level value;\n     + } sigcheck_gpg_trust_level[] = {\n     +-\t{ \"UNDEFINED\", TRUST_UNDEFINED },\n     +-\t{ \"NEVER\", TRUST_NEVER },\n     +-\t{ \"MARGINAL\", TRUST_MARGINAL },\n     +-\t{ \"FULLY\", TRUST_FULLY },\n     +-\t{ \"ULTIMATE\", TRUST_ULTIMATE },\n     ++\t{ \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n     ++\t{ \"NEVER\", \"never\", TRUST_NEVER },\n     ++\t{ \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n     ++\t{ \"FULLY\", \"fully\", TRUST_FULLY },\n     ++\t{ \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n     + };\n     + \n     + static void replace_cstring(char **field, const char *line, const char *next)\n      @@ gpg-interface.c: const char *get_signing_key(void)\n       \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n       }\n       \n     -+char *gpg_trust_level_to_str(enum signature_trust_level level){\n     -+\tif (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)\n     -+\t\treturn NULL;\n     -+\treturn xstrdup_tolower(sigcheck_gpg_trust_level[level].key);\n     ++const char *gpg_trust_level_to_str(enum signature_trust_level level)\n     ++{\n     ++\tstruct sigcheck_gpg_trust_level *trust;\n     ++\n     ++\tif (level < 0 || level >= ARRAY_SIZE(sigcheck_gpg_trust_level))\n     ++\t\tBUG(\"invalid trust level requested %d\", level);\n     ++\n     ++\ttrust = &sigcheck_gpg_trust_level[level];\n     ++\tif (trust->value != level)\n     ++\t\tBUG(\"sigcheck_gpg_trust_level[] unsorted\");\n     ++\n     ++\treturn sigcheck_gpg_trust_level[level].display_key;\n      +}\n      +\n       int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n     @@ gpg-interface.h: size_t parse_signed_buffer(const char *buf, size_t size);\n      +/*\n      + * Returns corresponding string in lowercase for a given member of\n      + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n     -+ * return \"ultimate\". Since it uses xstrdup_tolower(), which uses\n     -+ * xmallocz(), the caller has to free up the memory for returned string\n     -+ * after usage.\n     ++ * return \"ultimate\".\n      + */\n     -+char *gpg_trust_level_to_str(enum signature_trust_level level);\n     ++const char *gpg_trust_level_to_str(enum signature_trust_level level);\n      +\n       int git_gpg_config(const char *, const char *, void *);\n       void set_signing_key(const char *);\n       const char *get_signing_key(void);\n      \n       ## pretty.c ##\n     -@@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n     - \tconst char *msg = c->message;\n     - \tstruct commit_list *p;\n     - \tconst char *arg, *eol;\n     -+\tchar *sig_str;\n     - \tsize_t res;\n     - \tchar **slot;\n     - \n      @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n       \t\t\t\tstrbuf_addstr(sb, c->signature_check.primary_key_fingerprint);\n       \t\t\tbreak;\n     @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n      -\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n      -\t\t\t\tbreak;\n      -\t\t\t}\n     -+\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n     -+\t\t\tif (sig_str)\n     -+\t\t\t\tstrbuf_addstr(sb, sig_str);\n     -+\t\t\tfree(sig_str);\n     ++\t\t\tstrbuf_addstr(sb, gpg_trust_level_to_str(c->signature_check.trust_level));\n       \t\t\tbreak;\n       \t\tdefault:\n       \t\t\treturn 0;\n\n\n gpg-interface.c | 28 ++++++++++++++++++++++------\n gpg-interface.h |  8 ++++++++\n pretty.c        | 18 +-----------------\n 3 files changed, 31 insertions(+), 23 deletions(-)\n\ndiff --git a/gpg-interface.c b/gpg-interface.c\nindex 947b58ad4da..6dff2414603 100644\n--- a/gpg-interface.c\n+++ b/gpg-interface.c\n@@ -165,15 +165,17 @@ static struct {\n \t{ 0, \"TRUST_\", GPG_STATUS_TRUST_LEVEL },\n };\n \n-static struct {\n+/* Keep the order same as enum signature_trust_level */\n+static struct sigcheck_gpg_trust_level {\n \tconst char *key;\n+\tconst char *display_key;\n \tenum signature_trust_level value;\n } sigcheck_gpg_trust_level[] = {\n-\t{ \"UNDEFINED\", TRUST_UNDEFINED },\n-\t{ \"NEVER\", TRUST_NEVER },\n-\t{ \"MARGINAL\", TRUST_MARGINAL },\n-\t{ \"FULLY\", TRUST_FULLY },\n-\t{ \"ULTIMATE\", TRUST_ULTIMATE },\n+\t{ \"UNDEFINED\", \"undefined\", TRUST_UNDEFINED },\n+\t{ \"NEVER\", \"never\", TRUST_NEVER },\n+\t{ \"MARGINAL\", \"marginal\", TRUST_MARGINAL },\n+\t{ \"FULLY\", \"fully\", TRUST_FULLY },\n+\t{ \"ULTIMATE\", \"ultimate\", TRUST_ULTIMATE },\n };\n \n static void replace_cstring(char **field, const char *line, const char *next)\n@@ -905,6 +907,20 @@ const char *get_signing_key(void)\n \treturn git_committer_info(IDENT_STRICT | IDENT_NO_DATE);\n }\n \n+const char *gpg_trust_level_to_str(enum signature_trust_level level)\n+{\n+\tstruct sigcheck_gpg_trust_level *trust;\n+\n+\tif (level < 0 || level >= ARRAY_SIZE(sigcheck_gpg_trust_level))\n+\t\tBUG(\"invalid trust level requested %d\", level);\n+\n+\ttrust = &sigcheck_gpg_trust_level[level];\n+\tif (trust->value != level)\n+\t\tBUG(\"sigcheck_gpg_trust_level[] unsorted\");\n+\n+\treturn sigcheck_gpg_trust_level[level].display_key;\n+}\n+\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)\n {\n \treturn use_format->sign_buffer(buffer, signature, signing_key);\ndiff --git a/gpg-interface.h b/gpg-interface.h\nindex b30cbdcd3da..8a9ef41779e 100644\n--- a/gpg-interface.h\n+++ b/gpg-interface.h\n@@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);\n int sign_buffer(struct strbuf *buffer, struct strbuf *signature,\n \t\tconst char *signing_key);\n \n+\n+/*\n+ * Returns corresponding string in lowercase for a given member of\n+ * enum signature_trust_level. For example, `TRUST_ULTIMATE` will\n+ * return \"ultimate\".\n+ */\n+const char *gpg_trust_level_to_str(enum signature_trust_level level);\n+\n int git_gpg_config(const char *, const char *, void *);\n void set_signing_key(const char *);\n const char *get_signing_key(void);\ndiff --git a/pretty.c b/pretty.c\nindex ee6114e3f0a..6d819103fbf 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -1575,23 +1575,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n \t\t\t\tstrbuf_addstr(sb, c->signature_check.primary_key_fingerprint);\n \t\t\tbreak;\n \t\tcase 'T':\n-\t\t\tswitch (c->signature_check.trust_level) {\n-\t\t\tcase TRUST_UNDEFINED:\n-\t\t\t\tstrbuf_addstr(sb, \"undefined\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_NEVER:\n-\t\t\t\tstrbuf_addstr(sb, \"never\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_MARGINAL:\n-\t\t\t\tstrbuf_addstr(sb, \"marginal\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_FULLY:\n-\t\t\t\tstrbuf_addstr(sb, \"fully\");\n-\t\t\t\tbreak;\n-\t\t\tcase TRUST_ULTIMATE:\n-\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n-\t\t\t\tbreak;\n-\t\t\t}\n+\t\t\tstrbuf_addstr(sb, gpg_trust_level_to_str(c->signature_check.trust_level));\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn 0;\n\nbase-commit: 30cc8d0f147546d4dd77bf497f4dec51e7265bd8\n-- \ngitgitgadget\n"},{"id":"458751","messageId":"xmqq35f8p70q.fsf@gitster.g","threadId":"58117","inReplyTo":"pull.1281.v4.git.1657515650587.gitgitgadget@gmail.com","subject":"Re: [PATCH v4] gpg-interface: add function for converting trust level to string","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-11T05:12:21Z","receivedAt":"2022-07-11T05:12:27Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Jaydeep Das via GitGitGadget\" <gitgitgadget@gmail.com> writes:\n\n>      @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */\n>       -\t\t\t\tstrbuf_addstr(sb, \"ultimate\");\n>       -\t\t\t\tbreak;\n>       -\t\t\t}\n>      -+\t\t\tsig_str = gpg_trust_level_to_str(c->signature_check.trust_level);\n>      -+\t\t\tif (sig_str)\n>      -+\t\t\t\tstrbuf_addstr(sb, sig_str);\n>      -+\t\t\tfree(sig_str);\n>      ++\t\t\tstrbuf_addstr(sb, gpg_trust_level_to_str(c->signature_check.trust_level));\n\nThis part of the range-diff is the most pleasant to see.\n\nWill queue.  Thanks.\n"}]}