All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "brian m. carlson" <sandals@crustytoothpaste.net>
Cc: Patrick Fong <patrickf3139@gmail.com>, git@vger.kernel.org
Subject: Re: [Bug report] git status doesn't escape paths of untracked files
Date: Tue, 08 Sep 2020 10:39:46 -0700	[thread overview]
Message-ID: <xmqq4ko8yxp9.fsf@gitster.c.googlers.com> (raw)
In-Reply-To: <xmqq5z8p12ds.fsf@gitster.c.googlers.com> (Junio C. Hamano's message of "Mon, 07 Sep 2020 18:30:23 -0700")

Junio C Hamano <gitster@pobox.com> writes:

> I agree with your "the special case handling needs to be taught to
> the wt_shortstatus_other()"; a refactored helper function called
> by both places would help.

I came up with this.

 - I very much like the fact that I got rid of the "directly print
   dq and then feed the remainder of (un)quoted path plus trailing
   dq to the normal printing logic" from print_cquoted(), even
   though strbuf_insertstr() a single byte to the beginning of the
   buffer feels a bit wasteful.

 - I think the short status output for unmerged paths deserve the
   same quoting treatment, so an extra helper function pays off even
   better than our plan to fix "untracked/ignored".

 - I am undecided if I like that the helper formats and also prints;
   I was hoping I can come up with a pure formatting helper that
   does not do I/O but it seems to be hard to arrange for the
   current callers.

It seems to pass your tests, but I am not sure how good our test
coverage is around this area.

I see some mixed use of stdout and s->fp in the vicinity together
with "fprintf(stdout, ...)". We may want to clean them up someday,
by the way.

 wt-status.c | 56 ++++++++++++++++++++++----------------------------------
 1 file changed, 22 insertions(+), 34 deletions(-)

diff --git c/wt-status.c w/wt-status.c
index bb0f9120de..ff43932402 100644
--- c/wt-status.c
+++ w/wt-status.c
@@ -1829,6 +1829,21 @@ static void wt_longstatus_print(struct wt_status *s)
 		wt_longstatus_print_stash_summary(s);
 }
 
+static void print_cquoted(const char *fmt, const char *path, const char *prefix)
+{
+	struct strbuf onebuf = STRBUF_INIT;
+	const char *one;
+
+	one = quote_path(path, prefix, &onebuf);
+	if (*one != '"' && strchr(one, ' ')) {
+		strbuf_insertstr(&onebuf, 0, "\"");
+		strbuf_addch(&onebuf, '"');
+		one = onebuf.buf;
+	}
+	printf(fmt, one);
+	strbuf_release(&onebuf);
+}
+
 static void wt_shortstatus_unmerged(struct string_list_item *it,
 			   struct wt_status *s)
 {
@@ -1845,15 +1860,10 @@ static void wt_shortstatus_unmerged(struct string_list_item *it,
 	case 7: how = "UU"; break; /* both modified */
 	}
 	color_fprintf(s->fp, color(WT_STATUS_UNMERGED, s), "%s", how);
-	if (s->null_termination) {
+	if (s->null_termination)
 		fprintf(stdout, " %s%c", it->string, 0);
-	} else {
-		struct strbuf onebuf = STRBUF_INIT;
-		const char *one;
-		one = quote_path(it->string, s->prefix, &onebuf);
-		printf(" %s\n", one);
-		strbuf_release(&onebuf);
-	}
+	else
+		print_cquoted(" %s\n", it->string, s->prefix);
 }
 
 static void wt_shortstatus_status(struct string_list_item *it,
@@ -1875,27 +1885,9 @@ static void wt_shortstatus_status(struct string_list_item *it,
 		if (d->rename_source)
 			fprintf(stdout, "%s%c", d->rename_source, 0);
 	} else {
-		struct strbuf onebuf = STRBUF_INIT;
-		const char *one;
-
-		if (d->rename_source) {
-			one = quote_path(d->rename_source, s->prefix, &onebuf);
-			if (*one != '"' && strchr(one, ' ') != NULL) {
-				putchar('"');
-				strbuf_addch(&onebuf, '"');
-				one = onebuf.buf;
-			}
-			printf("%s -> ", one);
-			strbuf_release(&onebuf);
-		}
-		one = quote_path(it->string, s->prefix, &onebuf);
-		if (*one != '"' && strchr(one, ' ') != NULL) {
-			putchar('"');
-			strbuf_addch(&onebuf, '"');
-			one = onebuf.buf;
-		}
-		printf("%s\n", one);
-		strbuf_release(&onebuf);
+		if (d->rename_source)
+			print_cquoted("%s -> ", d->rename_source, s->prefix);
+		print_cquoted("%s\n", it->string, s->prefix);
 	}
 }
 
