aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Stolee <stolee@gmail.com>2026-02-23 12:26:50 +0000
committerJunio C Hamano <gitster@pobox.com>2026-02-23 13:23:41 -0800
commitbcfb9128c9ce87dfeacaffe051257f7a5fc866e9 (patch)
treec8c4495dba070a542dc7eee85c1cfc62d14ddc57
parent9c7fc23c24cc0cfeaf5fe32a96fbfe2709a3f93d (diff)
downloadgit-bcfb9128c9ce87dfeacaffe051257f7a5fc866e9.tar.xz
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>
-rw-r--r--builtin/config.c32
-rwxr-xr-xt/t1300-config.sh3
2 files changed, 23 insertions, 12 deletions
diff --git a/builtin/config.c b/builtin/config.c
index 79c139c5b0..2828b6dcf1 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -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;
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index 1fc8e788ee..48d9c554d8 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -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 &&