git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
	sschuberth@gmail.com, Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Subject: Re: [PATCH v5 1/1] config: add conditional include
Date: Thu, 23 Feb 2017 11:59:08 -0800	[thread overview]
Message-ID: <xmqqwpcg7k6r.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20170223122346.12222-2-pclouds@gmail.com> ("Nguyễn Thái Ngọc Duy"'s message of "Thu, 23 Feb 2017 19:23:46 +0700")

Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:

>> There was some discussion after v4. I think the open issues are:
>>
>>   - the commit message is rather terse (it should describe motivation,
>>     and can refer to the docs for the "how")

> This allows some more flexibility in managing configuration across
> repositories. 

That is not an ideal opening to describe motivation without people
knowing what "this" is ;-) Of course, the person who wrote the
sentence know it already after writing the patch and the subject,
but others don't.

	Sometimes a set of repositories want to share configuration
	settings among themselves that are distinct from other such
	sets of repositories.  A user may work on two projects, each
	of which have multiple repositories, and use one user.email
	for one project while using another for the other.  Having
	the settings in ~/.gitconfig, which would work for just one
	set of repositories, would not well in such a situation.

	Extend the include.path mechanism that lets a config file
	include another config file, so that the inclusion can be
	done only when some conditions hold.  Then ~/.gitconfig can
	say "include config-project-A only when working on project-A"
        for each project A the user works on.

        In this patch, the only supported grouping is based on
        $GIT_DIR (in absolute path), so you would need to group
        repositories by directory, or something like that to take
        advantage of it.

        We already have include.path for unconditional
        includes. This patch goes with include-if.xxx.path to make
        it clearer that a condition is required.

        Similar to include.path, older git versions that don't
        understand include-if will simply ignore them.

or something along that line?

> +Conditional includes
> +~~~~~~~~~~~~~~~~~~~~
> +
> +You can include one config file from another conditionally by setting
> +a special `include-if.<condition>.path` variable to the name of the
> +file to be included. The variable is treated the same way as
> +`include.path`.

Drop "special", as all configuration variables are "special" in their
own sense, it does not add any useful information.

I think we avoid '-' in Git-native variable and section names, so
"include-if" would become an odd-man-out.

The variable is obviously not treated the same way as include.path ;-)

    When includeIf.<condition>.path variable is set in a
    configuration file, the configuration file named by that
    variable is included (in a way similar to how include.path
    works) only if the <condition> holds true.

> +The condition starts with a keyword, followed by a colon and a
> +pattern. The interpretation of the pattern depends on the keyword.

"a pattern"?  I think it is "some data whose format and meaning
depends on the keyword".

Hence...

> +Supported keywords are:
> +
> +`gitdir`::
> +	The environment variable `GIT_DIR` must match the following
> +	pattern for files to be included. The pattern can contain

	The data that follows the keyword `gitdir:` is used as a
	glob pattern.  If the location of the .git directory (which
	may be auto-discovered, or come from `GIT_DIR` environment
	variable) match the pattern, the `<condition>` becomes true.

> + ...
> + * If the pattern ends with `/`, `**` will be automatically added. For
> +   example, the pattern `foo/` becomes `foo/**`. In other words, it
> +   matches "foo" and everything inside, recursively.
> +
> +`gitdir/i`::
> +	This is the same as `gitdir` except that matching is done
> +	case-insensitively (e.g. on case-insensitive file sytems)
> +
> +A few more notes on matching:

As future <keywords> may not be about path or matching at all, this
belongs to `gitdir`:: section (and it would be obvious that that
applies to `gitdir/i`:: because we say "this is the same as...").

> + * Symlinks in `$GIT_DIR` are not resolved before matching.
> +
> + * Note that "../" is not special and will match literally, which is
> +   unlikely what you want.

