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

Re: [PATCH 0/2] Make diff plumbing commands respect the indentHeuristic.

From
Jeff King <peff@peff.net>
Date
Apr 28, 2017, 07:56 UTC
Message-ID
<20170428075635.x5rqcvgv6tohj74n@sigill.intra.peff.net>
In-Reply-To
<20170427205037.1787-1-marcnarc@xiplink.com>
On Thu, Apr 27, 2017 at 04:50:35PM -0400, Marc Branchaud wrote:
Show 17 quoted lines
> So here's my attempt at fixing this.
> 
> The thing I was missing is that init_revisions() calls diff_setup(), which
> sets the xdl options.  It's therefore necessary to have the
> diff_indent_heuristic flag set before calling init_revisions().
> 
> A naive way to get the indentHeuristic config option respected in the
> diff-* plumbing commands is to make them use the git_diff_heuristic_config()
> callback right at the start of their main cmd functions.
> 
> But I did not like that for two reasons:
> 
> * It would make these commands invoke git_config() twice.
> 
> * It doesn't avoid the problem if/when someone creates a new diff-something
>   plumbing command, and forgets to set the diff_indent_heuristic flag before
>   calling init_revisions().

Yeah, I think that would be the wrong way to go. Either this option is diff_basic_config() or it is not. And if it is not, the plumbing commands have no business checking it.

Thinking on it more, I think it probably should be basic config. We discussed all along making these options the default, which shows that plumbing interfaces do not need to be protected from them.

> So instead I chose to make the indentHeuristic option part of diff's basic
> configuration, and in each of the diff plumbing commands I moved the call to
> git_config() before the call to init_revisions().
Yes, I think that's the right thing to do.
Show 5 quoted lines
> This still doesn't really future-proof things for possible new diff plumbing
> commands, because someone could still invoke init_revisions() before setting
> up diff's basic configuration.  But I don't see an obvious way of ensuring
> that the diff_indent_heuristic flag is respected regardless of when
> diff_setup() is invoked.

I think the config-based stuff would have to be bumped down to setup_revisions(), leaving init_revisions() as a initialization function. But that would break new cases, as some callers would want to do:

  init_revisions(&revs);
  revs.foo = 1; /* override any config */
  setup_revisions(argc, argv, &revs); /* let command-line override us */
So you'd really need three phases:
  init_revisions(&revs); /* baked-in defaults */
  setup_revision_config(&revs);
  setup_revision_args(argc, argv, &revs);

and you could override each set of defaults in between the calls. But that would require tweaking each caller. In practice, I think the rule "set up your config before calling init_revisions" is probably OK, now that we know about it.

I think there is existing breakage in any case where a diff_basic_config option is handled in diff_setup(). The only one I see is the dirstat stuff. So I think:

  git config diff.dirstat changes,5
  git rev-list HEAD | git diff-tree --stdin --dirstat
was supposed to respect that "5" but doesn't. I didn't test, though.
-Peff
Previous: Jeff KingNext: Stefan Beller
Message 9 of 35 in “Make diff plumbing commands respect the indentHeuristic.”
  1. 0/2 Make diff plumbing commands respect the indentHeuristic.Marc Branchaud, Apr 27, 2017
  2. 2/2 Have the diff-* builtins configure diff before initializing revisions.Marc Branchaud, Apr 27, 2017
  3. Jeff KingApr 28, 2017
  4. Junio C HamanoMay 1, 2017
  5. Jeff KingMay 1, 2017
  6. Jeff KingMay 1, 2017
  7. 1/2 Make the indent heuristic part of diff's basic configuration.Marc Branchaud, Apr 27, 2017
  8. Jeff KingApr 28, 2017
  9. Jeff KingApr 28, 2017
  10. Stefan BellerApr 28, 2017
  11. Jeff KingApr 28, 2017
  12. Stefan BellerApr 28, 2017
  13. Ævar Arnfjörð BjarmasonMay 1, 2017
  14. Jeff KingMay 9, 2017
  15. Junio C HamanoMay 9, 2017
  16. Ævar Arnfjörð BjarmasonMay 9, 2017
  17. Jeff KingMay 9, 2017
  18. 0/3 Make diff plumbing commands respect the indentHeuristic.Marc Branchaud, Apr 28, 2017
  19. 1/3 diff: make the indent heuristic part of diff's basic configurationMarc Branchaud, Apr 28, 2017
  20. 2/3 diff: have the diff-* builtins configure diff before initializing revisionsMarc Branchaud, Apr 28, 2017
  21. 3/3 diff: enable indent heuristic by defaultMarc Branchaud, Apr 28, 2017
  22. Jeff KingApr 29, 2017
  23. Jeff KingApr 29, 2017
  24. Junio C HamanoMay 1, 2017
  25. Jeff KingMay 1, 2017
  26. Junio C HamanoMay 1, 2017
  27. 0/4 Make diff plumbing commands respect the indentHeuristic.Marc Branchaud, May 1, 2017
  28. 2/4 diff: have the diff-* builtins configure diff before initializing revisionsMarc Branchaud, May 1, 2017
  29. 1/4 diff: make the indent heuristic part of diff's basic configurationMarc Branchaud, May 1, 2017
  30. 4/4 add--interactive: drop diff.indentHeuristic handlingMarc Branchaud, May 1, 2017
  31. 3/4 diff: enable indent heuristic by defaultMarc Branchaud, May 1, 2017
  32. Jeff KingMay 1, 2017
  33. Stefan BellerMay 1, 2017
  34. 4/3 add--interactive: drop diff.indentHeuristic handlingJeff King, Apr 29, 2017
  35. Michael HaggertyApr 30, 2017

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.