]> git.ipfire.org Git - thirdparty/git.git/commitdiff
status: make coloring of "-z --short" consistent
authorJeff King <peff@peff.net>
Fri, 17 Oct 2025 08:44:55 +0000 (04:44 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 Oct 2025 21:30:42 +0000 (14:30 -0700)
When running "git status -z --short", the marker on modified index
entries (e.g., "M") is colorized, but the "??" marker for untracked
entries is not. Let's fix the "??" entries to show color here.

At first glance you might think that neither should be colorized, as
usually one would use "-z" to get machine-readable output. But this is a
tricky and unusual case. We have two output formats, "--short" and
"--porcelain" which are substantially similar, but differ in that
"--short" is for humans who want something short and "--porcelain" is
for machines. And "-z" by itself, without any other output option, does
default to "--porcelain", so "git status -z" will not colorize anything.

But if you explicitly ask for "-z" and "--short" together, then that is
asking for the human-readable output, but separated by NULs. This is
unlikely to be useful directly, but could for example be used if the
output will be shown to a human outside of the terminal. At any rate,
the current behavior is clearly wrong (since we colorize some things but
not others), and I think colorizing everything is the least-surprising
thing we can do here.

Reported-by: Langbart <Langbart@protonmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t7508-status.sh
wt-status.c

index cdc1d6fcc78f490f9ea2309f30b0f710e65a3748..abad229e9d9edae744a3c9bbae9d1b2fc0091248 100755 (executable)
@@ -717,6 +717,17 @@ test_expect_success TTY 'status -s with color.status' '
 
 '
 
+test_expect_success TTY 'status -s keeps colors with -z' '
+       test_when_finished "rm -f output.*" &&
+       test_terminal git status -s -z >output.raw &&
+       # convert back to newlines to avoid portability issues with
+       # test_decode_color and test_cmp, and to let us use the same expected
+       # output as earlier tests
+       tr "\0" "\n" <output.raw >output.nl &&
+       test_decode_color <output.nl >output &&
+       test_cmp expect output
+'
+
 cat >expect <<\EOF
 ## <YELLOW>main<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>]
  <RED>M<RESET> dir1/modified
index 454601afa15a951adb6b70ae0687485a4448ed68..d6917f0a832d8064dc08cf2ab44ca8cd3b966caa 100644 (file)
@@ -2051,13 +2051,13 @@ static void wt_shortstatus_status(struct string_list_item *it,
 static void wt_shortstatus_other(struct string_list_item *it,
                                 struct wt_status *s, const char *sign)
 {
+       color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
        if (s->null_termination) {
-               fprintf(s->fp, "%s %s%c", sign, it->string, 0);
+               fprintf(s->fp, " %s%c", it->string, 0);
        } else {
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
                one = quote_path(it->string, s->prefix, &onebuf, QUOTE_PATH_QUOTE_SP);
-               color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
                fprintf(s->fp, " %s\n", one);
                strbuf_release(&onebuf);
        }