]> git.ipfire.org Git - thirdparty/git.git/commitdiff
add-interactive: retain colorbool values longer
authorJeff King <peff@peff.net>
Tue, 16 Sep 2025 20:26:24 +0000 (16:26 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Sep 2025 01:00:25 +0000 (18:00 -0700)
Most of the diff code stores the decision about whether to show color as
a git_colorbool, and evaluates it at point-of-use with want_color().
This timing is important for reasons explained in daa0c3d971 (color:
delay auto-color decision until point of use, 2011-08-17).

The add-interactive code instead converts immediately to strict boolean
values using want_color(), and then evaluates those. This isn't wrong.
Even though we pass the bool values to diff_use_color(), which expects a
colorbool, the values are compatible. But it is unlike the rest of the
color code, and is questionable from a type-system perspective (but C's
typing between enums, ints, and bools is weak enough that the compiler
does not complain).

Let's switch it to the more usual way of calling want_color() at the
point of use.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
add-interactive.c
add-interactive.h

index 000315971eda13982d9e42a901bbc848c112d4d5..6ffe64c38d877f74cff5cb29140df8d5e6b16d94 100644 (file)
 #include "prompt.h"
 #include "tree.h"
 
-static void init_color(struct repository *r, int use_color,
+static void init_color(struct repository *r, enum git_colorbool use_color,
                       const char *section_and_slot, char *dst,
                       const char *default_color)
 {
        char *key = xstrfmt("color.%s", section_and_slot);
        const char *value;
 
-       if (!use_color)
+       if (!want_color(use_color))
                dst[0] = '\0';
        else if (repo_config_get_value(r, key, &value) ||
                 color_parse(value, dst))
@@ -36,7 +36,7 @@ static void init_color(struct repository *r, int use_color,
        free(key);
 }
 
-static int check_color_config(struct repository *r, const char *var)
+static enum git_colorbool check_color_config(struct repository *r, const char *var)
 {
        const char *value;
        enum git_colorbool ret;
@@ -55,7 +55,7 @@ static int check_color_config(struct repository *r, const char *var)
            !repo_config_get_value(r, "color.ui", &value))
                ret = git_config_colorbool("color.ui", value);
 
-       return want_color(ret);
+       return ret;
 }
 
 void init_add_i_state(struct add_i_state *s, struct repository *r,
@@ -76,7 +76,7 @@ void init_add_i_state(struct add_i_state *s, struct repository *r,
        init_color(r, s->use_color_interactive, "interactive.error",
                   s->error_color, GIT_COLOR_BOLD_RED);
        strlcpy(s->reset_color_interactive,
-               s->use_color_interactive ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
+               want_color(s->use_color_interactive) ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
 
        s->use_color_diff = check_color_config(r, "color.diff");
 
@@ -93,7 +93,7 @@ void init_add_i_state(struct add_i_state *s, struct repository *r,
        init_color(r, s->use_color_diff, "diff.new", s->file_new_color,
                   diff_get_color(s->use_color_diff, DIFF_FILE_NEW));
        strlcpy(s->reset_color_diff,
-               s->use_color_diff ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
+               want_color(s->use_color_diff) ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
 
        FREE_AND_NULL(s->interactive_diff_filter);
        repo_config_get_string(r, "interactive.difffilter",
@@ -1211,7 +1211,7 @@ int run_add_i(struct repository *r, const struct pathspec *ps,
         * When color was asked for, use the prompt color for
         * highlighting, otherwise use square brackets.
         */
-       if (s.use_color_interactive) {
+       if (want_color(s.use_color_interactive)) {
                data.color = s.prompt_color;
                data.reset = s.reset_color_interactive;
        }
index ceadfa6bb678126081f5a92de0e02829bae80f6d..da49502b7656f432351f41eb1fcf229cc787bea7 100644 (file)
@@ -12,8 +12,8 @@ struct add_p_opt {
 
 struct add_i_state {
        struct repository *r;
-       int use_color_interactive;
-       int use_color_diff;
+       enum git_colorbool use_color_interactive;
+       enum git_colorbool use_color_diff;
        char header_color[COLOR_MAXLEN];
        char help_color[COLOR_MAXLEN];
        char prompt_color[COLOR_MAXLEN];