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

Re: The config include mechanism doesn't allow for overwriting

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Oct 23, 2012, 14:13 UTC
Message-ID
<CACBZZX5mOb7_i9r8AqNK5V3r-gVnzN+rkeY9xrhecGv1rS-anA@mail.gmail.com>
In-Reply-To
<20121022211505.GA3301@sigill.intra.peff.net>
On Mon, Oct 22, 2012 at 11:15 PM, Jeff King <peff@peff.net> wrote:
Show 51 quoted lines
> On Mon, Oct 22, 2012 at 05:55:00PM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>> I was hoping to write something like this:
>>
>>     [user]
>>         name = Luser
>>         email = some-default@example.com
>>     [include]
>>         path = ~/.gitconfig.d/user-email
>>
>> Where that file would contain:
>>
>>     [user]
>>         email = local-email@example.com
>
> The intent is that it would work as you expect, and produce
> local-email@example.com.
>
>> But when you do that git prints:
>>
>>     $ git config --get user.email
>>      some-default@example.com
>>      error: More than one value for the key user.email: local-email@example.com
>
> Ugh. The config code just feeds all the values sequentially to the
> callback. The normal callbacks within git will overwrite old values,
> whether from earlier in the file, from a file with lower priority (e.g.,
> /etc/gitconfig versus ~/.gitconfig), or from an earlier included. Which
> you can check with:
>
>   $ git var GIT_AUTHOR_IDENT
>   Luser <local-email@example.com> 1350936694 -0400
>
> But git-config takes it upon itself to detect duplicates in its
> callback. Which is just silly, since it is not something that regular
> git would do. git-config should behave as much like the internal git
> parser as possible.
>
>> I think config inclusion is much less useful when you can't clobber
>> previously assigned values.
>
> Agreed. But I think the bug is in git-config, not in the include
> mechanism. I think I'd like to do something like the patch below, which
> just reuses the regular config code for git-config, collects the values,
> and then reports them. It does mean we use a little more memory (for the
> sake of simplicity, we store values instead of streaming them out), but
> the code is much shorter, less confusing, and automatically matches what
> regular git_config() does.
>
> It fails a few tests in t1300, but it looks like those tests are testing
> for the behavior we have identified as wrong, and should be fixed.
I think this patch looks good.

One other thing I think is worth clarifying (and I think should be broken) is if you write a configuration like:

    [foo]
        bar = one
    [foo]
        bar = two
    [foo]
        bar = three
"git-{config,var} -l" will both give you:
    foo.bar=one
    foo.bar=two
    foo.bar=three
And git config --get foo.bar will give you:
    $ git config -f /tmp/test --get foo.bar
    one
    error: More than one value for the key foo.bar: two
    error: More than one value for the key foo.bar: three

I think that it would be better if the config mechanism just silently overwrote keys that clobbered earlier keys like your patch does.

But in addition can we simplify things for the consumers of "git-{config,var} -l" by only printing:

    foo.bar=three

Or are there too many variables like "include.path" that can legitimately appear more than once.

Previous: Jeff KingNext: Jeff King
Message 3 of 25 in “The config include mechanism doesn't allow for overwriting”
  1. Ævar Arnfjörð BjarmasonOct 22, 2012
  2. Jeff KingOct 22, 2012
  3. Ævar Arnfjörð BjarmasonOct 23, 2012
  4. 0/8 fix git-config with duplicate variable entriesJeff King, Oct 23, 2012
  5. 1/8 t1300: style updatesJeff King, Oct 23, 2012
  6. Johannes SixtOct 24, 2012
  7. Jeff KingOct 24, 2012
  8. 1/8 t1300: style updatesJeff King, Oct 24, 2012
  9. 2/8 t1300: remove redundant testJeff King, Oct 23, 2012
  10. 3/8 t1300: test "git config --get-all" more thoroughlyJeff King, Oct 23, 2012
  11. 4/8 git-config: remove memory leak of key regexpJeff King, Oct 23, 2012
  12. 5/8 git-config: fix regexp memory leaks on error conditionsJeff King, Oct 23, 2012
  13. 6/8 git-config: collect values instead of immediately printingJeff King, Oct 23, 2012
  14. 7/8 git-config: do not complain about duplicate entriesJeff King, Oct 23, 2012
  15. 8/8 git-config: use git_config_with_optionsJeff King, Oct 23, 2012
  16. Johannes SixtOct 24, 2012
  17. Ævar Arnfjörð BjarmasonOct 24, 2012
  18. Junio C HamanoNov 20, 2012
  19. Jeff KingNov 21, 2012
  20. Junio C HamanoNov 21, 2012
  21. Jeff KingNov 21, 2012
  22. Junio C HamanoNov 21, 2012
  23. Joachim SchmitzNov 23, 2012
  24. John SzakmeisterOct 24, 2012
  25. Jeff KingOct 24, 2012

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.