color: check color.ui in git_default_config()

Back in prehistoric times, our decision on whether or not to show color by default relied on using a config callback that either did or didn't load color config like color.diff. When we introduced color.ui, we put it in the same boat: commands had to manually respect it by using git_color_config() or its git_color_default_config() convenience wrapper. But in 4c7f1819b (make color.ui default to 'auto', 2013-06-10), that changed. Since then, we default color.ui to auto in all programs, meaning that even plumbing commands like "git diff-tree --pretty" might colorize the output. Nobody seems to have complained in the intervening years, presumably because the "is stdout a tty" check does a good job of catching the right cases. But that leaves an interesting curiosity: color.ui defaults to auto even in plumbing, but you can't actually _disable_ the color via config. So if you really hate color and set "color.ui" to false, diff-tree will still show color (but porcelain like git-diff won't). Nobody noticed that either, probably because very few people disable color. One could argue that the plumbing should _always_ disable color unless an explicit --color option is given on the command line. But in practice, this creates a lot of complications for scripts which do want plumbing to show user-visible output. They can't just pass "--color" blindly; they need to check the user's config and decide what to send. Given that nobody has complained about the current behavior, let's assume it's a good path, and follow it to its conclusion: supporting color.ui everywhere. Note that you can create havoc by setting color.ui=always in your config, but that's more or less already the case. We could disallow it entirely, but it is handy for one-offs like: git -c color.ui=always foo >not-a-tty when "foo" does not take a --color option itself. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Jul 13, 2017 at 11:07 UTC 136c8c8b8fa39f1315713248473dececf20f8fe7
7 files changed +8 -16
builtin/branch.c
+1 -1
@@ -92,7 +92,7 @@ static int git_branch_config(const char *var, const char *value, void *cb)
92 return config_error_nonbool(var);
93 return color_parse(value, branch_colors[slot]);
94 }
95 - return git_color_default_config(var, value, cb);
95 + return git_default_config(var, value, cb);
96 }
97
98 static const char *branch_get_color(enum color_branch ix)
builtin/clean.c
+1 -2
@@ -125,8 +125,7 @@ static int git_clean_config(const char *var, const char *value, void *cb)
125 return 0;
126 }
127
128 - /* inspect the color.ui config variable and others */
129 - return git_color_default_config(var, value, cb);
128 + return git_default_config(var, value, cb);
129 }
130
131 static const char *clean_get_color(enum color_clean ix)
builtin/grep.c
+1 -1
@@ -284,7 +284,7 @@ static int wait_all(void)
284 static int grep_cmd_config(const char *var, const char *value, void *cb)
285 {
286 int st = grep_config(var, value, cb);
287 - if (git_color_default_config(var, value, cb) < 0)
287 + if (git_default_config(var, value, cb) < 0)
288 st = -1;
289
290 if (!strcmp(var, "grep.threads")) {
builtin/show-branch.c
+1 -1
@@ -554,7 +554,7 @@ static int git_show_branch_config(const char *var, const char *value, void *cb)
554 return 0;
555 }
556
557 - return git_color_default_config(var, value, cb);
557 + return git_default_config(var, value, cb);
558 }
559
560 static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
color.c
-8
@@ -361,14 +361,6 @@ int git_color_config(const char *var, const char *value, void *cb)
361 return 0;
362 }
363
364 -int git_color_default_config(const char *var, const char *value, void *cb)
365 -{
366 - if (git_color_config(var, value, cb) < 0)
367 - return -1;
368 -
369 - return git_default_config(var, value, cb);
370 -}
371 -
364 void color_print_strbuf(FILE *fp, const char *color, const struct strbuf *sb)
365 {
366 if (*color)
config.c
+4
@@ -16,6 +16,7 @@
16 #include "string-list.h"
17 #include "utf8.h"
18 #include "dir.h"
19 +#include "color.h"
20
21 struct config_source {
22 struct config_source *prev;
@@ -1350,6 +1351,9 @@ int git_default_config(const char *var, const char *value, void *dummy)
1351 if (starts_with(var, "advice."))
1352 return git_default_advice_config(var, value);
1353
1354 + if (git_color_config(var, value, dummy) < 0)
1355 + return -1;
1356 +
1357 if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
1358 pager_use_color = git_config_bool(var,value);
1359 return 0;
diff.c
-3
@@ -299,9 +299,6 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
299 return 0;
300 }
301
302 - if (git_color_config(var, value, cb) < 0)
303 - return -1;
304 -
302 return git_diff_basic_config(var, value, cb);
303 }
304