All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andrew Klotz via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Jeff King <peff@peff.net>,
	Phillip Wood <phillip.wood123@gmail.com>,
	Andrew Klotz <agc.klotz@gmail.com>,
	Andrew Klotz <agc.klotz@gmail.com>
Subject: [PATCH v3] config: improve error message for boolean config
Date: Thu, 11 Feb 2021 20:30:53 +0000	[thread overview]
Message-ID: <pull.841.v3.git.git.1613075454274.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.841.v2.git.git.1612833909210.gitgitgadget@gmail.com>

From: Andrew Klotz <agc.klotz@gmail.com>

Currently invalid boolean config values return messages about 'bad
numeric', which is slightly misleading when the error was due to a
boolean value. We can improve the developer experience by returning a
boolean error message when we know the value is neither a bool text or
int.

before with an invalid boolean value of `non-boolean`, its unclear what
numeric is referring to:
  fatal: bad numeric config value 'non-boolean' for 'commit.gpgsign': invalid unit

now the error message mentions `non-boolean` is a bad boolean value:
  fatal: bad boolean config value 'non-boolean' for 'commit.gpgsign'

Signed-off-by: Andrew Klotz <agc.klotz@gmail.com>
---
    config: improve error message for boolean config
    
    Currently invalid boolean config values return messages about 'bad
    numeric', which I found misleading when the error was due to a boolean
    string value. This change makes the error message reflect the boolean
    value.
    
    The current approach relies on GIT_TEST_GETTEXT_POISON being a boolean
    value, moving its special case out from die_bad_number() and into
    git_config_bool_or_int(). An alternative could be for die_bad_number()
    to handle boolean values when erroring, although the function name might
    need to change if it is handling non-numeric values.
    
    changes since v1
    
     * moved boolean error message change out of git_config_bool_or_int to
       just in git_config_bool and added die_bad_boolean instead of
       modifying die_bad_number.
    
    changes since v2
    
     * added a test for boolean config values
     * changed the condition to hit die_bad_bool from if (0 <= v) to if (v <
       0)
     * removed change in get-text-poison.sh test
    
    Signed-off-by: Andrew Klotz agc.klotz@gmail.com

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-841%2FKlotzAndrew%2Fbetter_bool_errors-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-841/KlotzAndrew/better_bool_errors-v3
Pull-Request: https://github.com/git/git/pull/841

Range-diff vs v2:

 1:  32dd4ee1e373 ! 1:  45a51e18c1d3 config: improve error message for boolean config
     @@ Commit message
      
          before with an invalid boolean value of `non-boolean`, its unclear what
          numeric is referring to:
     -    ```
     -    fatal: bad numeric config value 'non-boolean' for 'commit.gpgsign': invalid unit
     -    ```
     +      fatal: bad numeric config value 'non-boolean' for 'commit.gpgsign': invalid unit
      
          now the error message mentions `non-boolean` is a bad boolean value:
     -    ```
     -    fatal: bad boolean config value 'non-boolean' for 'commit.gpgsign'
     -    ```
     +      fatal: bad boolean config value 'non-boolean' for 'commit.gpgsign'
      
          Signed-off-by: Andrew Klotz <agc.klotz@gmail.com>
      
     @@ config.c: int git_config_bool_or_int(const char *name, const char *value, int *i
      -	int discard;
      -	return !!git_config_bool_or_int(name, value, &discard);
      +	int v = git_parse_maybe_bool(value);
     -+	if (0 <= v)
     -+		return v;
     -+	else
     ++	if (v < 0)
      +		die_bad_bool(name, value);
     ++	return v;
       }
       
       int git_config_string(const char **dest, const char *var, const char *value)
      
     - ## t/t0205-gettext-poison.sh ##
     -@@ t/t0205-gettext-poison.sh: test_expect_success 'eval_gettext: our eval_gettext() fallback has poison semant
     - 
     - test_expect_success "gettext: invalid GIT_TEST_GETTEXT_POISON value doesn't infinitely loop" "
     - 	test_must_fail env GIT_TEST_GETTEXT_POISON=xyz git version 2>error &&
     --	grep \"fatal: bad numeric config value 'xyz' for 'GIT_TEST_GETTEXT_POISON': invalid unit\" error
     -+	grep \"fatal: bad boolean config value 'xyz' for 'GIT_TEST_GETTEXT_POISON'\" error
     - "
     + ## t/t1300-config.sh ##
     +@@ t/t1300-config.sh: test_expect_success 'invalid unit' '
     + 	test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
     + '
       
     - test_done
     ++test_expect_success 'invalid unit boolean' '
     ++	git config commit.gpgsign "1true" &&
     ++	test_cmp_config 1true commit.gpgsign &&
     ++	test_must_fail git config --bool --get commit.gpgsign 2>actual &&
     ++	test_i18ngrep "bad boolean config value .1true. for .commit.gpgsign." actual
     ++'
     ++
     + test_expect_success 'line number is reported correctly' '
     + 	printf "[bool]\n\tvar\n" >invalid &&
     + 	test_must_fail git config -f invalid --path bool.var 2>actual &&


 config.c          | 20 ++++++++++++++++++--
 t/t1300-config.sh |  7 +++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/config.c b/config.c
