color: add color_parse_quietly()

When parsing colors, a failed parse leads to an error message due to the result returning error(). To allow for quiet parsing, create color_parse_quietly(). This is in contrast to an ..._gently() version because the original does not die(), so both options are technically 'gentle'. To accomplish this, convert the implementation of color_parse_mem() into a static color_parse_mem_1() helper that adds a 'quiet' parameter. The color_parse_quietly() method can then use this. Since it is a near equivalent to color_parse(), move that method down in the file so they can be nearby while also appearing after color_parse_mem_1(). Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Feb 23, 2026 at 12:26 UTC db45e4908d6711ddc3094cb079c85278691c8267
2 files changed +19 -7
color.c
+18 -7
@@ -223,11 +223,6 @@ static int parse_attr(const char *name, size_t len)
223 return -1;
224 }
225
226 -int color_parse(const char *value, char *dst)
227 -{
228 - return color_parse_mem(value, strlen(value), dst);
229 -}
230 -
226 /*
227 * Write the ANSI color codes for "c" to "out"; the string should
228 * already have the ANSI escape code in it. "out" should have enough
@@ -264,7 +259,8 @@ static int color_empty(const struct color *c)
259 return c->type <= COLOR_NORMAL;
260 }
261
267 -int color_parse_mem(const char *value, int value_len, char *dst)
262 +static int color_parse_mem_1(const char *value, int value_len,
263 + char *dst, int quiet)
264 {
265 const char *ptr = value;
266 int len = value_len;
@@ -365,10 +361,25 @@ int color_parse_mem(const char *value, int value_len, char *dst)
361 OUT(0);
362 return 0;
363 bad:
368 - return error(_("invalid color value: %.*s"), value_len, value);
364 + return quiet ? -1 : error(_("invalid color value: %.*s"), value_len, value);
365 #undef OUT
366 }
367
368 +int color_parse_mem(const char *value, int value_len, char *dst)
369 +{
370 + return color_parse_mem_1(value, value_len, dst, 0);
371 +}
372 +
373 +int color_parse(const char *value, char *dst)
374 +{
375 + return color_parse_mem(value, strlen(value), dst);
376 +}
377 +
378 +int color_parse_quietly(const char *value, char *dst)
379 +{
380 + return color_parse_mem_1(value, strlen(value), dst, 1);
381 +}
382 +
383 enum git_colorbool git_config_colorbool(const char *var, const char *value)
384 {
385 if (value) {
color.h
+1
@@ -118,6 +118,7 @@ bool want_color_fd(int fd, enum git_colorbool var);
118 * terminal.
119 */
120 int color_parse(const char *value, char *dst);
121 +int color_parse_quietly(const char *value, char *dst);
122 int color_parse_mem(const char *value, int len, char *dst);
123
124 /*