From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org, Patrick Steinhardt <ps@pks.im>
Subject: Re: [PATCH 13/13 DO NOT APPLY] color: convert git_colorbool into a struct
Date: Tue, 16 Sep 2025 13:35:37 -0700 [thread overview]
Message-ID: <xmqqplbqm8yu.fsf@gitster.g> (raw)
In-Reply-To: <20250916202748.GM612873@coredump.intra.peff.net> (Jeff King's message of "Tue, 16 Sep 2025 16:27:48 -0400")
Jeff King <peff@peff.net> writes:
> and then most calling code would be happy. But:
>
> - We don't use typedefs for enums in our project (so even with that
> typedef, we have to drop the "enum" from "enum git_colorbool"
> everywhere).
>
> - The anonymous struct syntax above works for assigning and returning
> values, but not for initializers. You have to use {GIT_COLOR_AUTO}
> without the fake-typecast there.
>
> - Likewise, C does not allow direct struct comparison at all! So for
> "foo == GIT_COLOR_AUTO", you must actually dereference foo.f to get
> to the field.
>
> So this patch just makes all of the necessary changes throughout the
> code base. This is not something we should apply, but it was useful for
> flushing out all of the funny spots earlier in the series.
Great show of technique to help others. It is somewhat surprising
that the patch can be this *small*, given the above ;-)
Amused, but as requested, will not apply.
Thanks.
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> add-interactive.c | 14 +++++++-------
> add-interactive.h | 4 ++--
> advice.c | 2 +-
> builtin/add.c | 2 +-
> builtin/am.c | 4 ++--
> builtin/branch.c | 2 +-
> builtin/clean.c | 2 +-
> builtin/commit.c | 4 ++--
> builtin/config.c | 20 ++++++++++----------
> builtin/grep.c | 2 +-
> builtin/log.c | 4 ++--
> builtin/push.c | 2 +-
> builtin/range-diff.c | 2 +-
> builtin/show-branch.c | 2 +-
> color.c | 24 ++++++++++++------------
> color.h | 7 ++++---
> combine-diff.c | 2 +-
> diff.c | 18 +++++++++---------
> diff.h | 4 ++--
> grep.h | 4 ++--
> log-tree.c | 4 ++--
> log-tree.h | 2 +-
> parse-options-cb.c | 6 +++---
> pretty.c | 8 ++++----
> pretty.h | 2 +-
> ref-filter.h | 4 ++--
> sequencer.c | 2 +-
> sideband.c | 8 ++++----
> transport.c | 2 +-
> wt-status.c | 6 +++---
> wt-status.h | 2 +-
> 31 files changed, 86 insertions(+), 85 deletions(-)
>
> diff --git a/add-interactive.c b/add-interactive.c
> index 6ffe64c38d..c16270dd60 100644
> --- a/add-interactive.c
> +++ b/add-interactive.c
> @@ -20,7 +20,7 @@
> #include "prompt.h"
> #include "tree.h"
>
> -static void init_color(struct repository *r, enum git_colorbool use_color,
> +static void init_color(struct repository *r, git_colorbool use_color,
> const char *section_and_slot, char *dst,
> const char *default_color)
> {
> @@ -36,13 +36,13 @@ static void init_color(struct repository *r, enum git_colorbool use_color,
> free(key);
> }
>
> -static enum git_colorbool check_color_config(struct repository *r, const char *var)
> +static git_colorbool check_color_config(struct repository *r, const char *var)
> {
> const char *value;
> - enum git_colorbool ret;
> + git_colorbool ret;
>
> if (repo_config_get_value(r, var, &value))
> - ret = GIT_COLOR_UNKNOWN;
> + ret.f = GIT_COLOR_UNKNOWN;
> else
> ret = git_config_colorbool(var, value);
>
> @@ -51,7 +51,7 @@ static enum git_colorbool check_color_config(struct repository *r, const char *v
> * the value parsed by git_color_config(), which may not have been
> * called by the main command.
> */
> - if (ret == GIT_COLOR_UNKNOWN &&
> + if (ret.f == GIT_COLOR_UNKNOWN &&
> !repo_config_get_value(r, "color.ui", &value))
> ret = git_config_colorbool("color.ui", value);
>
> @@ -131,8 +131,8 @@ void clear_add_i_state(struct add_i_state *s)
> FREE_AND_NULL(s->interactive_diff_filter);
> FREE_AND_NULL(s->interactive_diff_algorithm);
> memset(s, 0, sizeof(*s));
> - s->use_color_interactive = GIT_COLOR_UNKNOWN;
> - s->use_color_diff = GIT_COLOR_UNKNOWN;
> + s->use_color_interactive = (git_colorbool){GIT_COLOR_UNKNOWN};
> + s->use_color_diff = (git_colorbool){GIT_COLOR_UNKNOWN};
> }
>
> /*
> diff --git a/add-interactive.h b/add-interactive.h
> index da49502b76..7016ea2d2f 100644
> --- a/add-interactive.h
> +++ b/add-interactive.h
> @@ -12,8 +12,8 @@ struct add_p_opt {
>
> struct add_i_state {
> struct repository *r;
> - enum git_colorbool use_color_interactive;
> - enum git_colorbool use_color_diff;
> + git_colorbool use_color_interactive;
> + git_colorbool use_color_diff;
> char header_color[COLOR_MAXLEN];
> char help_color[COLOR_MAXLEN];
> char prompt_color[COLOR_MAXLEN];
> diff --git a/advice.c b/advice.c
> index 0018501b7b..21fa17d6a8 100644
> --- a/advice.c
> +++ b/advice.c
> @@ -7,7 +7,7 @@
> #include "help.h"
> #include "string-list.h"
>
> -static enum git_colorbool advice_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool advice_use_color = {GIT_COLOR_UNKNOWN};
> static char advice_colors[][COLOR_MAXLEN] = {
> GIT_COLOR_RESET,
> GIT_COLOR_YELLOW, /* HINT */
> diff --git a/builtin/add.c b/builtin/add.c
> index 4cd3d183f9..c9ca3466a3 100644
> --- a/builtin/add.c
> +++ b/builtin/add.c
> @@ -200,7 +200,7 @@ static int edit_patch(struct repository *repo,
>
> argc = setup_revisions(argc, argv, &rev, NULL);
> rev.diffopt.output_format = DIFF_FORMAT_PATCH;
> - rev.diffopt.use_color = GIT_COLOR_NEVER;
> + rev.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> rev.diffopt.flags.ignore_dirty_submodules = 1;
> out = xopen(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
> rev.diffopt.file = xfdopen(out, "w");
> diff --git a/builtin/am.c b/builtin/am.c
> index 277c2e7937..4c06b44607 100644
> --- a/builtin/am.c
> +++ b/builtin/am.c
> @@ -1408,7 +1408,7 @@ static void write_commit_patch(const struct am_state *state, struct commit *comm
> rev_info.no_commit_id = 1;
> rev_info.diffopt.flags.binary = 1;
> rev_info.diffopt.flags.full_index = 1;
> - rev_info.diffopt.use_color = GIT_COLOR_NEVER;
> + rev_info.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> rev_info.diffopt.file = fp;
> rev_info.diffopt.close_file = 1;
> add_pending_object(&rev_info, &commit->object, "");
> @@ -1441,7 +1441,7 @@ static void write_index_patch(const struct am_state *state)
> rev_info.disable_stdin = 1;
> rev_info.no_commit_id = 1;
> rev_info.diffopt.output_format = DIFF_FORMAT_PATCH;
> - rev_info.diffopt.use_color = GIT_COLOR_NEVER;
> + rev_info.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> rev_info.diffopt.file = fp;
> rev_info.diffopt.close_file = 1;
> add_pending_object(&rev_info, &tree->object, "");
> diff --git a/builtin/branch.c b/builtin/branch.c
> index 9fcf04bebb..f5dd0e00be 100644
> --- a/builtin/branch.c
> +++ b/builtin/branch.c
> @@ -46,7 +46,7 @@ static struct object_id head_oid;
> static int recurse_submodules = 0;
> static int submodule_propagate_branches = 0;
>
> -static enum git_colorbool branch_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool branch_use_color = {GIT_COLOR_UNKNOWN};
> static char branch_colors[][COLOR_MAXLEN] = {
> GIT_COLOR_RESET,
> GIT_COLOR_NORMAL, /* PLAIN */
> diff --git a/builtin/clean.c b/builtin/clean.c
> index 1d5e7e5366..7f025aaea1 100644
> --- a/builtin/clean.c
> +++ b/builtin/clean.c
> @@ -64,7 +64,7 @@ static const char *color_interactive_slots[] = {
> [CLEAN_COLOR_RESET] = "reset",
> };
>
> -static enum git_colorbool clean_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool clean_use_color = {GIT_COLOR_UNKNOWN};
> static char clean_colors[][COLOR_MAXLEN] = {
> [CLEAN_COLOR_ERROR] = GIT_COLOR_BOLD_RED,
> [CLEAN_COLOR_HEADER] = GIT_COLOR_BOLD,
> diff --git a/builtin/commit.c b/builtin/commit.c
> index d8f21a4c62..3c1c12845a 100644
> --- a/builtin/commit.c
> +++ b/builtin/commit.c
> @@ -936,7 +936,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
> strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
> if (use_editor && include_status) {
> int ident_shown = 0;
> - enum git_colorbool saved_color_setting;
> + git_colorbool saved_color_setting;
> struct ident_split ci, ai;
> const char *hint_cleanup_all = allow_empty_message ?
> _("Please enter the commit message for your changes."
> @@ -1016,7 +1016,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
> status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
>
> saved_color_setting = s->use_color;
> - s->use_color = GIT_COLOR_NEVER;
> + s->use_color = (git_colorbool){GIT_COLOR_NEVER};
> committable = run_status(s->fp, index_file, prefix, 1, s);
> s->use_color = saved_color_setting;
> string_list_clear_func(&s->change, change_data_free);
> diff --git a/builtin/config.c b/builtin/config.c
> index 2348a99dd4..4105c4c812 100644
> --- a/builtin/config.c
> +++ b/builtin/config.c
> @@ -568,9 +568,9 @@ static void get_color(const struct config_location_options *opts,
> }
>
> struct get_colorbool_config_data {
> - enum git_colorbool get_colorbool_found;
> - enum git_colorbool get_diff_color_found;
> - enum git_colorbool get_color_ui_found;
> + git_colorbool get_colorbool_found;
> + git_colorbool get_diff_color_found;
> + git_colorbool get_color_ui_found;
> const char *get_colorbool_slot;
> };
>
> @@ -594,26 +594,26 @@ static int get_colorbool(const struct config_location_options *opts,
> {
> struct get_colorbool_config_data data = {
> .get_colorbool_slot = var,
> - .get_colorbool_found = GIT_COLOR_UNKNOWN,
> - .get_diff_color_found = GIT_COLOR_UNKNOWN,
> - .get_color_ui_found = GIT_COLOR_UNKNOWN,
> + .get_colorbool_found = {GIT_COLOR_UNKNOWN},
> + .get_diff_color_found = {GIT_COLOR_UNKNOWN},
> + .get_color_ui_found = {GIT_COLOR_UNKNOWN},
> };
> bool result;
>
> config_with_options(git_get_colorbool_config, &data,
> &opts->source, the_repository,
> &opts->options);
>
> - if (data.get_colorbool_found == GIT_COLOR_UNKNOWN) {
> + if (data.get_colorbool_found.f == GIT_COLOR_UNKNOWN) {
> if (!strcmp(data.get_colorbool_slot, "color.diff"))
> data.get_colorbool_found = data.get_diff_color_found;
> - if (data.get_colorbool_found == GIT_COLOR_UNKNOWN)
> + if (data.get_colorbool_found.f == GIT_COLOR_UNKNOWN)
> data.get_colorbool_found = data.get_color_ui_found;
> }
>
> - if (data.get_colorbool_found == GIT_COLOR_UNKNOWN)
> + if (data.get_colorbool_found.f == GIT_COLOR_UNKNOWN)
> /* default value if none found in config */
> - data.get_colorbool_found = GIT_COLOR_AUTO;
> + data.get_colorbool_found = (git_colorbool){GIT_COLOR_AUTO};
>
> result = want_color(data.get_colorbool_found);
>
> diff --git a/builtin/grep.c b/builtin/grep.c
> index 1d97eb2a2a..3a6cdf9220 100644
> --- a/builtin/grep.c
> +++ b/builtin/grep.c
> @@ -1091,7 +1091,7 @@ int cmd_grep(int argc,
> if (show_in_pager == default_pager)
> show_in_pager = git_pager(the_repository, 1);
> if (show_in_pager) {
> - opt.color = GIT_COLOR_NEVER;
> + opt.color = (git_colorbool){GIT_COLOR_NEVER};
> opt.name_only = 1;
> opt.null_following_name = 1;
> opt.output_priv = &path_list;
> diff --git a/builtin/log.c b/builtin/log.c
> index c2f8bbf863..960482c2f1 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -2193,8 +2193,8 @@ int cmd_format_patch(int argc,
> output_directory = cfg.config_output_directory;
> output_directory = set_outdir(prefix, output_directory);
>
> - if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
> - rev.diffopt.use_color = GIT_COLOR_NEVER;
> + if (rev.diffopt.use_color.f != GIT_COLOR_ALWAYS)
> + rev.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> /*
> * We consider <outdir> as 'outside of gitdir', therefore avoid
> * applying adjust_shared_perm in s-c-l-d.
> diff --git a/builtin/push.c b/builtin/push.c
> index 5b6cebbb85..2c84eaac7b 100644
> --- a/builtin/push.c
> +++ b/builtin/push.c
> @@ -27,7 +27,7 @@ static const char * const push_usage[] = {
> NULL,
> };
>
> -static enum git_colorbool push_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool push_use_color = {GIT_COLOR_UNKNOWN};
> static char push_colors[][COLOR_MAXLEN] = {
> GIT_COLOR_RESET,
> GIT_COLOR_RED, /* ERROR */
> diff --git a/builtin/range-diff.c b/builtin/range-diff.c
> index 0d51ddd623..94ceaffac2 100644
> --- a/builtin/range-diff.c
> +++ b/builtin/range-diff.c
> @@ -67,7 +67,7 @@ int cmd_range_diff(int argc,
>
> /* force color when --dual-color was used */
> if (!simple_color)
> - diffopt.use_color = GIT_COLOR_ALWAYS;
> + diffopt.use_color = (git_colorbool){GIT_COLOR_ALWAYS};
>
> /* If `--diff-merges` was specified, imply `--merges` */
> if (diff_merges_arg.nr) {
> diff --git a/builtin/show-branch.c b/builtin/show-branch.c
> index 441babf2e3..d5e9eb399a 100644
> --- a/builtin/show-branch.c
> +++ b/builtin/show-branch.c
> @@ -29,7 +29,7 @@ static const char*const show_branch_usage[] = {
> NULL
> };
>
> -static enum git_colorbool showbranch_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool showbranch_use_color = {GIT_COLOR_UNKNOWN};
>
> static struct strvec default_args = STRVEC_INIT;
>
> diff --git a/color.c b/color.c
> index 07ac8c9d40..14e994ab19 100644
> --- a/color.c
> +++ b/color.c
> @@ -9,7 +9,7 @@
> #include "pager.h"
> #include "strbuf.h"
>
> -static enum git_colorbool git_use_color_default = GIT_COLOR_AUTO;
> +static git_colorbool git_use_color_default = {GIT_COLOR_AUTO};
> int color_stdout_is_tty = -1;
>
> /*
> @@ -369,26 +369,26 @@ int color_parse_mem(const char *value, int value_len, char *dst)
> #undef OUT
> }
>
> -enum git_colorbool git_config_colorbool(const char *var, const char *value)
> +git_colorbool git_config_colorbool(const char *var, const char *value)
> {
> if (value) {
> if (!strcasecmp(value, "never"))
> - return GIT_COLOR_NEVER;
> + return (git_colorbool){GIT_COLOR_NEVER};
> if (!strcasecmp(value, "always"))
> - return GIT_COLOR_ALWAYS;
> + return (git_colorbool){GIT_COLOR_ALWAYS};
> if (!strcasecmp(value, "auto"))
> - return GIT_COLOR_AUTO;
> + return (git_colorbool){GIT_COLOR_AUTO};
> }
>
> if (!var)
> - return GIT_COLOR_UNKNOWN;
> + return (git_colorbool){GIT_COLOR_UNKNOWN};
>
> /* Missing or explicit false to turn off colorization */
> if (!git_config_bool(var, value))
> - return GIT_COLOR_NEVER;
> + return (git_colorbool){GIT_COLOR_NEVER};
>
> /* any normal truth value defaults to 'auto' */
> - return GIT_COLOR_AUTO;
> + return (git_colorbool){GIT_COLOR_AUTO};
> }
>
> static bool check_auto_color(int fd)
> @@ -404,7 +404,7 @@ static bool check_auto_color(int fd)
> return false;
> }
>
> -bool want_color_fd(int fd, enum git_colorbool var)
> +bool want_color_fd(int fd, git_colorbool var)
> {
> /*
> * NEEDSWORK: This function is sometimes used from multiple threads, and
> @@ -418,15 +418,15 @@ bool want_color_fd(int fd, enum git_colorbool var)
> if (fd < 1 || fd >= ARRAY_SIZE(want_auto))
> BUG("file descriptor out of range: %d", fd);
>
> - if (var == GIT_COLOR_UNKNOWN)
> + if (var.f == GIT_COLOR_UNKNOWN)
> var = git_use_color_default;
>
> - if (var == GIT_COLOR_AUTO) {
> + if (var.f == GIT_COLOR_AUTO) {
> if (want_auto[fd] < 0)
> want_auto[fd] = check_auto_color(fd);
> return want_auto[fd];
> }
> - return var == GIT_COLOR_ALWAYS;
> + return var.f == GIT_COLOR_ALWAYS;
> }
>
> int git_color_config(const char *var, const char *value, void *cb UNUSED)
> diff --git a/color.h b/color.h
> index 43e6c9ad09..5e735ce827 100644
> --- a/color.h
> +++ b/color.h
> @@ -73,12 +73,13 @@ struct strbuf;
> * returned from git_config_colorbool. The "auto" value can be returned from
> * config_colorbool, and will be converted by want_color() into either 0 or 1.
> */
> -enum git_colorbool {
> +enum git_colorbool_f {
> GIT_COLOR_UNKNOWN = -1,
> GIT_COLOR_NEVER = 0,
> GIT_COLOR_ALWAYS = 1,
> GIT_COLOR_AUTO = 2,
> };
> +typedef struct { enum git_colorbool_f f; } git_colorbool;
>
> /* A default list of colors to use for commit graphs and show-branch output */
> extern const char *column_colors_ansi[];
> @@ -100,13 +101,13 @@ int git_color_config(const char *var, const char *value, void *cb);
> * GIT_COLOR_ALWAYS for "always" or a positive boolean,
> * and GIT_COLOR_AUTO for "auto".
> */
> -enum git_colorbool git_config_colorbool(const char *var, const char *value);
> +git_colorbool git_config_colorbool(const char *var, const char *value);
>
> /*
> * Return a boolean whether to use color, where the argument 'var' is
> * one of GIT_COLOR_UNKNOWN, GIT_COLOR_NEVER, GIT_COLOR_ALWAYS, GIT_COLOR_AUTO.
> */
> -bool want_color_fd(int fd, enum git_colorbool var);
> +bool want_color_fd(int fd, git_colorbool var);
> #define want_color(colorbool) want_color_fd(1, (colorbool))
> #define want_color_stderr(colorbool) want_color_fd(2, (colorbool))
>
> diff --git a/combine-diff.c b/combine-diff.c
> index 21b7fdfff4..d70939ed71 100644
> --- a/combine-diff.c
> +++ b/combine-diff.c
> @@ -749,7 +749,7 @@ static void show_line_to_eol(const char *line, int len, const char *reset)
>
> static void dump_sline(struct sline *sline, const char *line_prefix,
> unsigned long cnt, int num_parent,
> - enum git_colorbool use_color, int result_deleted)
> + git_colorbool use_color, int result_deleted)
> {
> unsigned long mark = (1UL<<num_parent);
> unsigned long no_pre_delete = (2UL<<num_parent);
> diff --git a/diff.c b/diff.c
> index 87fa16b730..59a9286aea 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -57,7 +57,7 @@ static int diff_detect_rename_default;
> static int diff_indent_heuristic = 1;
> static int diff_rename_limit_default = 1000;
> static int diff_suppress_blank_empty;
> -static enum git_colorbool diff_use_color_default = GIT_COLOR_UNKNOWN;
> +static git_colorbool diff_use_color_default = {GIT_COLOR_UNKNOWN};
> static int diff_color_moved_default;
> static int diff_color_moved_ws_default;
> static int diff_context_default = 3;
> @@ -595,7 +595,7 @@ static struct diff_tempfile {
> } diff_temp[2];
>
> struct emit_callback {
> - int color_diff;
> + git_colorbool color_diff;
> unsigned ws_rule;
> int blank_at_eof_in_preimage;
> int blank_at_eof_in_postimage;
> @@ -2303,7 +2303,7 @@ static void free_diff_words_data(struct emit_callback *ecbdata)
> }
> }
>
> -const char *diff_get_color(enum git_colorbool diff_use_color, enum color_diff ix)
> +const char *diff_get_color(git_colorbool diff_use_color, enum color_diff ix)
> {
> if (want_color(diff_use_color))
> return diff_colors[ix];
> @@ -4497,7 +4497,7 @@ static void fill_metainfo(struct strbuf *msg,
> struct diff_options *o,
> struct diff_filepair *p,
> int *must_show_header,
> - enum git_colorbool use_color)
> + git_colorbool use_color)
> {
> const char *set = diff_get_color(use_color, DIFF_METAINFO);
> const char *reset = diff_get_color(use_color, DIFF_RESET);
> @@ -4596,7 +4596,7 @@ static void run_diff_cmd(const struct external_diff *pgm,
> */
> fill_metainfo(msg, name, other, one, two, o, p,
> &must_show_header,
> - pgm ? GIT_COLOR_NEVER : o->use_color);
> + pgm ? (git_colorbool){GIT_COLOR_NEVER} : o->use_color);
> xfrm_msg = msg->len ? msg->buf : NULL;
> }
>
> @@ -5277,7 +5277,7 @@ static int diff_opt_color_words(const struct option *opt,
> struct diff_options *options = opt->value;
>
> BUG_ON_OPT_NEG(unset);
> - options->use_color = GIT_COLOR_ALWAYS;
> + options->use_color = (git_colorbool){GIT_COLOR_ALWAYS};
> options->word_diff = DIFF_WORDS_COLOR;
> options->word_regex = arg;
> return 0;
> @@ -5458,8 +5458,8 @@ static enum parse_opt_result diff_opt_output(struct parse_opt_ctx_t *ctx,
> path = prefix_filename(ctx->prefix, arg);
> options->file = xfopen(path, "w");
> options->close_file = 1;
> - if (options->use_color != GIT_COLOR_ALWAYS)
> - options->use_color = GIT_COLOR_NEVER;
> + if (options->use_color.f != GIT_COLOR_ALWAYS)
> + options->use_color = (git_colorbool){GIT_COLOR_NEVER};
> free(path);
> return 0;
> }
> @@ -5599,7 +5599,7 @@ static int diff_opt_word_diff(const struct option *opt,
> if (!strcmp(arg, "plain"))
> options->word_diff = DIFF_WORDS_PLAIN;
> else if (!strcmp(arg, "color")) {
> - options->use_color = GIT_COLOR_ALWAYS;
> + options->use_color = (git_colorbool){GIT_COLOR_ALWAYS};
> options->word_diff = DIFF_WORDS_COLOR;
> }
> else if (!strcmp(arg, "porcelain"))
> diff --git a/diff.h b/diff.h
> index bccd86a748..197dcb997f 100644
> --- a/diff.h
> +++ b/diff.h
> @@ -284,7 +284,7 @@ struct diff_options {
> /* diff-filter bits */
> unsigned int filter, filter_not;
>
> - enum git_colorbool use_color;
> + git_colorbool use_color;
>
> /* Number of context lines to generate in patch output. */
> int context;
> @@ -470,7 +470,7 @@ enum color_diff {
> DIFF_FILE_NEW_BOLD = 22,
> };
>
> -const char *diff_get_color(enum git_colorbool diff_use_color, enum color_diff ix);
> +const char *diff_get_color(git_colorbool diff_use_color, enum color_diff ix);
> #define diff_get_color_opt(o, ix) \
> diff_get_color((o)->use_color, ix)
>
> diff --git a/grep.h b/grep.h
> index 13e26a9318..0cc2806cae 100644
> --- a/grep.h
> +++ b/grep.h
> @@ -159,7 +159,7 @@ struct grep_opt {
> int pathname;
> int null_following_name;
> int only_matching;
> - enum git_colorbool color;
> + git_colorbool color;
> int max_depth;
> int funcname;
> int funcbody;
> @@ -198,7 +198,7 @@ struct grep_opt {
> [GREP_COLOR_SEP] = GIT_COLOR_CYAN, \
> }, \
> .only_matching = 0, \
> - .color = GIT_COLOR_UNKNOWN, \
> + .color = {GIT_COLOR_UNKNOWN}, \
> .output = std_output, \
> }
>
> diff --git a/log-tree.c b/log-tree.c
> index a2cd5c587b..df41c5c963 100644
> --- a/log-tree.c
> +++ b/log-tree.c
> @@ -57,7 +57,7 @@ static const char *color_decorate_slots[] = {
> [DECORATION_GRAFTED] = "grafted",
> };
>
> -static const char *decorate_get_color(enum git_colorbool decorate_use_color, enum decoration_type ix)
> +static const char *decorate_get_color(git_colorbool decorate_use_color, enum decoration_type ix)
> {
> if (want_color(decorate_use_color))
> return decoration_colors[ix];
> @@ -341,7 +341,7 @@ static void show_name(struct strbuf *sb, const struct name_decoration *decoratio
> */
> void format_decorations(struct strbuf *sb,
> const struct commit *commit,
> - enum git_colorbool use_color,
> + git_colorbool use_color,
> const struct decoration_options *opts)
> {
> const struct name_decoration *decoration;
> diff --git a/log-tree.h b/log-tree.h
> index 1c82380d95..43ab208a7d 100644
> --- a/log-tree.h
> +++ b/log-tree.h
> @@ -26,7 +26,7 @@ int log_tree_diff_flush(struct rev_info *);
> int log_tree_commit(struct rev_info *, struct commit *);
> void show_log(struct rev_info *opt);
> void format_decorations(struct strbuf *sb, const struct commit *commit,
> - enum git_colorbool use_color, const struct decoration_options *opts);
> + git_colorbool use_color, const struct decoration_options *opts);
> void show_decorations(struct rev_info *opt, struct commit *commit);
> void log_write_email_headers(struct rev_info *opt, struct commit *commit,
> char **extra_headers_p,
> diff --git a/parse-options-cb.c b/parse-options-cb.c
> index 976cc86385..5f0e027139 100644
> --- a/parse-options-cb.c
> +++ b/parse-options-cb.c
> @@ -50,15 +50,15 @@ int parse_opt_expiry_date_cb(const struct option *opt, const char *arg,
> int parse_opt_color_flag_cb(const struct option *opt, const char *arg,
> int unset)
> {
> - enum git_colorbool value;
> + git_colorbool value;
>
> if (!arg)
> arg = unset ? "never" : (const char *)opt->defval;
> value = git_config_colorbool(NULL, arg);
> - if (value == GIT_COLOR_UNKNOWN)
> + if (value.f == GIT_COLOR_UNKNOWN)
> return error(_("option `%s' expects \"always\", \"auto\", or \"never\""),
> opt->long_name);
> - *(int *)opt->value = value;
> + *(git_colorbool *)opt->value = value;
> return 0;
> }
>
> diff --git a/pretty.c b/pretty.c
> index e0646bbc5d..fcf7ee3d78 100644
> --- a/pretty.c
> +++ b/pretty.c
> @@ -470,7 +470,7 @@ static inline void strbuf_add_with_color(struct strbuf *sb, const char *color,
>
> static void append_line_with_color(struct strbuf *sb, struct grep_opt *opt,
> const char *line, size_t linelen,
> - enum git_colorbool color, enum grep_context ctx,
> + git_colorbool color, enum grep_context ctx,
> enum grep_header_field field)
> {
> const char *buf, *eol, *line_color, *match_color;
> @@ -899,7 +899,7 @@ struct format_commit_context {
> const char *message;
> char *commit_encoding;
> size_t width, indent1, indent2;
> - enum git_colorbool auto_color;
> + git_colorbool auto_color;
> int padding;
>
> /* These offsets are relative to the start of the commit message. */
> @@ -1462,7 +1462,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
> } else {
> int ret = parse_color(sb, placeholder, c);
> if (ret)
> - c->auto_color = GIT_COLOR_NEVER;
> + c->auto_color = (git_colorbool){GIT_COLOR_NEVER};
> /*
> * Otherwise, we decided to treat %C<unknown>
> * as a literal string, and the previous
> @@ -2167,7 +2167,7 @@ static int pp_utf8_width(const char *start, const char *end)
> }
>
> static void strbuf_add_tabexpand(struct strbuf *sb, struct grep_opt *opt,
> - enum git_colorbool color, int tabwidth, const char *line,
> + git_colorbool color, int tabwidth, const char *line,
> int linelen)
> {
> const char *tab;
> diff --git a/pretty.h b/pretty.h
> index fac699033e..915c866c53 100644
> --- a/pretty.h
> +++ b/pretty.h
> @@ -47,7 +47,7 @@ struct pretty_print_context {
> struct rev_info *rev;
> const char *output_encoding;
> struct string_list *mailmap;
> - enum git_colorbool color;
> + git_colorbool color;
> struct ident_split *from_ident;
> unsigned encode_email_headers:1;
> struct pretty_print_describe_status *describe_status;
> diff --git a/ref-filter.h b/ref-filter.h
> index 81f2c229a9..66f96a330a 100644
> --- a/ref-filter.h
> +++ b/ref-filter.h
> @@ -95,7 +95,7 @@ struct ref_format {
> const char *format;
> const char *rest;
> int quote_style;
> - enum git_colorbool use_color;
> + git_colorbool use_color;
>
> /* Internal state to ref-filter */
> int need_color_reset_at_eol;
> @@ -111,7 +111,7 @@ struct ref_format {
> .exclude = STRVEC_INIT, \
> }
> #define REF_FORMAT_INIT { \
> - .use_color = GIT_COLOR_UNKNOWN, \
> + .use_color = {GIT_COLOR_UNKNOWN}, \
> }
>
> /* Macros for checking --merged and --no-merged options */
> diff --git a/sequencer.c b/sequencer.c
> index 9ae40a91b2..56999de1ec 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -3732,7 +3732,7 @@ static int make_patch(struct repository *r,
> log_tree_opt.disable_stdin = 1;
> log_tree_opt.no_commit_id = 1;
> log_tree_opt.diffopt.file = fopen(rebase_path_patch(), "w");
> - log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
> + log_tree_opt.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> if (!log_tree_opt.diffopt.file)
> res |= error_errno(_("could not open '%s'"),
> rebase_path_patch());
> diff --git a/sideband.c b/sideband.c
> index ea7c25211e..fb7b6a7e46 100644
> --- a/sideband.c
> +++ b/sideband.c
> @@ -27,24 +27,24 @@ static struct keyword_entry keywords[] = {
> };
>
> /* Returns a color setting (GIT_COLOR_NEVER, etc). */
> -static enum git_colorbool use_sideband_colors(void)
> +static git_colorbool use_sideband_colors(void)
> {
> - static enum git_colorbool use_sideband_colors_cached = GIT_COLOR_UNKNOWN;
> + static git_colorbool use_sideband_colors_cached = {GIT_COLOR_UNKNOWN};
>
> const char *key = "color.remote";
> struct strbuf sb = STRBUF_INIT;
> const char *value;
> int i;
>
> - if (use_sideband_colors_cached != GIT_COLOR_UNKNOWN)
> + if (use_sideband_colors_cached.f != GIT_COLOR_UNKNOWN)
> return use_sideband_colors_cached;
>
> if (!repo_config_get_string_tmp(the_repository, key, &value))
> use_sideband_colors_cached = git_config_colorbool(key, value);
> else if (!repo_config_get_string_tmp(the_repository, "color.ui", &value))
> use_sideband_colors_cached = git_config_colorbool("color.ui", value);
> else
> - use_sideband_colors_cached = GIT_COLOR_AUTO;
> + use_sideband_colors_cached = (git_colorbool){GIT_COLOR_AUTO};
>
> for (i = 0; i < ARRAY_SIZE(keywords); i++) {
> strbuf_reset(&sb);
> diff --git a/transport.c b/transport.c
> index c7f06a7382..a5f98ba6b6 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -30,7 +30,7 @@
> #include "color.h"
> #include "bundle-uri.h"
>
> -static enum git_colorbool transport_use_color = GIT_COLOR_UNKNOWN;
> +static git_colorbool transport_use_color = {GIT_COLOR_UNKNOWN};
> static char transport_colors[][COLOR_MAXLEN] = {
> GIT_COLOR_RESET,
> GIT_COLOR_RED /* REJECTED */
> diff --git a/wt-status.c b/wt-status.c
> index 8ffe6d3988..0927b88734 100644
> --- a/wt-status.c
> +++ b/wt-status.c
> @@ -148,7 +148,7 @@ void wt_status_prepare(struct repository *r, struct wt_status *s)
> memcpy(s->color_palette, default_wt_status_colors,
> sizeof(default_wt_status_colors));
> s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
> - s->use_color = GIT_COLOR_UNKNOWN;
> + s->use_color = (git_colorbool){GIT_COLOR_UNKNOWN};
> s->relative_paths = 1;
> s->branch = refs_resolve_refdup(get_main_ref_store(the_repository),
> "HEAD", 0, NULL, NULL);
> @@ -1165,7 +1165,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s)
> * before.
> */
> if (s->fp != stdout) {
> - rev.diffopt.use_color = GIT_COLOR_NEVER;
> + rev.diffopt.use_color = (git_colorbool){GIT_COLOR_NEVER};
> wt_status_add_cut_line(s);
> }
> if (s->verbose > 1 && s->committable) {
> @@ -2155,7 +2155,7 @@ static void wt_shortstatus_print(struct wt_status *s)
>
> static void wt_porcelain_print(struct wt_status *s)
> {
> - s->use_color = GIT_COLOR_NEVER;
> + s->use_color = (git_colorbool){GIT_COLOR_NEVER};
> s->relative_paths = 0;
> s->prefix = NULL;
> s->no_gettext = 1;
> diff --git a/wt-status.h b/wt-status.h
> index e40a27214a..5364eaa1f8 100644
> --- a/wt-status.h
> +++ b/wt-status.h
> @@ -111,7 +111,7 @@ struct wt_status {
> int amend;
> enum commit_whence whence;
> int nowarn;
> - enum git_colorbool use_color;
> + git_colorbool use_color;
> int no_gettext;
> int display_comment_prefix;
> int relative_paths;
next prev parent reply other threads:[~2025-09-16 20:35 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-16 20:10 [PATCH 0/13] unraveling the mysteries of color variables Jeff King
2025-09-16 20:12 ` Jeff King
2025-09-16 20:13 ` [PATCH 01/13] color: use GIT_COLOR_* instead of numeric constants Jeff King
2025-09-16 20:14 ` [PATCH 02/13] color: return enum from git_config_colorbool() Jeff King
2025-09-16 20:16 ` [PATCH 03/13] grep: don't treat grep_opt.color as a strict bool Jeff King
2025-09-16 20:17 ` [PATCH 04/13] diff: simplify color_moved check when flushing Jeff King
2025-09-16 20:19 ` [PATCH 05/13] diff: don't use diff_options.use_color as a strict bool Jeff King
2025-09-16 20:20 ` [PATCH 06/13] diff: pass o->use_color directly to fill_metainfo() Jeff King
2025-09-16 20:21 ` [PATCH 07/13] diff: stop passing ecbdata->use_color as boolean Jeff King
2025-09-16 20:22 ` [PATCH 08/13] pretty: use format_commit_context.auto_color as colorbool Jeff King
2025-09-16 20:24 ` [PATCH 09/13] color: use git_colorbool enum to type to store colorbools Jeff King
2025-09-16 23:13 ` [PATCH v1.5 9/13] color: use git_colorbool enum " Jeff King
2025-09-16 20:25 ` [PATCH 10/13] color: return bool from want_color() Jeff King
2025-09-16 20:26 ` [PATCH 11/13] add-interactive: retain colorbool values longer Jeff King
2025-09-16 20:26 ` [PATCH 12/13] config: store want_color() result in a separate bool Jeff King
2025-09-16 20:27 ` [PATCH 13/13 DO NOT APPLY] color: convert git_colorbool into a struct Jeff King
2025-09-16 20:35 ` Junio C Hamano [this message]
2025-09-16 20:28 ` [PATCH 0/13] unraveling the mysteries of color variables Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqplbqm8yu.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).