Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > 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@xxxxxxxxx> > --- > 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(-) > 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. > +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. > 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? > @@ -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.