All of lore.kernel.org
 help / color / mirror / Atom feed
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) {

  reply	other threads:[~2026-08-26 18:38 UTC|newest]

Thread overview: 25+ 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-09-10  4:48       ` Delilah Ashley Wu
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.