git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Support environment variables in config file

From
MLMatthias Lederhofer <matled@gmx.net>
Date
Jun 4, 2007, 05:34 UTC
Message-ID
<20070604053443.GA15148@moooo.ath.cx>
In-Reply-To
<20070603223727.GA16637@admingilde.org>
Martin Waitz <tali@admingilde.org> wrote:
> Environment variables (e.g. $HOME) can be helpful for the GIT configuration.
> With this change you can use them with the normal shell "$" syntax.
> If you want to insert a plain "$" in a variable, it can be escaped as \$
> or put inside quotes (").

Perhaps we should also allow variable interpolation in double quoted strings as this is quite common in various languages.

Show 13 quoted lines
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 5868d58..042a354 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -65,17 +65,24 @@ a string, an integer, or a boolean.  Boolean values may be given as yes/no,
>  converting value to the canonical form using '--bool' type specifier;
>  `git-config` will ensure that the output is "true" or "false".
>  
> +You can use the $VARIABLE shell syntax to use environment variables
> +in the configuration file.  All alpha-numeric characters after the
> +leading '`$`' will be interpreted as name of an environment variable
> +and the value of this variable will be used instead.
> +If the variable does not exist it will be treated as an empty string.

We could have a short example here how to concatenate a variable and a string without a space in between. I came up with '$FOO""bar' which is not that obvious imo.

Show 16 quoted lines
> diff --git a/config.c b/config.c
> index 0614c2b..058c0df 100644
> --- a/config.c
> +++ b/config.c
> @@ -43,12 +43,27 @@ static int get_next_char(void)
>  static char *parse_value(void)
>  {
>  	static char value[1024];
> -	int quote = 0, comment = 0, len = 0, space = 0;
> +	int quote = 0, comment = 0, envvar = -1, len = 0, space = 0;
>  
>  	for (;;) {
>  		int c = get_next_char();
>  		if (len >= sizeof(value))
>  			return NULL;
> +		if ((envvar >= 0) && !isalnum(c)) {
You should allow at least underscores in environment variables too.
Show 22 quoted lines
> diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
> index 3f3fd2d..eb84437 100755
> --- a/t/t1300-repo-config.sh
> +++ b/t/t1300-repo-config.sh
> @@ -513,5 +513,18 @@ git config --list > result
>  
>  test_expect_success 'value continued on next line' 'cmp result expect'
>  
> +cat > .git/config <<\EOF
> +[quoted]
> +	withvar = "$HOME/foo"
> +[unquoted]
> +	withvar = $HOME/foo
> +EOF
> +
> +test_expect_success 'quoted $VAR' \
> +	'test x"\$HOME/foo" = x$(git config quoted.withvar)'
> +
> +test_expect_success 'unquoted $VAR' \
> +	'test x"$HOME/foo" = x$(git config unquoted.withvar)'
> +
>  test_done
If you use the HOME environment variable without setting it yourself
you should place quotes around the $(..) in case there is a space in
$HOME:
    $ ./git-config test.var '$HOME'
    $ export HOME='/tmp/foo bar'
    $ ./git-config test.var
    /tmp/foo bar
    $ test x"$HOME/foo" = x$(./git-config test.var)
    test: 4: bar: unexpected operator
    $ test x"$HOME/foo" = x"$(./git-config test.var)"
Previous: Martin WaitzNext: Martin Waitz
Message 2 of 7 in “Support environment variables in config file”
  1. Support environment variables in config fileMartin Waitz, Jun 3, 2007
  2. Matthias LederhoferJun 4, 2007
  3. Martin WaitzJun 4, 2007
  4. Matthias LederhoferJun 4, 2007
  5. Johannes SchindelinJun 4, 2007
  6. Martin WaitzJun 4, 2007
  7. Johannes SchindelinJun 4, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.