log.decorate: accept 0/1 bool values

We explicitly document "0" and "1" as synonyms for "false"
and "true" in boolean config options. However, we don't
actually handle those values in git_config_maybe_bool.

In most cases this works fine, as we call git_config_bool,
which in turn calls git_config_bool_or_int, which in turn
calls git_config_maybe_bool. Values of 0/1 are considered
"not bool", but their integer values end up being converted
to the corresponding boolean values.

However, the log.decorate code looks for maybe_bool
explicitly, so that it can fall back to the "short" and
"full" strings. It does not handle 0/1 at all, and considers
them invalid values.

We cannot simply add 0/1 support to git_config_maybe_bool.
That would confuse git_config_bool_or_int, which may want to
distinguish the integer values "0" and "1" from bools.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2010-11-17 12:00:45 -05:00 committed by Junio C Hamano
parent f772c34ce0
commit b2be2f6aea
2 changed files with 23 additions and 2 deletions

View File

@ -410,7 +410,7 @@ unsigned long git_config_ulong(const char *name, const char *value)
return ret;
}
int git_config_maybe_bool(const char *name, const char *value)
static int git_config_maybe_bool_text(const char *name, const char *value)
{
if (!value)
return 1;
@ -427,9 +427,21 @@ int git_config_maybe_bool(const char *name, const char *value)
return -1;
}
int git_config_maybe_bool(const char *name, const char *value)
{
int v = git_config_maybe_bool_text(name, value);
if (0 <= v)
return v;
if (!strcmp(value, "0"))
return 0;
if (!strcmp(value, "1"))
return 1;
return -1;
}
int git_config_bool_or_int(const char *name, const char *value, int *is_bool)
{
int v = git_config_maybe_bool(name, value);
int v = git_config_maybe_bool_text(name, value);
if (0 <= v) {
*is_bool = 1;
return v;

View File

@ -421,6 +421,15 @@ test_expect_success 'log.decorate configuration' '
git log --oneline --decorate=full >actual &&
test_cmp expect.full actual &&
git config --unset-all log.decorate &&
git config log.decorate 1 &&
git log --oneline >actual &&
test_cmp expect.short actual &&
git log --oneline --decorate=full >actual &&
test_cmp expect.full actual &&
git log --oneline --decorate=no >actual &&
test_cmp expect.none actual &&
git config --unset-all log.decorate &&
git config log.decorate short &&
git log --oneline >actual &&