status: make coloring of "-z --short" consistent

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>

Jeff King committed Oct 17, 2025 at 04:44 UTC 50927f4f683a35ad1c76c8a02a1759a076d3f8f8
2 files changed +13 -2
t/t7508-status.sh
+11
@@ -717,6 +717,17 @@ test_expect_success TTY 'status -s with color.status' '
717
718 '
719
720 +test_expect_success TTY 'status -s keeps colors with -z' '
721 + test_when_finished "rm -f output.*" &&
722 + test_terminal git status -s -z >output.raw &&
723 + # convert back to newlines to avoid portability issues with
724 + # test_decode_color and test_cmp, and to let us use the same expected
725 + # output as earlier tests
726 + tr "\0" "\n" <output.raw >output.nl &&
727 + test_decode_color <output.nl >output &&
728 + test_cmp expect output
729 +'
730 +
731 cat >expect <<\EOF
732 ## <YELLOW>main<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>]
733 <RED>M<RESET> dir1/modified
wt-status.c
+2 -2
@@ -2051,13 +2051,13 @@ static void wt_shortstatus_status(struct string_list_item *it,
2051 static void wt_shortstatus_other(struct string_list_item *it,
2052 struct wt_status *s, const char *sign)
2053 {
2054 + color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
2055 if (s->null_termination) {
2055 - fprintf(s->fp, "%s %s%c", sign, it->string, 0);
2056 + fprintf(s->fp, " %s%c", it->string, 0);
2057 } else {
2058 struct strbuf onebuf = STRBUF_INIT;
2059 const char *one;
2060 one = quote_path(it->string, s->prefix, &onebuf, QUOTE_PATH_QUOTE_SP);
2060 - color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
2061 fprintf(s->fp, " %s\n", one);
2062 strbuf_release(&onebuf);
2063 }