Subject: [PATCH v4] gpg-interface: add function for converting trust level to string

From: "Jaydeep Das via GitGitGadget" <[email-masked]>
Date: Mon, 11 Jul 2022 05:00:50 +0000

From: Jaydeep Das <[email-masked]>

Add new helper function `gpg_trust_level_to_str()` which will
convert a given member of `enum signature_trust_level` to its
corresponding string (in lowercase). For example, `TRUST_ULTIMATE`
will yield the string "ultimate".

This will abstract out some code in `pretty.c` relating to gpg
signature trust levels.

Mentored-by: Christian Couder <[email-masked]>
Mentored-by: Hariom Verma <[email-masked]>
Signed-off-by: Jaydeep Das <[email-masked]>
---
    gpg-interface: add function for converting trust level to string
    
    Add new helper function gpg_trust_level_to_str() which will convert a
    given member of enum signature_trust_level to its corresponding string
    in lowercase. For example, TRUST_ULTIMATE will yield the string
    "ultimate".
    
    This will abstract out some code in pretty.c relating to gpg signature
    trust levels.
    
    Changes since v1:
    
     * gpg_trust_level_to_str() now returns the string in lowercase.
    
    Changes since v2:
    
     * Updated docs.
    
    Changes since v3:
    
     * gpg_trust_level_to_str() now returns a static string. So the caller
       does not have to worry about free()ing it.
     * Updated pretty.c and docs accordingly.
    
    Mentored-by: Christian Couder [email-masked] Mentored-by:
    Hariom Verma [email-masked] Signed-off-by: Jaydeep Das
    [email-masked]

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1281%2FJDeepD%2Fgpg-wrap-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1281/JDeepD/gpg-wrap-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/1281

