summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2020-09-10 10:01:55 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-09-10 10:49:20 -0700
commitf3fc4a1b8680c114defd98ce6f2429f8946a5dc1 (patch)
tree4d40269465613f8ae72d3029a43234c9dbeed2a4
parentquote_path: give flags parameter to quote_path() (diff)
downloadtgif-f3fc4a1b8680c114defd98ce6f2429f8946a5dc1.tar.xz
quote_path: optionally allow quoting a path with SP in it
Some code in wt-status.c special case a path with SP in it, which usually does not have to be c-quoted, and ensure that such a path does get quoted. Move the logic to quote_path() and give it a bit in the flags word, QUOTE_PATH_QUOTE_SP. No behaviour change intended. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--quote.c7
-rw-r--r--quote.h1
-rw-r--r--wt-status.c15
3 files changed, 11 insertions, 12 deletions
diff --git a/quote.c b/quote.c
index a86f9f22a2..aa9a37b1b1 100644
--- a/quote.c
+++ b/quote.c
@@ -360,6 +360,13 @@ char *quote_path(const char *in, const char *prefix, struct strbuf *out, unsigne
quote_c_style_counted(rel, strlen(rel), out, NULL, 0);
strbuf_release(&sb);
+ if ((flags & QUOTE_PATH_QUOTE_SP) &&
+ (out->buf[0] != '"' && strchr(out->buf, ' '))) {
+ /* Ensure the whole thing is quoted if the path has SP in it */
+ strbuf_insertstr(out, 0, "\"");
+ strbuf_addch(out, '"');
+ }
+
return out->buf;
}
diff --git a/quote.h b/quote.h
index 4687b5daf4..1918d1e00e 100644
--- a/quote.h
+++ b/quote.h
@@ -73,6 +73,7 @@ void write_name_quoted_relative(const char *name, const char *prefix,
/* quote path as relative to the given prefix */
char *quote_path(const char *in, const char *prefix, struct strbuf *out, unsigned flags);
+#define QUOTE_PATH_QUOTE_SP 01
/* quoting as a string literal for other languages */
void perl_quote_buf(struct strbuf *sb, const char *src);
diff --git a/wt-status.c b/wt-status.c
index d6ca7bd52c..adbf6958bd 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1877,21 +1877,12 @@ static void wt_shortstatus_status(struct string_list_item *it,
const char *one;
if (d->rename_source) {
- one = quote_path(d->rename_source, s->prefix, &onebuf, 0);
- if (*one != '"' && strchr(one, ' ') != NULL) {
- putchar('"');
- strbuf_addch(&onebuf, '"');
- one = onebuf.buf;
- }
+ one = quote_path(d->rename_source, s->prefix, &onebuf,
+ QUOTE_PATH_QUOTE_SP);
printf("%s -> ", one);
strbuf_release(&onebuf);
}
- one = quote_path(it->string, s->prefix, &onebuf, 0);
- if (*one != '"' && strchr(one, ' ') != NULL) {
- putchar('"');
- strbuf_addch(&onebuf, '"');
- one = onebuf.buf;
- }
+ one = quote_path(it->string, s->prefix, &onebuf, QUOTE_PATH_QUOTE_SP);
printf("%s\n", one);
strbuf_release(&onebuf);
}