Re: [PATCH 4/5] config.c: add a "tristate" helper
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Apr 8, 2021, 18:33 UTC
- Message-ID
- <xmqqa6q8tymu.fsf@gitster.g>
- In-Reply-To
- <patch-4.6-222e91e11b-20210408T133125Z-avarab@gmail.com>
Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
Show 30 quoted lines
> Add "tristate" functions to go along with the "bool" functions and > migrate the common pattern of checking if something is "bool" or > "auto" in various places over to the new functions. > > We also have e.g. "repo_config_get_bool" and > "config_error_nonbool". I'm not adding corresponding "tristate" > functions as they're not needed by anything, but we could add those in > the future if they are. > > I'm not migrating over "core.abbrev" parsing as part of this > change. When "core.abbrev" was made optionally boolean in > a9ecaa06a7 (core.abbrev=no disables abbreviations, 2020-09-01) the > "die if empty" code added in g48d5014dd4 (config.abbrev: document the > new default that auto-scales, 2016-11-01) wasn't adjusted. It thus > behaves unlike all other "maybe bool" config variables. > > I have a planned series to start adding some tests for "core.abbrev", > but AFAICT there's not even a test for "core.abbrev=true", and I'd > like to focus on thing that have no behavior change here, so let's > leave it for now. > > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> > --- > builtin/log.c | 13 +++++++------ > compat/mingw.c | 6 +++--- > config.c | 16 ++++++++++++++++ > config.h | 12 ++++++++++++ > http.c | 5 +++-- > userdiff.c | 6 ++---- > 6 files changed, 43 insertions(+), 15 deletions(-)
Show 15 quoted lines
> diff --git a/config.c b/config.c
> index fc28dbd97c..74d2b2c0df 100644
> --- a/config.c
> +++ b/config.c
> @@ -1257,6 +1257,14 @@ int git_parse_maybe_bool(const char *value)
> return -1;
> }
>
> +int git_parse_maybe_tristate(const char *value)
> +{
> + int v = git_parse_maybe_bool(value);
> + if (v < 0 && !strcasecmp(value, "auto"))
> + return 2;
> + return v;
> +}This is not parse_mayb_bool_text(), so "1" and "-1" written in the configuration file are "true", "0" is "false", like the "bool" case.
I wonder if written without an unnecessary extra variable, i.e.
if (value && !strcasecmp(value, "auto")) return 2; return git_parse_maybe_bool(value);
is easier to follow, though, as it is quite clear that it is mostly the same as maybe_bool and the only difference is when "auto" is given.
Show 7 quoted lines
> +int git_config_tristate(const char *name, const char *value)
> +{
> + int v = git_parse_maybe_tristate(value);
> + if (v < 0)
> + die(_("bad tristate config value '%s' for '%s'"), value, name);
> + return v;
> +}OK.
Show 13 quoted lines
> diff --git a/config.h b/config.h > index 19a9adbaa9..c5129e4392 100644 > --- a/config.h > +++ b/config.h > @@ -197,6 +197,12 @@ int git_parse_ulong(const char *, unsigned long *); > */ > int git_parse_maybe_bool(const char *); > > +/** > + * Same as `git_parse_maybe_bool`, except that "auto" is recognized and > + * will return "2". > + */ > +int git_parse_maybe_tristate(const char *);
A false being 0 and a true being 1 is understandable for readers without symbolic constant, but "2" deserves to have a symbolic constant, doesn't it?
Show 9 quoted lines
> @@ -226,6 +232,12 @@ int git_config_bool_or_int(const char *, const char *, int *); > */ > int git_config_bool(const char *, const char *); > > +/** > + * Like git_config_bool() except "auto" is also recognized and will > + * return "2" > + */ > +int git_config_tristate(const char *, const char *);
Likewise.
Thanks.