From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com,
"brian m. carlson" <sandals@crustytoothpaste.net>,
"Phillip Wood" <phillip.wood123@gmail.com>,
"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com>,
"Jean-Noël Avila" <jn.avila@free.fr>,
"Patrick Steinhardt" <ps@pks.im>,
"Derrick Stolee" <stolee@gmail.com>
Subject: [PATCH v2 00/13] Make 'git config list --type=' parse and filter types
Date: Fri, 13 Feb 2026 23:55:05 +0000 [thread overview]
Message-ID: <pull.2044.v2.git.1771026918.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2044.git.1770698579.gitgitgadget@gmail.com>
I started down this road based on feedback on my 'git config-batch' RFC [1].
[1]
https://lore.kernel.org/git/pull.2033.git.1770214803.gitgitgadget@gmail.com/
I had described my intention to use 'git config-batch' as a single process
to load multiple config values one-by-one. Brian mentioned that 'git config
list -z' would probably suffice, so I started experimenting in that
direction [2].
[2]
https://github.com/git-ecosystem/git-credential-manager/compare/main...derrickstolee:config-list
However, I ran into a problem: the most critical performance bottleneck is
related to path-formatted config values that are queried with 'git config
get --type=path -z'. It wasn't hard to update things to lazily load the full
list of config values by type [3], but I then noticed a big problem!
[3]
https://github.com/git-ecosystem/git-credential-manager/commit/d403c8e24ce6f37da920cce23842dd5a6cf6481d
Problem: 'git config list' doesn't respect --type=<X>!
This boils down to the fact that the iterator function show_all_config()
doesn't call format_config(), which includes the type-parsing code.
This wasn't super trivial to update:
1. format_config() uses git_config_parse_*() methods, which die() on a bad
parse.
2. The path parsing code didn't have a gentle version.
3. The two paths ('git config list' and 'git config --list') needed to
standardize their display options to work with format_config().
4. Finally, we need to filter out key-value pairs that don't match the
given type.
Updates in v2
=============
Based on the positive feedback in round one, this is no longer an RFC.
* format_config() now uses a 'gently' parameter instead of 'die_on_parse'
(flipped).
* format_config() is more carefully updated with helper methods and a
global refactor.
* New gentle parsing code is introduced right before the format_config()
helper is created to use it.
* I squashed the change that updates the display_opts initial state into
the patch that uses format_config() for the 'list' command. The initial
state change on its own leads to test failures, so I am making a slightly
bigger patch to keep things passing tests at every change.
* More tests for 'git config list --type=<X>' are added.
* I rearranged things so the 'git config list --type' integration follows
the format_config() update immediately. The tests at that time show what
such a trivial implementation would do, including failing on bool parsing
and having several error messages for color and expiry-date parsing. The
tests modify as these issues are fixed with gentle parsers.
* I have a prototype implementation of GCM using this option in [4] and it
gets the performance improvements I was hoping for. It requires polish
and a compatibility check that uses the Git version to guarantee that
this --type behavior change is recognized.
[4] https://github.com/git-ecosystem/git-credential-manager/pull/2268
Thanks for any and all feedback, -Stolee
Derrick Stolee (13):
config: move show_all_config()
config: add 'gently' parameter to format_config()
config: make 'git config list --type=<X>' work
config: format int64s gently
config: format bools gently
config: format bools or ints gently
config: format bools or strings in helper
parse: add git_parse_maybe_pathname()
config: format paths gently
config: format expiry dates gently
color: add color_parse_gently()
config: format colors gently
config: restructure format_config()
Documentation/git-config.adoc | 3 +
builtin/config.c | 283 +++++++++++++++++++++++++---------
color.c | 25 ++-
color.h | 1 +
config.c | 14 +-
parse.c | 24 +++
parse.h | 2 +
t/t1300-config.sh | 58 ++++++-
8 files changed, 318 insertions(+), 92 deletions(-)
base-commit: 67ad42147a7acc2af6074753ebd03d904476118f
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2044%2Fderrickstolee%2Fconfig-list-type-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2044/derrickstolee/config-list-type-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2044
Range-diff vs v1:
1: bca83d8ca8 = 1: bca83d8ca8 config: move show_all_config()
3: d9e0424010 ! 2: 93c94a1b25 config: allow format_config() to filter
@@ Metadata
Author: Derrick Stolee <stolee@gmail.com>
## Commit message ##
- config: allow format_config() to filter
+ config: add 'gently' parameter to format_config()
- The format_config() method in builtin/config.c currently only uses
- git_config_*() methods for parsing. This allows parsing errors to result
- in die() messages appropriate with keys in the error message.
-
- In a future change we will want to use format_config() within 'git
- config list' to help format the output, including when --type=<X>
- arguments are provided. When the parsing fails in that case, that
- key-value pair should be omitted instead of causing a failure across the
- entire command.
-
- This change is formatted in such a way that the if/else-if structure
- allows the default die_on_error version to appear first and then be
- followed by the gentle parsing mode immediately afterwards.
-
- The only callers right now have die_on_parse set to 1.
+ This parameter is set to 0 for all current callers and is UNUSED.
+ However, we will start using this option in future changes and in a
+ critical change that requires gentle parsing (not using die()) to try
+ parsing all values in a list.
Signed-off-by: Derrick Stolee <stolee@gmail.com>
## builtin/config.c ##
-@@
- #include "abspath.h"
- #include "config.h"
- #include "color.h"
-+#include "date.h"
- #include "editor.h"
- #include "environment.h"
- #include "gettext.h"
@@ builtin/config.c: struct strbuf_list {
+ * append it into strbuf `buf`. Returns a negative value on failure,
+ * 0 on success, 1 on a missing optional value (i.e., telling the
+ * caller to pretend that <key_,value_> did not exist).
++ *
++ * Note: 'gently' is currently ignored, but will be implemented in
++ * a future change.
*/
static int format_config(const struct config_display_options *opts,
struct strbuf *buf, const char *key_,
- const char *value_, const struct key_value_info *kvi)
+ const char *value_, const struct key_value_info *kvi,
-+ int die_on_parse)
++ int gently UNUSED)
{
if (opts->show_scope)
show_config_scope(opts, kvi, buf);
-@@ builtin/config.c: static int format_config(const struct config_display_options *opts,
- if (opts->show_keys)
- strbuf_addch(buf, opts->key_delim);
-
-- if (opts->type == TYPE_INT)
-+ if (opts->type == TYPE_INT && die_on_parse) {
- strbuf_addf(buf, "%"PRId64,
- git_config_int64(key_, value_ ? value_ : "", kvi));
-- else if (opts->type == TYPE_BOOL)
-+ } else if (opts->type == TYPE_INT) {
-+ int64_t v;
-+ int ret = git_parse_int64(value_, &v);
-+
-+ if (ret)
-+ return -1;
-+
-+ strbuf_addf(buf, "%"PRId64, v);
-+ }
-+ else if (opts->type == TYPE_BOOL && die_on_parse) {
- strbuf_addstr(buf, git_config_bool(key_, value_) ?
- "true" : "false");
-- else if (opts->type == TYPE_BOOL_OR_INT) {
-- int is_bool, v;
-- v = git_config_bool_or_int(key_, value_, kvi,
-- &is_bool);
-+ } else if (opts->type == TYPE_BOOL) {
-+ int value = git_parse_maybe_bool(value_);
-+
-+ if (value < 0)
-+ return -1;
-+
-+ strbuf_addstr(buf, value ? "true" : "false");
-+ } else if (opts->type == TYPE_BOOL_OR_INT && die_on_parse) {
-+ int is_bool = 0;
-+ int v = git_config_bool_or_int(key_, value_, kvi,
-+ &is_bool);
-+ if (is_bool)
-+ strbuf_addstr(buf, v ? "true" : "false");
-+ else
-+ strbuf_addf(buf, "%d", v);
-+ } else if (opts->type == TYPE_BOOL_OR_INT) {
-+ int is_bool = 0;
-+ int v = git_parse_maybe_bool_text(value_);
-+
-+ if (v < 0)
-+ return -1;
-+
- if (is_bool)
- strbuf_addstr(buf, v ? "true" : "false");
- else
- strbuf_addf(buf, "%d", v);
- } else if (opts->type == TYPE_BOOL_OR_STR) {
-+ /* Note: this can't fail to parse! */
- int v = git_parse_maybe_bool(value_);
- if (v < 0)
- strbuf_addstr(buf, value_);
- else
- strbuf_addstr(buf, v ? "true" : "false");
-- } else if (opts->type == TYPE_PATH) {
-+ } else if (opts->type == TYPE_PATH && die_on_parse) {
- char *v;
- if (git_config_pathname(&v, key_, value_) < 0)
- return -1;
-@@ builtin/config.c: static int format_config(const struct config_display_options *opts,
- else
- return 1; /* :(optional)no-such-file */
- free((char *)v);
-- } else if (opts->type == TYPE_EXPIRY_DATE) {
-+ } else if (opts->type == TYPE_PATH) {
-+ char *v;
-+ if (git_parse_maybe_pathname(value_, &v) < 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 && die_on_parse) {
- timestamp_t t;
- if (git_config_expiry_date(&t, key_, value_) < 0)
- return -1;
- strbuf_addf(buf, "%"PRItime, t);
-- } else if (opts->type == TYPE_COLOR) {
-+ } else if (opts->type == TYPE_EXPIRY_DATE) {
-+ timestamp_t t;
-+ if (parse_expiry_date(value_, &t) < 0)
-+ return -1;
-+ strbuf_addf(buf, "%"PRItime, t);
-+ } else if (opts->type == TYPE_COLOR && die_on_parse) {
- char v[COLOR_MAXLEN];
- if (git_config_color(v, key_, value_) < 0)
- return -1;
- strbuf_addstr(buf, v);
-+ } else if (opts->type == TYPE_COLOR) {
-+ char v[COLOR_MAXLEN];
-+ if (color_parse(value_, v) < 0)
-+ return -1;
-+ strbuf_addstr(buf, v);
- } else if (value_) {
- strbuf_addstr(buf, value_);
- } else {
@@ builtin/config.c: static int collect_config(const char *key_, const char *value_,
strbuf_init(&values->items[values->nr], 0);
status = format_config(data->display_opts, &values->items[values->nr++],
- key_, value_, kvi);
-+ key_, value_, kvi, 1);
++ key_, value_, kvi, 0);
if (status < 0)
return status;
if (status) {
@@ builtin/config.c: static int get_value(const struct config_location_options *opt
status = format_config(display_opts, item, key_,
- display_opts->default_value, &kvi);
-+ display_opts->default_value, &kvi, 1);
++ display_opts->default_value, &kvi, 0);
if (status < 0)
die(_("failed to format default config value: %s"),
display_opts->default_value);
@@ builtin/config.c: static int get_urlmatch(const struct config_location_options *
status = format_config(&display_opts, &buf, item->string,
matched->value_is_null ? NULL : matched->value.buf,
- &matched->kvi);
-+ &matched->kvi, 1);
++ &matched->kvi, 0);
if (!status)
fwrite(buf.buf, 1, buf.len, stdout);
strbuf_release(&buf);
5: e27d52c4a5 ! 3: 6d2a48a3b7 config: make 'git config list --type=<X>' work
@@ Commit message
Previously, the --type=<X> argument to 'git config list' was ignored and
did nothing. Now, we add the use of format_config() to the
show_all_config() function so each key-value pair is attempted to be
- parsed.
+ parsed. This is our first use of the 'gently' parameter with a nonzero
+ value.
+
+ When listing multiple values, our initial settings for the output format
+ is different. Add a new init helper to specify the fact that keys should
+ be shown and also add the default delimiters as they were unset in some
+ cases.
If there is an error in parsing, then the row is not output.
@@ Commit message
behavior at all previously, so users can get the behavior they expect by
removing the --type argument or adding the --no-type argument.
+ t1300-config.sh is updated with the current behavior of this formatting
+ logic to justify the upcoming refactoring of format_config() that will
+ incrementally fix some of these cases to be more user-friendly.
+
Signed-off-by: Derrick Stolee <stolee@gmail.com>
## Documentation/git-config.adoc ##
@@ builtin/config.c: static int show_all_config(const char *key_, const char *value
- printf("%s%c%s%c", key_, opts->delim, value_, opts->term);
- else
- printf("%s%c", key_, opts->term);
-+ if (format_config(opts, &formatted, key_, value_, kvi, 0) >= 0)
++ if (format_config(opts, &formatted, key_, value_, kvi, 1) >= 0)
+ fwrite(formatted.buf, 1, formatted.len, stdout);
+
+ strbuf_release(&formatted);
return 0;
}
+@@ builtin/config.c: static void display_options_init(struct config_display_options *opts)
+ }
+ }
+
++static void display_options_init_list(struct config_display_options *opts)
++{
++ opts->show_keys = 1;
++
++ if (opts->end_nul) {
++ display_options_init(opts);
++ } else {
++ opts->term = '\n';
++ opts->delim = ' ';
++ opts->key_delim = '=';
++ }
++}
++
+ static int cmd_config_list(int argc, const char **argv, const char *prefix,
+ struct repository *repo UNUSED)
+ {
+@@ builtin/config.c: static int cmd_config_list(int argc, const char **argv, const char *prefix,
+ check_argc(argc, 0, 0);
+
+ location_options_init(&location_opts, prefix);
+- display_options_init(&display_opts);
++ display_options_init_list(&display_opts);
+
+ setup_auto_pager("config", 1);
+
+@@ builtin/config.c: static int cmd_config_actions(int argc, const char **argv, const char *prefix)
+
+ if (actions == ACTION_LIST) {
+ check_argc(argc, 0, 0);
++ display_options_init_list(&display_opts);
+ if (config_with_options(show_all_config, &display_opts,
+ &location_opts.source, the_repository,
+ &location_opts.options) < 0) {
## t/t1300-config.sh ##
@@ t/t1300-config.sh: done
@@ t/t1300-config.sh: done
number = 10
big = 1M
+path = ~/dir
++red = red
++blue = Blue
++date = Fri Jun 4 15:46:55 2010
EOF
test_expect_success 'identical modern --type specifiers are allowed' '
@@ t/t1300-config.sh: test_expect_success 'unset type specifiers may be reset to co
+ section.big=true
+ EOF
+
-+ git config ${mode_prefix}list --type=bool >actual &&
-+ test_cmp expect actual
++ test_must_fail git config ${mode_prefix}list --type=bool
+'
+
+test_expect_success 'list --type=path shows only canonicalizable path values' '
@@ t/t1300-config.sh: test_expect_success 'unset type specifiers may be reset to co
+ section.number=10
+ section.big=1M
+ section.path=$HOME/dir
++ section.red=red
++ section.blue=Blue
++ section.date=Fri Jun 4 15:46:55 2010
++ EOF
++
++ git config ${mode_prefix}list --type=path >actual 2>err &&
++ test_cmp expect actual &&
++ test_must_be_empty err
++'
++
++test_expect_success 'list --type=expiry-date shows only canonicalizable dates' '
++ cat >expecterr <<-EOF &&
++ error: '\''True'\'' for '\''section.foo'\'' is not a valid timestamp
++ error: '\''~/dir'\'' for '\''section.path'\'' is not a valid timestamp
++ error: '\''red'\'' for '\''section.red'\'' is not a valid timestamp
++ error: '\''Blue'\'' for '\''section.blue'\'' is not a valid timestamp
++ EOF
++
++ git config ${mode_prefix}list --type=expiry-date >actual 2>err &&
++
++ # section.number and section.big parse as relative dates that could
++ # have clock skew in their results.
++ test_grep section.big actual &&
++ test_grep section.number actual &&
++ test_grep "section.date=$(git config --type=expiry-date section.$key)" actual &&
++ test_cmp expecterr err
++'
++
++test_expect_success 'list --type=color shows only canonicalizable color values' '
++ cat >expect <<-EOF &&
++ section.number=<>
++ section.red=<RED>
++ section.blue=<BLUE>
++ EOF
++
++ cat >expecterr <<-EOF &&
++ error: invalid color value: True
++ error: invalid color value: 1M
++ error: invalid color value: ~/dir
++ error: invalid color value: Fri Jun 4 15:46:55 2010
+ EOF
+
-+ git config ${mode_prefix}list --type=path >actual &&
-+ test_cmp expect actual
++ git config ${mode_prefix}list --type=color >actual.raw 2>err &&
++ test_decode_color <actual.raw >actual &&
++ test_cmp expect actual &&
++ test_cmp expecterr err
+'
+
test_expect_success '--type rejects unknown specifiers' '
4: 5601a5a84f ! 4: 2bca4d2316 config: create special init for list mode
@@ Metadata
Author: Derrick Stolee <stolee@gmail.com>
## Commit message ##
- config: create special init for list mode
+ config: format int64s gently
- When listing multiple values, our initial settings for the output format
- is different. Add a new init helper to specify the fact that keys should
- be shown and also add the default delimiters as they were unset in some
- cases.
-
- There are two places, differing by the 'git config list' and 'git config
- --list' modes.
+ Move the logic for formatting int64 config values into a helper method
+ and use gentle parsing when needed.
Signed-off-by: Derrick Stolee <stolee@gmail.com>
## builtin/config.c ##
-@@ builtin/config.c: static void display_options_init(struct config_display_options *opts)
- }
- }
+@@ builtin/config.c: struct strbuf_list {
+ int alloc;
+ };
-+static void display_options_init_list(struct config_display_options *opts)
++static int format_config_int64(struct strbuf *buf,
++ const char *key_,
++ const char *value_,
++ const struct key_value_info *kvi,
++ int gently)
+{
-+ opts->show_keys = 1;
-+
-+ if (opts->end_nul) {
-+ display_options_init(opts);
++ int64_t v = 0;
++ if (gently) {
++ if (git_parse_int64(value_, &v))
++ return -1;
+ } else {
-+ opts->term = '\n';
-+ opts->delim = ' ';
-+ opts->key_delim = '=';
++ /* may die() */
++ v = git_config_int64(key_, value_ ? value_ : "", kvi);
+ }
++
++ strbuf_addf(buf, "%"PRId64, v);
++ return 0;
+}
+
- static int cmd_config_list(int argc, const char **argv, const char *prefix,
- struct repository *repo UNUSED)
+ /*
+ * Format the configuration key-value pair (`key_`, `value_`) and
+ * append it into strbuf `buf`. Returns a negative value on failure,
+@@ builtin/config.c: struct strbuf_list {
+ static int format_config(const struct config_display_options *opts,
+ struct strbuf *buf, const char *key_,
+ const char *value_, const struct key_value_info *kvi,
+- int gently UNUSED)
++ int gently)
{
-@@ builtin/config.c: static int cmd_config_list(int argc, const char **argv, const char *prefix,
- check_argc(argc, 0, 0);
++ int res = 0;
+ if (opts->show_scope)
+ show_config_scope(opts, kvi, buf);
+ if (opts->show_origin)
+@@ builtin/config.c: static int format_config(const struct config_display_options *opts,
+ strbuf_addch(buf, opts->key_delim);
- location_options_init(&location_opts, prefix);
-- display_options_init(&display_opts);
-+ display_options_init_list(&display_opts);
-
- setup_auto_pager("config", 1);
-
-@@ builtin/config.c: static int cmd_config_actions(int argc, const char **argv, const char *prefix)
+ if (opts->type == TYPE_INT)
+- strbuf_addf(buf, "%"PRId64,
+- git_config_int64(key_, value_ ? value_ : "", kvi));
++ res = format_config_int64(buf, key_, value_, kvi, gently);
+ else if (opts->type == TYPE_BOOL)
+ strbuf_addstr(buf, git_config_bool(key_, value_) ?
+ "true" : "false");
+@@ builtin/config.c: static int format_config(const struct config_display_options *opts,
+ }
+ }
+ strbuf_addch(buf, opts->term);
+- return 0;
++ return res;
+ }
- if (actions == ACTION_LIST) {
- check_argc(argc, 0, 0);
-+ display_options_init_list(&display_opts);
- if (config_with_options(show_all_config, &display_opts,
- &location_opts.source, the_repository,
- &location_opts.options) < 0) {
+ static int show_all_config(const char *key_, const char *value_,
-: ---------- > 5: f8e0b8304f config: format bools gently
-: ---------- > 6: 0a428d2ffe config: format bools or ints gently
-: ---------- > 7: 3fec3abbd6 config: format bools or strings in helper
2: 8d3a6a8265 ! 8: fafafc5465 parse: add git_parse_maybe_pathname()
@@ Metadata
## Commit message ##
parse: add git_parse_maybe_pathname()
- This extraction of logic from config.c's git_config_pathname() allows
- for parsing a fully-qualified path from a relative path along with
- validation of the existence of the path without failing with a die().
+ The git_config_pathname() method parses a config value as a path, but
+ always die()s on an error. Move this logic into a gentler parsing
+ algorithm that will return an error value instead of ending the process.
Signed-off-by: Derrick Stolee <stolee@gmail.com>
-: ---------- > 9: d1cfa0c5e1 config: format paths gently
-: ---------- > 10: 9221ca2352 config: format expiry dates gently
-: ---------- > 11: ddf6131ac9 color: add color_parse_gently()
-: ---------- > 12: d14937e6d1 config: format colors gently
-: ---------- > 13: 48fc882785 config: restructure format_config()
--
gitgitgadget
next prev parent reply other threads:[~2026-02-13 23:55 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-10 4:42 [PATCH 0/5] [RFC] Make 'git config list --type=' parse and filter types Derrick Stolee via GitGitGadget
2026-02-10 4:42 ` [PATCH 1/5] config: move show_all_config() Derrick Stolee via GitGitGadget
2026-02-10 4:42 ` [PATCH 2/5] parse: add git_parse_maybe_pathname() Derrick Stolee via GitGitGadget
2026-02-11 12:13 ` Patrick Steinhardt
2026-02-10 4:42 ` [PATCH 3/5] config: allow format_config() to filter Derrick Stolee via GitGitGadget
2026-02-10 5:04 ` Junio C Hamano
2026-02-10 18:12 ` Derrick Stolee
2026-02-10 4:42 ` [PATCH 4/5] config: create special init for list mode Derrick Stolee via GitGitGadget
2026-02-10 4:42 ` [PATCH 5/5] config: make 'git config list --type=<X>' work Derrick Stolee via GitGitGadget
2026-02-11 12:13 ` Patrick Steinhardt
2026-02-11 17:49 ` Derrick Stolee
2026-02-12 6:39 ` Patrick Steinhardt
2026-02-10 4:59 ` [PATCH 0/5] [RFC] Make 'git config list --type=' parse and filter types Junio C Hamano
2026-02-10 18:18 ` Derrick Stolee
2026-02-11 12:13 ` Patrick Steinhardt
2026-02-13 23:55 ` Derrick Stolee via GitGitGadget [this message]
2026-02-13 23:55 ` [PATCH v2 01/13] config: move show_all_config() Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 02/13] config: add 'gently' parameter to format_config() Derrick Stolee via GitGitGadget
2026-02-17 9:04 ` Patrick Steinhardt
2026-02-13 23:55 ` [PATCH v2 03/13] config: make 'git config list --type=<X>' work Derrick Stolee via GitGitGadget
2026-02-17 9:04 ` Patrick Steinhardt
2026-02-17 16:11 ` Junio C Hamano
2026-02-17 16:13 ` Patrick Steinhardt
2026-02-13 23:55 ` [PATCH v2 04/13] config: format int64s gently Derrick Stolee via GitGitGadget
2026-02-14 0:42 ` Junio C Hamano
2026-02-17 9:05 ` Patrick Steinhardt
2026-02-23 3:41 ` Derrick Stolee
2026-02-13 23:55 ` [PATCH v2 05/13] config: format bools gently Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 06/13] config: format bools or ints gently Derrick Stolee via GitGitGadget
2026-02-17 9:05 ` Patrick Steinhardt
2026-02-23 3:25 ` Derrick Stolee
2026-02-13 23:55 ` [PATCH v2 07/13] config: format bools or strings in helper Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 08/13] parse: add git_parse_maybe_pathname() Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 09/13] config: format paths gently Derrick Stolee via GitGitGadget
2026-02-17 9:05 ` Patrick Steinhardt
2026-02-13 23:55 ` [PATCH v2 10/13] config: format expiry dates gently Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 11/13] color: add color_parse_gently() Derrick Stolee via GitGitGadget
2026-02-17 9:05 ` Patrick Steinhardt
2026-02-17 16:20 ` Junio C Hamano
2026-02-23 2:12 ` Derrick Stolee
2026-02-23 5:03 ` Junio C Hamano
2026-02-13 23:55 ` [PATCH v2 12/13] config: format colors gently Derrick Stolee via GitGitGadget
2026-02-13 23:55 ` [PATCH v2 13/13] config: restructure format_config() Derrick Stolee via GitGitGadget
2026-02-17 9:05 ` Patrick Steinhardt
2026-02-23 12:26 ` [PATCH v3 00/13] Make 'git config list --type=' parse and filter types Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 01/13] config: move show_all_config() Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 02/13] config: add 'gently' parameter to format_config() Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 03/13] config: make 'git config list --type=<X>' work Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 04/13] config: format int64s gently Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 05/13] config: format bools gently Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 06/13] config: format bools or ints gently Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 07/13] config: format bools or strings in helper Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 08/13] config: format paths gently Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 09/13] config: format expiry dates quietly Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 10/13] color: add color_parse_quietly() Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 11/13] config: format colors quietly Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 12/13] config: restructure format_config() Derrick Stolee via GitGitGadget
2026-02-23 12:26 ` [PATCH v3 13/13] config: use an enum for type Derrick Stolee via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2044.v2.git.1771026918.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jn.avila@free.fr \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=phillip.wood123@gmail.com \
--cc=ps@pks.im \
--cc=sandals@crustytoothpaste.net \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox