]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: format paths gently
authorDerrick Stolee <stolee@gmail.com>
Mon, 23 Feb 2026 12:26:50 +0000 (12:26 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 Feb 2026 21:23:41 +0000 (13:23 -0800)
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>
builtin/config.c
t/t1300-config.sh

index 79c139c5b06c1d8b6cf801a17469970b272c8509..2828b6dcf178148bbbc3fb7f0f0d5d53c81f39d0 100644 (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;
index 1fc8e788ee9cc5978814b4a28da2e5c1ad0d96a3..48d9c554d815bf75c512b000f4c92dd490dcd244 100755 (executable)
@@ -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 &&