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

Re: [PATCH 5/7] enforce `xfuncname` precedence over `funcname`

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 24, 2014, 17:09 UTC
Message-ID
<xmqqiommadl0.fsf@gitster.dls.corp.google.com>
In-Reply-To
<vpqlhrjqmyw.fsf@anie.imag.fr>
Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:
Show 17 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
>> in my ~/.gitconfig and then for a particular project I wanted to use
>> a custom pattern in its .git/config but it was sufficient to define
>> the pattern without using extended regexp, I would be tempted to say
>>
>> 	diff.foo.funcname "Wine$"
>
> The point is: to do that, you need to know that funcname exists, hence
> read archives of the doc before 2008 (it disapeared in
> 45d9414fa5599b41578625961b53e18a9b9148c7) or read the code. And if I
> read correctly the commit message for the commit, funcname is not
> portable so you should use xfuncname anyway.
>
> The real reason for this change is to let the code work with the new
> git_config, but I think it's reasonable not to bother with the original
> behavior for a feature deprecated so long ago.

We may be able to explain funcname vs xfuncname away, but the problem is much deeper, and it is not just you and Tanay, but anybody who thought that it is a natural and logical conclusion to emulate git_config() by iterating over in-core hashtable X-<

We have assumed that it is OK for git_config() to call its callbacks with any random order of keys as long as the values for the same key are given in the same order as the original "read from file every time" implementation would have called. The assumption overlooked the possibility that values given to two different keys can semantically interact. $foo.funcname and $foo.xfuncname being two different ways to define the same piece of information is merely one of the many ways such interactions can happen. For example, by assuming that orders of callbacks across keys does not matter, we would be breaking scripts that expected to be able to deal with something like this:

	[character]
        	name = Snoopy
                color = white black
                name = Hobbes
                color = yellow white black
For *our* own data, we can force them to be spelled this way instead:
	[character "Snoopy"]
        	color = white black
	[character "Hobbes"]
        	color = yellow white black

but that misses the point, as our config file format and its semantics are not only about .git/config but the system is designed and promoted to be a way for third-party applications to store their own data as well.

Because we do not condone using libgit.a as a library to link into third-party applications, git_config() at the C level may not have to read a random third-party data and call its callback in the predictable way, but this shows us that "git config -l" interface must return the data in the same order as we have done always by either using the _raw interface to return things uncached, or teaching by git_config() to also be predicatable.

> That said, I think the commit message should be improved (recall the
> drawbacks of funcname).

In any case, I agree that the log message and the subject is wrong. It is not that we want to give xfuncname precedence over funcname; such a behaviour is undesirable if both were in wide use. It is papering over the fallout that comes from the loss of ordering information, which is imposed by the data structure chosen to represent a config_set.

I haven't formed a firm opinion whether preserving the order is necessary at git_config() iteration level yet. If the only in-core user that will be broken by not doing so is xfuncname vs funcname, it may not be too bad, but it will constrain us in the future, which is a lot bigger problem. We will be forbidden from correcting a UI mistake by using the approach we took to transtion "funcname" over to "xfuncname" (i.e. giving users "funcname" and allowing the platform BRE parser that may or may not allow the users to write backslashed ERE is spreading possible incompatibility among the participants of a project; explicitly stating that the value is ERE has fewer compatibility issues), while still supporting "funcname" and have them interact in a sane way.

Previous: Matthieu MoyNext: Tanay Abhra
Message 26 of 51 in “Rewrite `git_config()` using config-set API”
  1. 0/7 Rewrite `git_config()` using config-set APITanay Abhra, Jul 23, 2014
  2. 1/7 config.c: fix accuracy of line number in errorsTanay Abhra, Jul 23, 2014
  3. Junio C HamanoJul 23, 2014
  4. Tanay AbhraJul 24, 2014
  5. Junio C HamanoJul 24, 2014
  6. Tanay AbhraJul 24, 2014
  7. Matthieu MoyJul 24, 2014
  8. 2/7 rewrite git_config() to use the config-set APITanay Abhra, Jul 23, 2014
  9. Matthieu MoyJul 23, 2014
  10. Matthieu MoyJul 23, 2014
  11. Junio C HamanoJul 23, 2014
  12. Matthieu MoyJul 24, 2014
  13. 3/7 add a test for semantic errors in config filesTanay Abhra, Jul 23, 2014
  14. Matthieu MoyJul 23, 2014
  15. Junio C HamanoJul 23, 2014
  16. Tanay AbhraJul 24, 2014
  17. Matthieu MoyJul 24, 2014
  18. Junio C HamanoJul 24, 2014
  19. 4/7 add line number and file name info to `config_set`Tanay Abhra, Jul 23, 2014
  20. Junio C HamanoJul 23, 2014
  21. 5/7 enforce `xfuncname` precedence over `funcname`Tanay Abhra, Jul 23, 2014
  22. Matthieu MoyJul 23, 2014
  23. Eric SunshineJul 23, 2014
  24. Junio C HamanoJul 23, 2014
  25. Matthieu MoyJul 24, 2014
  26. Junio C HamanoJul 24, 2014
  27. Tanay AbhraJul 24, 2014
  28. Matthieu MoyJul 24, 2014
  29. John KeepingJul 24, 2014
  30. Junio C HamanoJul 24, 2014
  31. Tanay AbhraJul 24, 2014
  32. Junio C HamanoJul 24, 2014
  33. Ramsay JonesJul 24, 2014
  34. Tanay AbhraJul 25, 2014
  35. Matthieu MoyJul 25, 2014
  36. Junio C HamanoJul 25, 2014
  37. Matthieu MoyJul 25, 2014
  38. Junio C HamanoJul 25, 2014
  39. 6/7 config: add `git_die_config()` to the config-set APITanay Abhra, Jul 23, 2014
  40. 7/7 Add tests for `git_config_get_string()`Tanay Abhra, Jul 23, 2014
  41. Matthieu MoyJul 23, 2014
  42. Matthieu MoyJul 23, 2014
  43. Junio C HamanoJul 23, 2014
  44. Tanay AbhraJul 24, 2014
  45. Matthieu MoyJul 24, 2014
  46. Tanay AbhraJul 24, 2014
  47. Matthieu MoyJul 24, 2014
  48. Junio C HamanoJul 24, 2014
  49. 1/2 add `config_set` API for caching config-like filesTanay Abhra, Jul 24, 2014
  50. Junio C HamanoJul 24, 2014
  51. 2/2 test-config: add tests for the config_set APITanay Abhra, Jul 24, 2014

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.