From: Junio C Hamano <gitster@pobox.com>
To: Delilah Ashley Wu <delilahwu@linux.microsoft.com>
Cc: git@vger.kernel.org, Nils Fahldieck <nils@fahldieck.de>,
Patrick Steinhardt <ps@pks.im>,
Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
Delilah Ashley Wu <delilahwu@microsoft.com>,
Derrick Stolee <stolee@gmail.com>,
Ben Knoble <ben.knoble@gmail.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Jade Lovelace <lists@jade.fyi>, Glen Choo <glencbz@gmail.com>
Subject: Re: [PATCH v2 3/3] config: read global scope via config_sequence
Date: Wed, 26 Aug 2026 11:38:03 -0700 [thread overview]
Message-ID: <xmqqse40g22c.fsf@gitster.g> (raw)
In-Reply-To: <20260823-fix-config-list-global-home-and-xdg-v2-3-b29cc63f017b@microsoft.com> (Delilah Ashley Wu's message of "Sun, 23 Aug 2026 20:28:28 +1000")
Delilah Ashley Wu <delilahwu@linux.microsoft.com> writes:
> if (opts->use_global_config) {
> + /*
> + * Since global config is sourced from more than one location,
> + * read it using `do_git_config_sequence()` with other scopes
> + * ignored. However, writing global config should point to a
> + * single destination, set in `opts->source.file`.
> + */
> + opts->options.ignore_repo = 1;
> + opts->options.ignore_cmdline = 1;
> + opts->options.ignore_worktree = 1;
> + opts->options.ignore_system = 1;
We used to use ignore_repo, ignore_worktree, and ignore_cmdline
members in the config_options, but to ignore system configuration,
we relied on git_config_system() that checks GIT_CONFIG_NOSYSTEM
environment variable, and there was no way to ignore per-user
configuration. From that point of view, I find it sensible to make
config_options the primary way to configure which parts of the
configuration sequence is disabled.
But then we should go one step further, shouldn't we? Either teach
git_config_system() to take config_options struct and pay attention
to .ignore_system member in it, or get rid of git_config_system()
and have the current users of that function take config_options and
pay attention to its .ignore_system member, so that we do not have
to write an ugly conditional like this one:
> - if (git_config_system() && system_config &&
> + if (!opts->ignore_system && git_config_system() && system_config &&
> + if (!opts->ignore_global) {
It is a bit misleading that this conditional is always taken. No
caller will tell this function to skip the per-user configuration.
> + git_global_config_paths(&user_config, &xdg_config);
> + if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK))
> + attempt_git_config_from_file_with_options(fn, xdg_config,
> + data,
> + CONFIG_SCOPE_GLOBAL,
> + NULL, &success_count, &ret);
> + if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK))
> + attempt_git_config_from_file_with_options(fn, user_config,
> + data,
> + CONFIG_SCOPE_GLOBAL,
> + NULL, &success_count, &ret);
> +
> + free(xdg_config);
> + free(user_config);
> + }
> @@ -1624,8 +1629,6 @@ static int do_git_config_sequence(const struct config_options *opts,
> die(_("unable to parse command-line config"));
>
> free(system_config);
> - free(xdg_config);
> - free(user_config);
> free(repo_config);
> free(worktree_config);
>
> @@ -1659,7 +1662,8 @@ int config_with_options(config_fn_t fn, void *data,
> */
> if (config_source && config_source->use_stdin) {
> ret = git_config_from_stdin(fn, data, config_source->scope);
> - } else if (config_source && config_source->file) {
> + } else if (config_source && config_source->file &&
> + config_source->scope != CONFIG_SCOPE_GLOBAL) {
> ret = git_config_from_file_with_options(fn, config_source->file,
> data, config_source->scope,
> NULL);
> @@ -1667,7 +1671,8 @@ int config_with_options(config_fn_t fn, void *data,
> ret = git_config_from_blob_ref(fn, repo, config_source->blob,
> data, config_source->scope);
> } else {
> - ret = do_git_config_sequence(opts, repo, fn, data, 0);
> + ret = do_git_config_sequence(opts, repo, fn, data,
> + config_source && config_source->scope == CONFIG_SCOPE_GLOBAL);
> }
+100 column wide columns? Please don't.
This sequence is a bit hard to read. Instead of piggybacking on the
existing call to do the READL sequencing, add a new "else if" clause
to deal specifically with the global case to the cascade would make
the result easier to follow, I suspect. Something like this fix-up
on top of this patch, perhaps.
config.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git c/config.c w/config.c
index acad89102d..bf77f847c3 100644
--- c/config.c
+++ w/config.c
@@ -1663,7 +1663,9 @@ int config_with_options(config_fn_t fn, void *data,
if (config_source && config_source->use_stdin) {
ret = git_config_from_stdin(fn, data, config_source->scope);
} else if (config_source && config_source->file &&
- config_source->scope != CONFIG_SCOPE_GLOBAL) {
+ config_source->scope == CONFIG_SCOPE_GLOBAL) {
+ ret = do_git_config_sequence(opts, repo, fn, data, 1);
+ } else if (config_source && config_source->file) {
ret = git_config_from_file_with_options(fn, config_source->file,
data, config_source->scope,
NULL);
@@ -1671,8 +1673,7 @@ int config_with_options(config_fn_t fn, void *data,
ret = git_config_from_blob_ref(fn, repo, config_source->blob,
data, config_source->scope);
} else {
- ret = do_git_config_sequence(opts, repo, fn, data,
- config_source && config_source->scope == CONFIG_SCOPE_GLOBAL);
+ ret = do_git_config_sequence(opts, repo, fn, data, 0);
}
if (inc.remote_urls) {
next prev parent reply other threads:[~2026-08-26 18:38 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-10 1:14 [PATCH/RFC 0/4] config: read both home and xdg files for --global Delilah Ashley Wu via GitGitGadget
2025-10-10 1:14 ` [PATCH/RFC 1/4] cleanup_path: force forward slashes on Windows Delilah Ashley Wu via GitGitGadget
2025-11-19 17:47 ` Junio C Hamano
2025-10-10 1:14 ` [PATCH/RFC 2/4] config: test home and xdg files in `list --global` Delilah Ashley Wu via GitGitGadget
2025-11-19 18:29 ` Junio C Hamano
2025-10-10 1:14 ` [PATCH/RFC 3/4] config: read global scope via config_sequence Delilah Ashley Wu via GitGitGadget
2025-11-19 18:39 ` Junio C Hamano
2025-10-10 1:14 ` [PATCH/RFC 4/4] config: keep bailing on unreadable global files Delilah Ashley Wu via GitGitGadget
2025-10-10 1:27 ` [PATCH/RFC 0/4] config: read both home and xdg files for --global Kristoffer Haugsbakk
2025-11-22 1:36 ` Delilah Ashley Wu
2026-01-20 20:41 ` Junio C Hamano
2025-11-17 13:29 ` Johannes Schindelin
2025-11-18 0:28 ` Junio C Hamano
2025-11-19 14:44 ` Junio C Hamano
2025-11-22 2:00 ` Delilah Ashley Wu
2026-08-23 10:28 ` [PATCH v2 0/3] " Delilah Ashley Wu
2026-08-23 10:28 ` [PATCH v2 1/3] path: use forward slashes in XDG config on Windows Delilah Ashley Wu
2026-08-26 17:58 ` Junio C Hamano
2026-08-23 10:28 ` [PATCH v2 2/3] config: let sequence require a successful file Delilah Ashley Wu
2026-08-26 18:20 ` Junio C Hamano
2026-08-23 10:28 ` [PATCH v2 3/3] config: read global scope via config_sequence Delilah Ashley Wu
2026-08-26 18:38 ` Junio C Hamano [this message]
2026-08-23 12:36 ` [PATCH v2 0/3] config: read both home and xdg files for --global Chris Torek
2026-08-24 1:32 ` Junio C Hamano
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=xmqqse40g22c.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=ben.knoble@gmail.com \
--cc=delilahwu@linux.microsoft.com \
--cc=delilahwu@microsoft.com \
--cc=git@vger.kernel.org \
--cc=glencbz@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=lists@jade.fyi \
--cc=nils@fahldieck.de \
--cc=ps@pks.im \
--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