index b922b4f28572..f90b633dba21 100644
--- a/config.c
+++ b/config.c
@@ -1180,6 +1180,20 @@ static void die_bad_number(const char *name, const char *value)
 	}
 }
 
+NORETURN
+static void die_bad_bool(const char *name, const char *value)
+{
+	if (!strcmp(name, "GIT_TEST_GETTEXT_POISON"))
+		/*
+		 * We explicitly *don't* use _() here since it would
+		 * cause an infinite loop with _() needing to call
+		 * use_gettext_poison().
+		 */
+		die("bad boolean config value '%s' for '%s'", value, name);
+	else
+		die(_("bad boolean config value '%s' for '%s'"), value, name);
+}
+
 int git_config_int(const char *name, const char *value)
 {
 	int ret;
@@ -1252,8 +1266,10 @@ int git_config_bool_or_int(const char *name, const char *value, int *is_bool)
 
 int git_config_bool(const char *name, const char *value)
 {
-	int discard;
-	return !!git_config_bool_or_int(name, value, &discard);
+	int v = git_parse_maybe_bool(value);
+	if (v < 0)
+		die_bad_bool(name, value);
+	return v;
 }
 
 int git_config_string(const char **dest, const char *var, const char *value)
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 936d72041bab..e0dd5d65ceda 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -675,6 +675,13 @@ test_expect_success 'invalid unit' '
 	test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
 '
 
+test_expect_success 'invalid unit boolean' '
+	git config commit.gpgsign "1true" &&
+	test_cmp_config 1true commit.gpgsign &&
+	test_must_fail git config --bool --get commit.gpgsign 2>actual &&
+	test_i18ngrep "bad boolean config value .1true. for .commit.gpgsign." actual
+'
+
 test_expect_success 'line number is reported correctly' '
 	printf "[bool]\n\tvar\n" >invalid &&
 	test_must_fail git config -f invalid --path bool.var 2>actual &&

base-commit: c6102b758572c7515f606b2423dfe38934fe6764
-- 
gitgitgadget

  parent reply	other threads:[~2021-02-11 20:32 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-18  2:17 [PATCH 0/2] config: improve error message for boolean config Andrew Klotz via GitGitGadget
2020-09-18  2:17 ` [PATCH 1/2] " Andrew Klotz via GitGitGadget
2020-09-18 18:10   ` Jeff King
2020-09-18 18:30   ` Phillip Wood
2020-09-18 19:14     ` Junio C Hamano
2020-09-18  2:17 ` [PATCH 2/2] formatting for error messages Andrew Klotz via GitGitGadget
2020-09-18 17:22 ` [PATCH 0/2] config: improve error message for boolean config Junio C Hamano
2021-02-09  1:25 ` [PATCH v2] " Andrew Klotz via GitGitGadget
2021-02-09 16:51   ` Jeff King
2021-02-09 21:02     ` Junio C Hamano
2021-02-11 20:30   ` Andrew Klotz via GitGitGadget [this message]
2021-02-12 10:38     ` [PATCH v3] " Jeff King
2021-02-12 19:52       ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.841.v3.git.git.1613075454274.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=agc.klotz@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=peff@peff.net \
    --cc=phillip.wood123@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.