Re: [PATCH/RFC 3/4] config: read global scope via config_sequence
From: Junio C Hamano <hidden>
Date: 2025-11-19 18:39:34
"Delilah Ashley Wu via GitGitGadget" [off-list ref] writes:
From: Delilah Ashley Wu <redacted> The output of `git config list --global` should include both the home (`$HOME/.gitconfig`) and XDG (`$XDG_CONFIG_HOME/git/config`) configs, but it only reads from the former.
", but" -> "to match the information given by the command without --global, but".
This patch introduces a regression. If both global config files are unreadable, then `git config list --global` should exit non-zero. This is no longer the case, so mark the corresponding test as a "TODO known breakage" and address the issue in the next patch, config: keep bailing on unreadable global files.
That is rather unfortunate, as we do try hard to avoid deliberate regressions in our history. The reason why this step cannot be done without first introducing a regression is...? If the reason is "it would make a single patch too big", perhaps we can do it in two steps, one preliminary "git_config_sequence() learns an extra barf-if-no-input parameter that causes it to return error if no files in the specified sequence exists" step, followed by this change that starts using git_config_sequence() to handle "--global", which uses that new flag to ensure that there won't be a regression?
if (opts->use_global_config) {
+ /*
+ * Since global config is sourced from more than one location,
+ * use `config.c#do_git_config_sequence()` with `opts->options`
+ * to read it. 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;
+ opts->source.scope = CONFIG_SCOPE_GLOBAL;Very nicely done. Thanks.