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

Re: What happened to "git status --color=(always|auto|never)"?

From
Jeff King <peff@peff.net>
Date
Oct 10, 2017, 13:06 UTC
Message-ID
<20171010130602.ivhsbu2ymnzt7gko@sigill.intra.peff.net>
In-Reply-To
<xmqqfuarp3mt.fsf@gitster.mtv.corp.google.com>
On Tue, Oct 10, 2017 at 09:51:38PM +0900, Junio C Hamano wrote:
Show 18 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> > :( I was worried that this might hit some third-party scripts.
> > ...
> > All that said, should we revisit the decision from 6be4595edb? The two
> > code changes we could make are:
> >
> >   1. Adding a "--color" option to "git status". Commit 0c88bf5050
> >      (provide --color option for all ref-filter users, 2017-10-03) from
> >      that same series shows some prior art.
> >
> >      This is a clean solution, but it does mean that scripts have to
> >      adapt (and would potentially need to care about which Git version
> >      they're relying on).
> 
> If we view that "always" issue is a regression, then this is not a
> "solution".  It is a part of an ideal world where we never allowed
> "always" as a value for color.ui, which is not the world we live in.

Right, this doesn't solve any regression. It solves the "there's no way to do this thing I might want to" that exists in either world (one where "always" never existed, or one where "always" does not do that anymore but we accept it as either not a regression or an acceptable regression).

Show 8 quoted lines
> >   2. Re-allow "color.always" config from the command-line. It's actually
> >      on-disk config that we want to downgrade, but I wanted to avoid
> >      making complicated rules about how the config would behave in
> >      different scopes. The patch for this would look something like the
> >      one below.
> 
> Yuck, ugly.  The code is simple (thanks to the "who ordered it?"
> thing), but the behaviour is rather embarrassing to explain.

Yes, it's definitely the most ugly of all the options. The reason I mention it is that it's also the only one that solves the "git -c color.ui=always" regression (if we consider it one) without making a huge and risky change.

Show 6 quoted lines
> >   3. Revert the original series, and revisit the original "respect
> >      color.ui via porcelain" commit which broke add--interactive in
> >      v2.14.2 (136c8c8b8fa).
> 
> Which one do you mean is "the original series"?  The one that made
> plumbing to pay attention to the color config?

No, I meant reverting jk/ui-color-always-to-auto. But if we revert that, it leaves "add -p" broken when you set color.ui=always. So we must either accept that, or _also_ revert 136c8c8b8fa and come up with a different solution.

Show 5 quoted lines
> I think it would be
> the cleanest "solution" in the world we live in, but the series (and
> the follow-on changes that started assuming that config_default
> reads the color config) have a rather large footprint and it will be
> quite painful to vet the result.

I agree that is a risk. It might not be _too_ bad, though this is an area that historically has poor test coverage. I know that for-each-ref and tag are two that would need touched (and it was them that led me down to the path to 136c8c8b8fa in the first place).

Show 20 quoted lines
> I think the right fix to the original problem (you cannot remove
> auto-color from the plumbing) is to stop paying attention to color
> configuration from the default config.  I wonder if something like
> this would work?
> 
>  - Initialize color.c::git_use_color_default to GIT_COLOR_UNKNOWN;
> 
>  - When git_color_config() is called, and if git_use_color_default
>    is still GIT_COLOR_UNKNOWN, set it to GIT_COLOR_AUTO (regardless
>    of the variable git_color_config() is called for).
> 
>  - In color.c::want_color(), when git_use_color_default is used,
>    notice if it is GIT_COLOR_UNKNOWN and behave as if it is
>    GIT_COLOR_NEVER.
>
> Then we make sure that git_color_config() is never called by any
> plumbing command.  The fact it is (ever) called can be taken as a
> clue that we are running a Porcelain (hence we transition from
> UNKNOWN to AUTO), so we'd get the desirable "no default color for
> plumbing, auto color for Porcelain", I would think.

Yes, I think that's the simplest way to implement the "plumbing should never do color without a command-line option" scheme.

I do wonder if people would end up seeing some corner cases as regressions, though. Right now "diff-tree" _does_ color the output by default, and it would stop doing so under your scheme. That's the right thing to do by the plumbing/porcelain distinction, but users with scripts that use diff-tree (or other plumbing) to generate user-visible output may unexpectedly lose their color, until the calling script is fixed to add back in a --color option[1].

-Peff
[1] Actually, just saying "--color" isn't enough, since you'd want to
    respect the user's color options. add--interactive does this, but
    it's a slight pain. It would be nice to have a --color=config
    variant that just calls git_color_config(). But if we are talking
    regression-fixes before v2.15, I don't think we need to have such
    niceties.
Previous: Junio C HamanoNext: Jonathan Nieder
Message 8 of 42 in “What happened to "git status --color=(always|auto|never)"?”
  1. Nazri RamliyOct 9, 2017
  2. Jonathan NiederOct 10, 2017
  3. Nazri RamliyOct 10, 2017
  4. Jonathan NiederOct 10, 2017
  5. Nazri RamliyOct 10, 2017
  6. Jeff KingOct 10, 2017
  7. Junio C HamanoOct 10, 2017
  8. Jeff KingOct 10, 2017
  9. Jonathan NiederOct 10, 2017
  10. Jeff KingOct 10, 2017
  11. Junio C HamanoOct 11, 2017
  12. 0/2 Piling more kludge on top of color.uiJunio C Hamano, Oct 12, 2017
  13. 2/2 color: discourage use of ui.color=alwaysJunio C Hamano, Oct 12, 2017
  14. Jonathan NiederOct 12, 2017
  15. Jeff KingOct 12, 2017
  16. Junio C HamanoOct 13, 2017
  17. 1/2 color: downgrade "always" to "auto" only for on-disk configurationJunio C Hamano, Oct 12, 2017
  18. Jonathan NiederOct 12, 2017
  19. Junio C HamanoOct 12, 2017
  20. Jonathan NiederOct 12, 2017
  21. Junio C HamanoOct 12, 2017
  22. Junio C HamanoOct 12, 2017
  23. Jeff KingOct 12, 2017
  24. Jeff KingOct 12, 2017
  25. Jeff KingOct 12, 2017
  26. Junio C HamanoOct 13, 2017
  27. Jeff KingOct 13, 2017
  28. Junio C HamanoOct 13, 2017
  29. Jeff KingOct 13, 2017
  30. 0/4 peeling back color.ui=always hacksJeff King, Oct 13, 2017
  31. 1/4 Revert "color: make "always" the same as "auto" in config"Jeff King, Oct 13, 2017
  32. 2/4 Revert "t6006: drop "always" color config tests"Jeff King, Oct 13, 2017
  33. 3/4 Revert "color: check color.ui in git_default_config()"Jeff King, Oct 13, 2017
  34. 4/4 tag: respect color.ui configJeff King, Oct 13, 2017
  35. Junio C HamanoOct 14, 2017
  36. Jeff KingOct 16, 2017
  37. Junio C HamanoOct 17, 2017
  38. Junio C HamanoOct 17, 2017
  39. Jeff KingOct 18, 2017
  40. Junio C HamanoOct 18, 2017
  41. Jonathan NiederOct 17, 2017
  42. Jeff KingOct 18, 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.