diff mbox series

wt-status: quote paths identically whether tracked or untracked

Message ID 20200908013013.1099937-1-sandals@crustytoothpaste.net (mailing list archive)
State New, archived
Headers show
Series wt-status: quote paths identically whether tracked or untracked | expand

Commit Message

brian m. carlson Sept. 8, 2020, 1:30 a.m. UTC
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@gmail.com>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
 t/t7508-status.sh | 21 +++++++++++++++++++++
 wt-status.c       |  8 +++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)
diff mbox series


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
+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);