@@ -1905,12 +1897,8 @@ static void wt_shortstatus_other(struct string_list_item *it,
 	if (s->null_termination) {
 		fprintf(stdout, "%s %s%c", sign, it->string, 0);
 	} else {
-		struct strbuf onebuf = STRBUF_INIT;
-		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);
-		strbuf_release(&onebuf);
+		print_cquoted(" %s\n", it->string, s->prefix);
 	}
 }
 

  parent reply	other threads:[~2020-09-08 17:41 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-08  0:28 [Bug report] git status doesn't escape paths of untracked files Patrick Fong
2020-09-08  1:13 ` Junio C Hamano
2020-09-08  1:17 ` brian m. carlson
2020-09-08  1:30   ` Junio C Hamano
2020-09-08  4:41     ` Junio C Hamano
2020-09-08 17:39     ` Junio C Hamano [this message]
2020-09-08 19:01       ` Martin Ågren
2020-09-08 21:06       ` René Scharfe
2020-09-09 22:22         ` Junio C Hamano
2020-09-10 14:23           ` René Scharfe
2020-09-10 15:28             ` Junio C Hamano
2020-09-08  1:30 ` [PATCH] wt-status: quote paths identically whether tracked or untracked brian m. carlson
2020-09-08 20:52   ` [PATCH 0/6] quote_path() clean-ups Junio C Hamano
2020-09-08 20:52     ` [PATCH 1/6] quote_path: rename quote_path_relative() to quote_path() Junio C Hamano
2020-09-08 20:52     ` [PATCH 2/6] quote_path: give flags parameter " Junio C Hamano
2020-09-10 12:21       ` Jeff King
2020-09-10 15:04         ` Junio C Hamano
2020-09-10 15:17           ` Junio C Hamano
2020-09-10 20:26             ` Jeff King
2020-09-08 20:52     ` [PATCH 3/6] quote_path: optionally allow quoting a path with SP in it Junio C Hamano
2020-09-10 12:35       ` Jeff King
2020-09-08 20:52     ` [PATCH 4/6] wt-status: consistently quote paths in "status --short" output Junio C Hamano
2020-09-08 20:52     ` [PATCH 5/6] quote: rename misnamed sq_lookup[] to cq_lookup[] Junio C Hamano
2020-09-08 20:52     ` [PATCH 6/6] quote: turn 'nodq' parameter into a set of flags Junio C Hamano
2020-09-10 12:38       ` Jeff King
2020-09-08 22:56     ` [PATCH 0/6] quote_path() clean-ups Chris Torek
2020-09-10 12:39     ` Jeff King
2020-09-10 17:01     ` [PATCH v2 0/7] " Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 1/7] quote_path: rename quote_path_relative() to quote_path() Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 2/7] quote_path: give flags parameter " Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 3/7] quote_path: optionally allow quoting a path with SP in it Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 4/7] quote_path: code clarification Junio C Hamano
2020-09-10 18:08         ` Jeff King
2020-09-10 18:40           ` Junio C Hamano
2020-09-10 19:29             ` Jeff King
2020-09-10 17:01       ` [PATCH v2 5/7] wt-status: consistently quote paths in "status --short" output Junio C Hamano
2020-09-10 18:13         ` Jeff King
2020-09-10 18:38           ` Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 6/7] quote: rename misnamed sq_lookup[] to cq_lookup[] Junio C Hamano
2020-09-10 17:01       ` [PATCH v2 7/7] quote: turn 'nodq' parameter into a set of flags Junio C Hamano
2020-09-10 23:03       ` [PATCH v2 0/7] quote_path() clean-ups brian m. carlson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqq4ko8yxp9.fsf@gitster.c.googlers.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=patrickf3139@gmail.com \
    --cc=sandals@crustytoothpaste.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.