> +static int prepare_include_condition_pattern(struct strbuf *pat)
> +{
> +	struct strbuf path = STRBUF_INIT;
> +	int prefix = 0;
> +
> +	/* TODO: maybe support ~user/ too */
> +	if (pat->buf[0] == '~' && is_dir_sep(pat->buf[1])) {
> +		const char *home = getenv("HOME");
> +
> +		if (!home)
> +			return error(_("$HOME is not defined"));

Instead of half-duplicating it here yourself, can't we let
expand_user_path() do its thing?

> +static int include_condition_is_true(const char *cond, size_t cond_len)
> +{
> +	/* no condition (i.e., "include.path") is always true */
> +	if (!cond)
> +		return 1;
> +
> +	if (skip_prefix_mem(cond, cond_len, "gitdir:", &cond, &cond_len))
> +		return include_by_gitdir(cond, cond_len, 0);
> +	else if (skip_prefix_mem(cond, cond_len, "gitdir/i:", &cond, &cond_len))
> +		return include_by_gitdir(cond, cond_len, 1);

This may be OK for now, but it should be trivial to start from a
table with two entries, i.e.

	struct include_cond {
		const char *keyword;
		int (*fn)(const char *, size_t);
	};

and will show a better way to do things to those who follow your
footsteps.


  reply	other threads:[~2017-02-23 19:59 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-23 12:23 [PATCH v5 0/1] Conditional config include Nguyễn Thái Ngọc Duy
2017-02-23 12:23 ` [PATCH v5 1/1] config: add conditional include Nguyễn Thái Ngọc Duy
2017-02-23 19:59   ` Junio C Hamano [this message]
2017-02-24  9:37     ` Duy Nguyen
2017-02-24 17:46       ` Junio C Hamano
2017-02-26  6:07         ` Jeff King
2017-02-27 18:42           ` Junio C Hamano
2017-03-06 22:44   ` Stefan Beller
2017-03-07  8:47     ` Jeff King
2017-03-07 18:39       ` Stefan Beller
2017-02-24 13:14 ` [PATCH v6 0/1] Conditional config include Nguyễn Thái Ngọc Duy
2017-02-24 13:14   ` [PATCH v6 1/1] config: add conditional include Nguyễn Thái Ngọc Duy
2017-02-24 18:35     ` Junio C Hamano
2017-02-24 19:48     ` Ramsay Jones
2017-02-24 22:08     ` Philip Oakley
2017-02-26  3:02       ` Duy Nguyen
2017-02-26 12:27         ` Philip Oakley
2017-02-24 13:14   ` [PATCH v6 0/1] Conditional config include Nguyễn Thái Ngọc Duy
2017-02-24 13:18     ` Duy Nguyen
2017-02-24 13:14   ` [PATCH v6 1/1] config: add conditional include Nguyễn Thái Ngọc Duy
2017-02-26  6:12     ` Jeff King
2017-03-01 11:26   ` [PATCH v7 0/3] Conditional config include Nguyễn Thái Ngọc Duy
2017-03-01 11:26     ` [PATCH v7 1/3] config.txt: clarify multiple key values in include.path Nguyễn Thái Ngọc Duy
2017-03-01 17:40       ` Junio C Hamano
2017-03-01 11:26     ` [PATCH v7 2/3] config.txt: reflow the second include.path paragraph Nguyễn Thái Ngọc Duy
2017-03-01 11:26     ` [PATCH v7 3/3] config: add conditional include Nguyễn Thái Ngọc Duy
2017-03-01 17:16       ` Ramsay Jones
2017-03-01 17:47       ` Junio C Hamano
2017-03-03  6:30         ` Jeff King
2017-03-03 19:05           ` Junio C Hamano
2017-03-03 22:24             ` Jeff King
2017-03-01 17:52     ` [PATCH v7 0/3] Conditional config include Junio C Hamano
2017-03-03  6:33     ` Jeff King
2017-03-03  9:52       ` Duy Nguyen
2017-03-03 19:13         ` Junio C Hamano
2017-03-03 21:08         ` Junio C Hamano
2017-03-03 18:24       ` Junio C Hamano
2017-03-03 22:22         ` Jeff King
2017-03-03 23:22           ` 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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqwpcg7k6r.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=git@vger.kernel.org \
    --cc=pclouds@gmail.com \
    --cc=peff@peff.net \
    --cc=sschuberth@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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).