git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 08/13] config: format paths gently

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Feb 23, 2026, 12:26 UTC
Message-ID
<d198c238e948e500b769d7b4d8267109f7297a8c.1771849615.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.2044.v3.git.1771849615.gitgitgadget@gmail.com>
From: Derrick Stolee <stolee@gmail.com>

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>
---
 builtin/config.c  | 32 ++++++++++++++++++++++----------
 t/t1300-config.sh |  3 +--
 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 &&
-- 
gitgitgadget
Previous: Derrick Stolee via GitGitGadgetNext: Derrick Stolee via GitGitGadget
Message 53 of 58 in “[RFC] Make 'git config list --type=' parse and filter types”
  1. 0/5 [RFC] Make 'git config list --type=' parse and filter typesDerrick Stolee via GitGitGadget, Feb 10, 2026
  2. 1/5 config: move show_all_config()Derrick Stolee via GitGitGadget, Feb 10, 2026
  3. 2/5 parse: add git_parse_maybe_pathname()Derrick Stolee via GitGitGadget, Feb 10, 2026
  4. Patrick SteinhardtFeb 11, 2026
  5. 3/5 config: allow format_config() to filterDerrick Stolee via GitGitGadget, Feb 10, 2026
  6. Junio C HamanoFeb 10, 2026
  7. Derrick StoleeFeb 10, 2026
  8. 4/5 config: create special init for list modeDerrick Stolee via GitGitGadget, Feb 10, 2026
  9. 5/5 config: make 'git config list --type=<X>' workDerrick Stolee via GitGitGadget, Feb 10, 2026
  10. Patrick SteinhardtFeb 11, 2026
  11. Derrick StoleeFeb 11, 2026
  12. Patrick SteinhardtFeb 12, 2026
  13. Junio C HamanoFeb 10, 2026
  14. Derrick StoleeFeb 10, 2026
  15. Patrick SteinhardtFeb 11, 2026
  16. 00/13 Make 'git config list --type=' parse and filter typesDerrick Stolee via GitGitGadget, Feb 13, 2026
  17. 01/13 config: move show_all_config()Derrick Stolee via GitGitGadget, Feb 13, 2026
  18. 02/13 config: add 'gently' parameter to format_config()Derrick Stolee via GitGitGadget, Feb 13, 2026
  19. Patrick SteinhardtFeb 17, 2026
  20. 03/13 config: make 'git config list --type=<X>' workDerrick Stolee via GitGitGadget, Feb 13, 2026
  21. Patrick SteinhardtFeb 17, 2026
  22. Junio C HamanoFeb 17, 2026
  23. Patrick SteinhardtFeb 17, 2026
  24. 04/13 config: format int64s gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  25. Junio C HamanoFeb 14, 2026
  26. Patrick SteinhardtFeb 17, 2026
  27. Derrick StoleeFeb 23, 2026
  28. 05/13 config: format bools gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  29. 06/13 config: format bools or ints gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  30. Patrick SteinhardtFeb 17, 2026
  31. Derrick StoleeFeb 23, 2026
  32. 07/13 config: format bools or strings in helperDerrick Stolee via GitGitGadget, Feb 13, 2026
  33. 08/13 parse: add git_parse_maybe_pathname()Derrick Stolee via GitGitGadget, Feb 13, 2026
  34. 09/13 config: format paths gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  35. Patrick SteinhardtFeb 17, 2026
  36. 10/13 config: format expiry dates gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  37. 11/13 color: add color_parse_gently()Derrick Stolee via GitGitGadget, Feb 13, 2026
  38. Patrick SteinhardtFeb 17, 2026
  39. Junio C HamanoFeb 17, 2026
  40. Derrick StoleeFeb 23, 2026
  41. Junio C HamanoFeb 23, 2026
  42. 12/13 config: format colors gentlyDerrick Stolee via GitGitGadget, Feb 13, 2026
  43. 13/13 config: restructure format_config()Derrick Stolee via GitGitGadget, Feb 13, 2026
  44. Patrick SteinhardtFeb 17, 2026
  45. 00/13 Make 'git config list --type=' parse and filter typesDerrick Stolee via GitGitGadget, Feb 23, 2026
  46. 01/13 config: move show_all_config()Derrick Stolee via GitGitGadget, Feb 23, 2026
  47. 02/13 config: add 'gently' parameter to format_config()Derrick Stolee via GitGitGadget, Feb 23, 2026
  48. 03/13 config: make 'git config list --type=<X>' workDerrick Stolee via GitGitGadget, Feb 23, 2026
  49. 04/13 config: format int64s gentlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  50. 05/13 config: format bools gentlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  51. 06/13 config: format bools or ints gentlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  52. 07/13 config: format bools or strings in helperDerrick Stolee via GitGitGadget, Feb 23, 2026
  53. 08/13 config: format paths gentlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  54. 09/13 config: format expiry dates quietlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  55. 10/13 color: add color_parse_quietly()Derrick Stolee via GitGitGadget, Feb 23, 2026
  56. 11/13 config: format colors quietlyDerrick Stolee via GitGitGadget, Feb 23, 2026
  57. 12/13 config: restructure format_config()Derrick Stolee via GitGitGadget, Feb 23, 2026
  58. 13/13 config: use an enum for typeDerrick Stolee via GitGitGadget, Feb 23, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.