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

Re: [PATCH/RFC] Hacky version of a glob() driven config include

From
Jakub Narebski <jnareb@gmail.com>
Date
May 7, 2010, 23:43 UTC
Message-ID
<201005080143.21172.jnareb@gmail.com>
In-Reply-To
<AANLkTinCaPrThtuQd7tUFxNNn9KUx9v3_PXnH_6C8yco@mail.gmail.com>
On Sat, 8 May 2010, Ævar Arnfjörð Bjarmason wrote:
> On Fri, May 7, 2010 at 20:46, Jakub Narebski <jnareb@gmail.com> wrote:
> > Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:
Show 10 quoted lines
> > > Known bugs:
> > >
> > >   * Breaks the model of being able to *set* config values. That
> > >     doesn't work for the included files. Maybe not a bug.
> >
> > Errr... do I understand correctly that it simply means that you are
> > not able to set config values that came from included files, in
> > included files?
> >
> > This is quite serious limitation.
I was wrong there; this is not even a problem.
Show 10 quoted lines
> It is. And recap, you can now you can set Git's config in either
> places .git/config, ~/.gitconfig and $prefix/etc/gitconfig.
> 
> With inclusion this is a bit more complex. If my ~/.gitconfig includes
> a seekrt.key=foobar via an include in ~/.gitconfig/seekrt, what should
> `git config --global seekrt.key newkey` do? How about `git config
> --global seekrt.some_new_value blah`?
> 
> I think it's best to not try to get into that mess and just let the
> user manage included files manually, or with `git config --file`.

This is not a problem: while "git config --get foo.bar" would search through $GIT_DIR/config, ~/.gitconfig and /etc/gitconfig (and with your addition also included files), "git config foo.bar baz" would set foo.bar to baz always in per-repository config file (in absence of --global / --system / --file=<file> option).

So this would be simply an extension of existing situation.  Not a bug.
Show 9 quoted lines
> > >   * The whole bit with saving/restoring global state for config
> > >     inclusion is evil, but then again so is the global state.
> >
> > Why not encapsulate those global variables in a struct, passed to
> > appropriate functions, with a global variable holding an instance of
> > such struct (IIRC similarly to what is done for "the_index").
> 
> That's indeed the sane way to go. I'll do that (and look at
> the_index).
Note that variable might not be called the_index...
[...]
Show 14 quoted lines
> > > +cat > .git/config << EOF
> > > +[some]
> > > +     variable = blah
> > > +[voodoo]
> > > +     include = .git/more_config_*
> > > +EOF
> >
> > I don't like this syntax.
> 
> Me neither.
> 
> > First, it forces git-config to hide all 'include' keys.  I think
> > there might be some legitimate <section>.include config variables
> > (perhaps outside git-core); with this patch they are impossible.

Here I didn't notice that it has to be voodoo.include, and not any other fully qualified variable name, i.e. section name must be voodoo.

> It's only hiding the full 'voodoo.include' key currently, you can
> still have e.g. 'bleh.include'.

voodoo.include shows that black magic voodoo; include.file could be a bit better.

Show 7 quoted lines
> > I would propose
> >
> >  include .git/more_config_*
> >
> > if not for the fast that it would trip older git.  Perhaps
> >
> >  ## include ".git/more_config_*"
Or perhaps
  #include ".git/more_config_*"
:-)
Show 5 quoted lines
> 
> Probably not a good idea to mix up comments & configuration like
> that. Some (semi-broken) parsers of .gitconfig also use INI parsers to
> parse it, which breaks on # comments. Those are already broken, but it
> would be nice if a feature didn't require them.

BTW IIRC ini-files format (at least one of them) allows for ';'-prefixed line comments (comment must be on its own line); I wonder how it is with ini-like git config format.

But in some ini-formats definition we have that both the hash mark (#) and the semicolon (;) are comment characters.

Show 10 quoted lines
> 
> >  [include .git/more_config_*]
> 
> Syntax error on older Gits.
> 
> >  [include ".git/more_config_*"]
> 
> I like this one the best. It's also easy to modify the parser (so it
> doesn't think it's a section) to handle it. And it doesn't incur the
> confusion of looking like a normal configuration variable.
What I don't like with this proposal is that one could write
  [include ".git/more_config_*"]
  	foo = bar
Which is confusing.
But perhaps we can break backwards compatibility here.  I don't know...
  <include .git/more_config_*>
  [[.git/more_config_*]]
  {{.git/more_config_*}}
  [=.git/more_config_*=]
  [@.git/more_config_*]
  %include ".git/more_config_*"
  @INCLUDE = .git/more_config_* 
-- 
Jakub Narebski
Poland
Previous: Ævar Arnfjörð BjarmasonNext: Ping Yin
Message 17 of 21 in “Is there interest in reading ~/.gitconfig.d/* and /etc/gitconfig.d/*?”
  1. Ævar Arnfjörð BjarmasonApr 1, 2010
  2. Heiko VoigtApr 1, 2010
  3. Peter KreftingApr 4, 2010
  4. Eli BarzilayApr 4, 2010
  5. Ævar Arnfjörð BjarmasonApr 6, 2010
  6. Jakub NarebskiApr 6, 2010
  7. Hacky version of a glob() driven config includeÆvar Arnfjörð Bjarmason, May 6, 2010
  8. Bert WesargMay 7, 2010
  9. Ævar Arnfjörð BjarmasonMay 7, 2010
  10. Bert WesargMay 7, 2010
  11. Ævar Arnfjörð BjarmasonMay 7, 2010
  12. Jacob HelwigMay 7, 2010
  13. Bert WesargMay 7, 2010
  14. Hacky version of a glob() driven config includeÆvar Arnfjörð Bjarmason, May 7, 2010
  15. Jakub NarebskiMay 7, 2010
  16. Ævar Arnfjörð BjarmasonMay 7, 2010
  17. Jakub NarebskiMay 7, 2010
  18. Ping YinMay 8, 2010
  19. Jakub NarebskiMay 8, 2010
  20. Ping YinMay 8, 2010
  21. Jeff KingMay 8, 2010

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.