All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Huynh Khoi Nguyen NGUYEN  <Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
Cc: git@vger.kernel.org, Matthieu.Moy@grenoble.inp.fr,
	NGUYEN Huynh Khoi Nguyen <nguyenhu@ensibm.imag.fr>,
	Lucien KONG <Lucien.Kong@ensimag.imag.fr>,
	Valentin DUPERRAY <Valentin.Duperray@ensimag.imag.fr>,
	Thomas NGUY <Thomas.Nguy@ensimag.imag.fr>,
	Franck JONAS <Franck.Jonas@ensimag.imag.fr>
Subject: Re: [PATCHv2] Possibility to read both from ~/.gitconfig and from $XDG_CONFIG_HOME/git/config
Date: Wed, 30 May 2012 14:54:46 -0700	[thread overview]
Message-ID: <7vr4u1xrkp.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <1338412775-22840-1-git-send-email-Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr> (Huynh Khoi Nguyen NGUYEN's message of "Wed, 30 May 2012 23:19:35 +0200")

Huynh Khoi Nguyen NGUYEN  <Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
writes:

> From: NGUYEN Huynh Khoi Nguyen <nguyenhu@ensibm.imag.fr>
>
> Git will read both in $XDG_CONFIG_HOME/git/config and in ~/.gitconfig in this order:
> .git/config > ~/.gitconfig > $XDG_CONFIG_HOME/git/config > /etc/gitconfig
> If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/config will be used.

Is it just me who finds the above three lines extremely unreadable?

Also can you give this patch a bit more sensible title?
"Possibility to" does not tell us much---anything is possible if you
change code after all.

I see the patch does not touch the writing codepath, which is
probably a good thing, but the log message should explicitly state
that.

> @@ -194,7 +194,7 @@ See also <<FILES>>.
>  FILES
>  -----
>  
> -If not set explicitly with '--file', there are three files where
> +If not set explicitly with '--file', there are four files where
>  'git config' will search for configuration options:
>  
>  $GIT_DIR/config::
> @@ -204,6 +204,9 @@ $GIT_DIR/config::
>  	User-specific configuration file. Also called "global"
>  	configuration file.
>  
> +$XDG_CONFIG_HOME/git/config::
> +	Second user-specific configuration file. ~/.gitconfig has priority.
> +

I am not sure in what way $HOME/.gitconfig has "priority".

Your proposed log message says that You read from $HOME/.gitconfig
and then from $XDG_CONFIG_HOME/git/config, which means that any
single-valued variable set in $HOME/.gitconfig will be overwritten
by whatever is in $XDG_CONFIG_HOME/git/config, no?  That sounds like
you are giving priority to the latter to me.

And for multi-valued variables, settings from both files are read,
so there isn't much inherent priority between the two, except for
variables for which the definition order matters, of course.

If you read only from $HOME/.gitconfig if exists, and read from
$XDG_CONFIG_HOME/git/config only when $HOME/.gitconfig does not,
then you are giving $HOME/.gitconfig a priority, but that is not
what the patch is doing as far as I can tell.

> diff --git a/builtin/config.c b/builtin/config.c
> index 33c8820..38dba4f 100644
> --- a/builtin/config.c
> +++ b/builtin/config.c
> @@ -161,7 +161,7 @@ static int show_config(const char *key_, const char *value_, void *cb)
>  static int get_value(const char *key_, const char *regex_)
>  {
>  	int ret = -1;
> -	char *global = NULL, *repo_config = NULL;
> +	char *gitconfig_global = NULL, *xdg_global = NULL, *repo_config = NULL;
>  	const char *system_wide = NULL, *local;
>  	struct config_include_data inc = CONFIG_INCLUDE_INIT;
>  	config_fn_t fn;
> @@ -171,8 +171,15 @@ static int get_value(const char *key_, const char *regex_)
>  	if (!local) {
>  		const char *home = getenv("HOME");
>  		local = repo_config = git_pathdup("config");
> -		if (home)
> -			global = xstrdup(mkpath("%s/.gitconfig", home));
> +		if (home) {
> +			const char *xdg_config_home = getenv("XDG_CONFIG_HOME");
> +			if (xdg_config_home)

This is logically wrong; even when you fail to read $HOME, you may
be able to read $XDG_CONFIG_HOME, no?  It shouldn't be nested inside
"if (home)" at all, methinks.

It would be more like

	global = xdg_global = NULL;
        if (HOME exists?)
        	global = $HOME/.gitconfig
	if (XDG_CONFIG_HOME exists?)
        	xdg_global = $XDG_CONFIG_HOME/git/config
	else if (HOME exists?)
        	xdg_global = $HOME/.config/git/config

no?

> @@ -381,7 +393,25 @@ int cmd_config(int argc, const char **argv, const char *prefix)
>  	if (use_global_config) {
>  		char *home = getenv("HOME");
>  		if (home) {
> -			char *user_config = xstrdup(mkpath("%s/.gitconfig", home));
> +			char *user_config;
> +			const char *gitconfig_path = mkpath("%s/.gitconfig", home);
> +			const char *xdg_config_path = NULL;
> +			const char *xdg_config_home = NULL;
> +
> +			xdg_config_home = getenv("XDG_CONFIG_HOME");
> +			if (xdg_config_home)
> +				xdg_config_path = mkpath("%s/git/config", xdg_config_home);
> +			else
> +				xdg_config_path = mkpath("%s/.config/git/config", home);
> +
> +			if (access(gitconfig_path, R_OK) && !access(xdg_config_path, R_OK) &&
> +			    (actions == ACTION_LIST ||
> +			     actions == ACTION_GET_COLOR ||
> +			     actions == ACTION_GET_COLORBOOL))
> +				user_config = xstrdup(xdg_config_path);
> +			else
> +				user_config = xstrdup(gitconfig_path);
> +
>  			given_config_file = user_config;
>  		} else {
>  			die("$HOME not set");

Exactly the same comment applies here.

You seem to always write to $HOME/.gitconfig, so missing $HOME may
be an error if the action is to store, but if you are reading and if
$XDG_CONFIG_HOME is set, you do not have to have $HOME set, no?
Even when there is $HOME, if there is no $HOME/.gitconfig file, you
wouldn't want to give an error, so missing $HOME environment should
be treated pretty much the same way as missing $HOME/.gitconfig file
for the purpose of reading, no?

> diff --git a/config.c b/config.c
> index 71ef171..53557dc 100644
> --- a/config.c
> +++ b/config.c
> @@ -939,10 +939,23 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
>  
>  	home = getenv("HOME");
>  	if (home) {
> -		char buf[PATH_MAX];
> -		char *user_config = mksnpath(buf, sizeof(buf), "%s/.gitconfig", home);
> -		if (!access(user_config, R_OK)) {
> -			ret += git_config_from_file(fn, user_config, data);
> +		const char *gitconfig_path = xstrdup(mkpath("%s/.gitconfig", home));
> +		const char *xdg_config_path = NULL;
> +		const char *xdg_config_home = NULL;
> +
> +		xdg_config_home = getenv("XDG_CONFIG_HOME");
> +		if (xdg_config_home)
> +			xdg_config_path = xstrdup(mkpath("%s/git/config", xdg_config_home));
> +		else
> +			xdg_config_path = xstrdup(mkpath("%s/.config/git/config", home));

Exactly the same comment applies here, too.

The original that read from $HOME/.gitconfig was simple enough so
having three copies of getenv("HOME") was perfectly fine, but as you
are introduce this much complexity to to decide which two files to
read from, the code added this patch needs to be refactored and
three copies of the same logic need to be consolidated, I would have
to say.

  reply	other threads:[~2012-05-30 21:54 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1338400509-26087-1-git-send-email-Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
2012-05-30 21:19 ` [PATCHv2] Possibility to read both from ~/.gitconfig and from $XDG_CONFIG_HOME/git/config Huynh Khoi Nguyen NGUYEN
2012-05-30 21:54   ` Junio C Hamano [this message]
2012-05-31 22:06     ` Ramsay Jones
2012-05-31 14:40   ` [PATCHv3] Read from XDG configuration file, not write Huynh Khoi Nguyen NGUYEN
2012-05-31 20:13     ` Junio C Hamano
2012-06-01 21:23     ` [PATCHv4] Read (but not write) from XDG configuration, XDG attributes and XDG ignore files Huynh Khoi Nguyen NGUYEN
2012-06-02 11:20       ` Matthieu Moy
2012-06-02 15:52         ` nguyenhu
2012-06-02 21:05           ` Matthieu Moy
2012-06-03 20:14       ` [PATCHv5 1/4] Read (but not write) from $XDG_CONFIG_HOME/git/config file Huynh Khoi Nguyen NGUYEN
2012-06-03 20:14         ` [PATCHv5 2/4] Let core.excludesfile default to $XDG_CONFIG_HOME/git/ignore Huynh Khoi Nguyen NGUYEN
2012-06-04 11:43           ` Matthieu Moy
2012-06-05 13:17             ` nguyenhu
2012-06-03 20:14         ` [PATCHv5 3/4] Let core.attributesfile default to $XDG_CONFIG_HOME/git/attributes Huynh Khoi Nguyen NGUYEN
2012-06-03 20:14         ` [PATCHv5 4/4] Write to $XDG_CONFIG_HOME/git/config file Huynh Khoi Nguyen NGUYEN
2012-06-04 21:17           ` Matthieu Moy
2012-06-05 13:04             ` nguyenhu
2012-06-06 13:21         ` [PATCHv6 1/4] Read (but not write) from " Huynh Khoi Nguyen NGUYEN
2012-06-06 13:21           ` [PATCHv6 2/4] Let core.excludesfile default to $XDG_CONFIG_HOME/git/ignore Huynh Khoi Nguyen NGUYEN
2012-06-07 23:31             ` Junio C Hamano
2012-06-08  8:47               ` Matthieu Moy
2012-06-08  9:02               ` nguyenhu
2012-06-06 13:21           ` [PATCHv6 3/4] Let core.attributesfile default to $XDG_CONFIG_HOME/git/attributes Huynh Khoi Nguyen NGUYEN
2012-06-06 13:21           ` [PATCHv6 4/4] Write to $XDG_CONFIG_HOME/git/config file Huynh Khoi Nguyen NGUYEN
2012-06-09  3:48             ` David Aguilar
2012-06-09  6:19               ` Junio C Hamano
2012-06-09 17:25                 ` David Aguilar
2012-06-10 13:21                 ` Matthieu Moy
2012-06-11 23:45                   ` nguyenhu
2012-06-07 22:58           ` [PATCHv6 1/4] Read (but not write) from " Junio C Hamano
2012-06-08  9:57             ` nguyenhu
2012-06-12 17:42               ` Ramsay Jones
2012-06-08 12:26             ` nguyenhu
2012-06-08 12:33               ` Erik Faye-Lund
2012-06-08 12:54                 ` nguyenhu
2012-06-08 12:57                   ` Erik Faye-Lund
2012-06-08 15:08               ` Junio C Hamano
2012-06-09 10:53                 ` nguyenhu
2012-06-10  6:41                   ` Junio C Hamano
2012-06-10 13:48                     ` nguyenhu
2012-06-10 18:44                       ` Erik Faye-Lund
2012-06-10 20:02                         ` nguyenhu
2012-06-10 20:27                           ` Erik Faye-Lund
2012-06-11 15:50                         ` Junio C Hamano
2012-06-11 16:53                           ` nguyenhu
2012-06-11 22:59                             ` nguyenhu
2012-06-11 23:03                             ` Erik Faye-Lund
2012-06-12  2:49           ` [PATCHv7 " Huynh Khoi Nguyen Nguyen
2012-06-12  2:49             ` [PATCHv7 2/4] Let core.excludesfile default to $XDG_CONFIG_HOME/git/ignore Huynh Khoi Nguyen Nguyen
2012-06-12  2:49             ` [PATCHv7 3/4] Let core.attributesfile default to $XDG_CONFIG_HOME/git/attributes Huynh Khoi Nguyen Nguyen
2012-06-12  2:49             ` [PATCHv7 4/4] Write to $XDG_CONFIG_HOME/git/config file Huynh Khoi Nguyen Nguyen
2012-06-14 17:31             ` [PATCHv7 1/4] Read (but not write) from " Ramsay Jones
2012-06-21 16:55             ` Matthieu Moy
2012-06-21 17:22               ` Junio C Hamano
2012-06-22  9:03                 ` [PATCH 0/4 v8] Git configuration directory Matthieu Moy
2012-06-22  9:03                   ` [PATCH 1/4 v8] config: read (but not write) from $XDG_CONFIG_HOME/git/config file Matthieu Moy
2012-07-12  7:55                     ` Thomas Rast
2012-07-12 12:04                       ` [PATCH] config: fix several access(NULL) calls Matthieu Moy
2012-07-12 12:39                         ` Thomas Rast
2012-07-12 17:14                         ` Junio C Hamano
2012-07-12 19:34                           ` Matthieu Moy
2012-07-12 20:12                             ` Junio C Hamano
2012-07-13  8:48                               ` Matthieu Moy
2012-07-13  8:59                                 ` [PATCH v2] " Matthieu Moy
2012-07-13 13:00                                 ` [PATCH] " Jeff King
2012-07-13 13:15                                   ` Matthieu Moy
2012-07-13 14:05                                     ` Thomas Rast
2012-07-13 14:23                                       ` Matthieu Moy
2012-07-13 16:49                                         ` Junio C Hamano
2012-07-16  9:45                                           ` Matthieu Moy
2012-07-16 16:35                                             ` Junio C Hamano
2012-07-16 16:39                                               ` Matthieu Moy
2012-07-16 16:56                                                 ` Junio C Hamano
2012-06-22  9:03                   ` [PATCH 2/4 v8] Let core.excludesfile default to $XDG_CONFIG_HOME/git/ignore Matthieu Moy
2012-06-22  9:03                   ` [PATCH 3/4 v8] Let core.attributesfile " Matthieu Moy
2012-06-22 21:20                     ` Junio C Hamano
2012-06-25  6:32                       ` Matthieu Moy
2012-06-25  7:22                         ` Junio C Hamano
2012-06-25  7:56                           ` Matthieu Moy
2012-06-22  9:03                   ` [PATCH 4/4 v8] config: write to $XDG_CONFIG_HOME/git/config file if appropriate Matthieu Moy
2012-06-22 21:20                     ` Junio C Hamano
2012-06-25  6:45                       ` Matthieu Moy
2012-06-25 18:08                         ` Junio C Hamano
2012-06-22 21:19                   ` [PATCH 0/4 v8] Git configuration directory Junio C Hamano
2012-06-04 17:54       ` [PATCHv4] Read (but not write) from XDG configuration, XDG attributes and XDG ignore files Ramsay Jones
2012-06-04 18:41         ` Junio C Hamano
2012-06-12 17:32           ` Ramsay Jones
2012-06-05 12:19         ` nguyenhu
2012-05-31  8:46 [PATCHv2] Possibility to read both from ~/.gitconfig and from $XDG_CONFIG_HOME/git/config nguyenhu
2012-06-01 19:49 nguyenhu
2012-06-04 17:27 ` Ramsay Jones

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=7vr4u1xrkp.fsf@alter.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=Franck.Jonas@ensimag.imag.fr \
    --cc=Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr \
    --cc=Lucien.Kong@ensimag.imag.fr \
    --cc=Matthieu.Moy@grenoble.inp.fr \
    --cc=Thomas.Nguy@ensimag.imag.fr \
    --cc=Valentin.Duperray@ensimag.imag.fr \
    --cc=git@vger.kernel.org \
    --cc=nguyenhu@ensibm.imag.fr \
    /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.