Range-diff vs v3:

 1:  933d6caa916 ! 1:  7692b83821d gpg-interface: add function for converting trust level to string
     @@ gpg-interface.c: static struct {
       	{ 0, "TRUST_", GPG_STATUS_TRUST_LEVEL },
       };
       
     +-static struct {
      +/* Keep the order same as enum signature_trust_level */
     - static struct {
     ++static struct sigcheck_gpg_trust_level {
       	const char *key;
     ++	const char *display_key;
       	enum signature_trust_level value;
     + } sigcheck_gpg_trust_level[] = {
     +-	{ "UNDEFINED", TRUST_UNDEFINED },
     +-	{ "NEVER", TRUST_NEVER },
     +-	{ "MARGINAL", TRUST_MARGINAL },
     +-	{ "FULLY", TRUST_FULLY },
     +-	{ "ULTIMATE", TRUST_ULTIMATE },
     ++	{ "UNDEFINED", "undefined", TRUST_UNDEFINED },
     ++	{ "NEVER", "never", TRUST_NEVER },
     ++	{ "MARGINAL", "marginal", TRUST_MARGINAL },
     ++	{ "FULLY", "fully", TRUST_FULLY },
     ++	{ "ULTIMATE", "ultimate", TRUST_ULTIMATE },
     + };
     + 
     + static void replace_cstring(char **field, const char *line, const char *next)
      @@ gpg-interface.c: const char *get_signing_key(void)
       	return git_committer_info(IDENT_STRICT | IDENT_NO_DATE);
       }
       
     -+char *gpg_trust_level_to_str(enum signature_trust_level level){
     -+	if (level < TRUST_UNDEFINED || level > TRUST_ULTIMATE)
     -+		return NULL;
     -+	return xstrdup_tolower(sigcheck_gpg_trust_level[level].key);
     ++const char *gpg_trust_level_to_str(enum signature_trust_level level)
     ++{
     ++	struct sigcheck_gpg_trust_level *trust;
     ++
     ++	if (level < 0 || level >= ARRAY_SIZE(sigcheck_gpg_trust_level))
     ++		BUG("invalid trust level requested %d", level);
     ++
     ++	trust = &sigcheck_gpg_trust_level[level];
     ++	if (trust->value != level)
     ++		BUG("sigcheck_gpg_trust_level[] unsorted");
     ++
     ++	return sigcheck_gpg_trust_level[level].display_key;
      +}
      +
       int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
     @@ gpg-interface.h: size_t parse_signed_buffer(const char *buf, size_t size);
      +/*
      + * Returns corresponding string in lowercase for a given member of
      + * enum signature_trust_level. For example, `TRUST_ULTIMATE` will
     -+ * return "ultimate". Since it uses xstrdup_tolower(), which uses
     -+ * xmallocz(), the caller has to free up the memory for returned string
     -+ * after usage.
     ++ * return "ultimate".
      + */
     -+char *gpg_trust_level_to_str(enum signature_trust_level level);
     ++const char *gpg_trust_level_to_str(enum signature_trust_level level);
      +
       int git_gpg_config(const char *, const char *, void *);
       void set_signing_key(const char *);
       const char *get_signing_key(void);
      
       ## pretty.c ##
     -@@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
     - 	const char *msg = c->message;
     - 	struct commit_list *p;
     - 	const char *arg, *eol;
     -+	char *sig_str;
     - 	size_t res;
     - 	char **slot;
     - 
      @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
       				strbuf_addstr(sb, c->signature_check.primary_key_fingerprint);
       			break;
     @@ pretty.c: static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
      -				strbuf_addstr(sb, "ultimate");
      -				break;
      -			}
     -+			sig_str = gpg_trust_level_to_str(c->signature_check.trust_level);
     -+			if (sig_str)
     -+				strbuf_addstr(sb, sig_str);
     -+			free(sig_str);
     ++			strbuf_addstr(sb, gpg_trust_level_to_str(c->signature_check.trust_level));
       			break;
       		default:
       			return 0;

 gpg-interface.c | 28 ++++++++++++++++++++++------
 gpg-interface.h |  8 ++++++++
 pretty.c        | 18 +-----------------
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/gpg-interface.c b/gpg-interface.c
index 947b58ad4da..6dff2414603 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -165,15 +165,17 @@ static struct {
 	{ 0, "TRUST_", GPG_STATUS_TRUST_LEVEL },
 };
 
-static struct {
+/* Keep the order same as enum signature_trust_level */
+static struct sigcheck_gpg_trust_level {
 	const char *key;
+	const char *display_key;
 	enum signature_trust_level value;
 } sigcheck_gpg_trust_level[] = {
-	{ "UNDEFINED", TRUST_UNDEFINED },
-	{ "NEVER", TRUST_NEVER },
-	{ "MARGINAL", TRUST_MARGINAL },
-	{ "FULLY", TRUST_FULLY },
-	{ "ULTIMATE", TRUST_ULTIMATE },
+	{ "UNDEFINED", "undefined", TRUST_UNDEFINED },
+	{ "NEVER", "never", TRUST_NEVER },
+	{ "MARGINAL", "marginal", TRUST_MARGINAL },
+	{ "FULLY", "fully", TRUST_FULLY },
+	{ "ULTIMATE", "ultimate", TRUST_ULTIMATE },
 };
 
 static void replace_cstring(char **field, const char *line, const char *next)
@@ -905,6 +907,20 @@ const char *get_signing_key(void)
 	return git_committer_info(IDENT_STRICT | IDENT_NO_DATE);
 }
 
+const char *gpg_trust_level_to_str(enum signature_trust_level level)
+{
+	struct sigcheck_gpg_trust_level *trust;
+
+	if (level < 0 || level >= ARRAY_SIZE(sigcheck_gpg_trust_level))
+		BUG("invalid trust level requested %d", level);
+
+	trust = &sigcheck_gpg_trust_level[level];
+	if (trust->value != level)
+		BUG("sigcheck_gpg_trust_level[] unsorted");
+
+	return sigcheck_gpg_trust_level[level].display_key;
+}
+
 int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
 {
 	return use_format->sign_buffer(buffer, signature, signing_key);
diff --git a/gpg-interface.h b/gpg-interface.h
index b30cbdcd3da..8a9ef41779e 100644
--- a/gpg-interface.h
+++ b/gpg-interface.h
@@ -71,6 +71,14 @@ size_t parse_signed_buffer(const char *buf, size_t size);
 int sign_buffer(struct strbuf *buffer, struct strbuf *signature,
 		const char *signing_key);
 
+
+/*
+ * Returns corresponding string in lowercase for a given member of
+ * enum signature_trust_level. For example, `TRUST_ULTIMATE` will
+ * return "ultimate".
+ */
+const char *gpg_trust_level_to_str(enum signature_trust_level level);
+
 int git_gpg_config(const char *, const char *, void *);
 void set_signing_key(const char *);
 const char *get_signing_key(void);
diff --git a/pretty.c b/pretty.c
index ee6114e3f0a..6d819103fbf 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1575,23 +1575,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
 				strbuf_addstr(sb, c->signature_check.primary_key_fingerprint);
 			break;
 		case 'T':
-			switch (c->signature_check.trust_level) {
-			case TRUST_UNDEFINED:
-				strbuf_addstr(sb, "undefined");
-				break;
-			case TRUST_NEVER:
-				strbuf_addstr(sb, "never");
-				break;
-			case TRUST_MARGINAL:
-				strbuf_addstr(sb, "marginal");
-				break;
-			case TRUST_FULLY:
-				strbuf_addstr(sb, "fully");
-				break;
-			case TRUST_ULTIMATE:
-				strbuf_addstr(sb, "ultimate");
-				break;
-			}
+			strbuf_addstr(sb, gpg_trust_level_to_str(c->signature_check.trust_level));
 			break;
 		default:
 			return 0;

base-commit: 30cc8d0f147546d4dd77bf497f4dec51e7265bd8
-- 
gitgitgadget