config: format paths gently

Move the logic for formatting path config values into a helper method
and use gentle parsing when needed.

We need to be careful about how to handle the ':(optional)' macro, which
as tested in t1311-config-optional.sh must allow for ignoring a missing
path when other multiple values exist, but cause 'git config get' to
fail if it is the only possible value and thus no result is output.

In the case of our list, we need to omit those values silently. This
necessitates the use of the 'gently' parameter here.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee
2026-02-23 12:26:50 +00:00
committed by Junio C Hamano
parent 9c7fc23c24
commit bcfb9128c9
2 changed files with 23 additions and 12 deletions

View File

@@ -314,6 +314,25 @@ static int format_config_bool_or_str(struct strbuf *buf,
return 0;
}
static int format_config_path(struct strbuf *buf,
const char *key_,
const char *value_,
int gently)
{
char *v;
if (git_config_pathname(&v, key_, value_) < 0)
return -1;
if (v)
strbuf_addstr(buf, v);
else
return gently ? -1 : 1; /* :(optional)no-such-file */
free(v);
return 0;
}
/*
* Format the configuration key-value pair (`key_`, `value_`) and
* append it into strbuf `buf`. Returns a negative value on failure,
@@ -347,16 +366,9 @@ static int format_config(const struct config_display_options *opts,
res = format_config_bool_or_int(buf, key_, value_, kvi, gently);
else if (opts->type == TYPE_BOOL_OR_STR)
res = format_config_bool_or_str(buf, value_);
else if (opts->type == TYPE_PATH) {
char *v;
if (git_config_pathname(&v, key_, value_) < 0)
return -1;
if (v)
strbuf_addstr(buf, v);
else
return 1; /* :(optional)no-such-file */
free((char *)v);
} else if (opts->type == TYPE_EXPIRY_DATE) {
else if (opts->type == TYPE_PATH)
res = format_config_path(buf, key_, value_, gently);
else if (opts->type == TYPE_EXPIRY_DATE) {
timestamp_t t;
if (git_config_expiry_date(&t, key_, value_) < 0)
return -1;

View File

@@ -2545,7 +2545,6 @@ test_expect_success 'list --type=bool-or-int shows only canonicalizable values'
'
test_expect_success 'list --type=path shows only canonicalizable path values' '
# TODO: handling of missing path is incorrect here.
cat >expect <<-EOF &&
section.foo=True
section.number=10
@@ -2554,7 +2553,7 @@ test_expect_success 'list --type=path shows only canonicalizable path values' '
section.red=red
section.blue=Blue
section.date=Fri Jun 4 15:46:55 2010
section.missing=section.exists=expect
section.exists=expect
EOF
git config ${mode_prefix}list --type=path >actual 2>err &&