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 v2] config: improve error message for boolean config
Date: Tue, 09 Feb 2021 01:25:08 +0000 [thread overview]
Message-ID: <pull.841.v2.git.git.1612833909210.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.841.git.git.1600395427.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.
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-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-841/KlotzAndrew/better_bool_errors-v2
Pull-Request: https://github.com/git/git/pull/841
Range-diff vs v1:
1: 689d84672422 ! 1: 32dd4ee1e373 config: improve error message for boolean config
@@ Commit message
boolean error message when we know the value is neither a bool text or
int.
- `GIT_TEST_GETTEXT_POISON` is a boolean so we no longer fail on
- evaluating it as an int in `git_config_int`. Because of that we can
- move the special translation case into the boolean config check where
- we are now failing with an updated message
-
before with an invalid boolean value of `non-boolean`, its unclear what
numeric is referring to:
```
@@ Commit message
## config.c ##
@@ config.c: static void die_bad_number(const char *name, const char *value)
- if (!value)
- 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(). This is why marked up
-- * translations with N_() above.
-- */
-- die(bad_numeric, value, name, error_type);
--
- if (!(cf && cf->name))
- die(_(bad_numeric), value, name, _(error_type));
-
-@@ config.c: int git_config_bool_or_int(const char *name, const char *value, int *is_bool)
- return v;
}
- *is_bool = 0;
-- return git_config_int(name, value);
-+ if (git_parse_int(value, &v))
-+ return v;
-+
+ }
+
++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
@@ config.c: int git_config_bool_or_int(const char *name, const char *value, int *i
+ 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;
+@@ config.c: 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 (0 <= v)
++ return v;
++ else
++ die_bad_bool(name, value);
+ }
+
+ 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
2: 1e9caf1911d3 < -: ------------ formatting for error messages
config.c | 21 +++++++++++++++++++--
t/t0205-gettext-poison.sh | 2 +-
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/config.c b/config.c
index 4c0cf3a1c15d..5e4fd6b5561b 100644
--- a/config.c
+++ b/config.c
@@ -1030,6 +1030,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;
@@ -1102,8 +1116,11 @@ 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 (0 <= v)
+ return v;
+ else
+ die_bad_bool(name, value);
}
int git_config_string(const char **dest, const char *var, const char *value)
diff --git a/t/t0205-gettext-poison.sh b/t/t0205-gettext-poison.sh
index f9fa16ad8363..b66d34c6f2bc 100755
--- a/t/t0205-gettext-poison.sh
+++ b/t/t0205-gettext-poison.sh
@@ -33,7 +33,7 @@ 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
"
test_done
base-commit: 66e871b6647ffea61a77a0f82c7ef3415f1ee79c
--
gitgitgadget
next prev parent reply other threads:[~2021-02-09 1:26 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 ` Andrew Klotz via GitGitGadget [this message]
2021-02-09 16:51 ` [PATCH v2] " Jeff King
2021-02-09 21:02 ` Junio C Hamano
2021-02-11 20:30 ` [PATCH v3] " Andrew Klotz via GitGitGadget
2021-02-12 10:38 ` 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.v2.git.git.1612833909210.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.