The documentation for git status --short says this: If a filename contains whitespace or other nonprintable characters, that field will be quoted in the manner of a C string literal: surrounded by ASCII double quote (34) characters, and with interior special characters backslash-escaped. Note that this differs from our typical quoting rule, which does not include spaces. If we did not quote spaces, our output would be ambiguous for renames. However, we failed to do this correctly for untracked files. If we list an untracked file that contains spaces, we fail to quote it. Since this is both inconsistent and not what was documented, let's fix it by quoting untracked files in the same way as tracked files. Users parsing this output already need to handle quoted names for tracked files (or use -z) so this shouldn't be an incompatible change. Note that the test for this case should be portable because all known modern systems support spaces in file names and our test trash directories use them already. Reported-by: Patrick Fong <patrickf3139@xxxxxxxxx> Signed-off-by: brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> --- t/t7508-status.sh | 21 +++++++++++++++++++++ wt-status.c | 8 +++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/t/t7508-status.sh b/t/t7508-status.sh index e81759319f..ef8d19c151 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -814,6 +814,27 @@ test_expect_success 'status -s without relative paths' ' ' +cat >expect <<\EOF + M dir1/modified +A dir2/added +A "file with spaces" +?? dir1/untracked +?? dir2/modified +?? dir2/untracked +?? "file with spaces 2" +?? untracked +EOF + +test_expect_success 'status -s without relative paths' ' + test_when_finished "git rm --cached \"file with spaces\"; rm -f file*" && + >"file with spaces" && + >"file with spaces 2" && + git add "file with spaces" && + git status -s >output && + test_cmp expect output + +' + test_expect_success 'dry-run of partial commit excluding new file in index' ' cat >expect <<EOF && On branch master diff --git a/wt-status.c b/wt-status.c index bb0f9120de..bea6cf98b1 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1909,7 +1909,13 @@ static void wt_shortstatus_other(struct string_list_item *it, const char *one; one = quote_path(it->string, s->prefix, &onebuf); color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign); - printf(" %s\n", one); + putchar(' '); + if (*one != '"' && strchr(one, ' ') != NULL) { + putchar('"'); + strbuf_addch(&onebuf, '"'); + one = onebuf.buf; + } + printf("%s\n", one); strbuf_release(&onebuf); } }