On Fri, Nov 10, 2017 at 09:52:16AM +0900, Junio C Hamano wrote: > > That said, if this is the only place that has this funny quoting, it may > > not be worth polluting the rest of the code with the idea that quoting > > spaces is a good thing to do. > > Sounds sane. We can probably use a helper like this: > > static char *quote_path_with_sp(const char *in, const char *prefix, struct strbuf *out) > { > const char dq = '"'; > > quote_path(in, prefix, out); > if (out->buf[0] != dq && strchr(out->buf, ' ') != NULL) { > strbuf_insert(out, 0, &dq, 1); > strbuf_addch(out, dq); > } > return out->buf; > } > > which allows the current users like shortstatus_status() to become a > lot shorter. Are there callers who don't just print the result? If not, we could just always emit. That's slightly more efficient since it drops the expensive strbuf_insert (though there are already so many copies going on in quote_path_relative that it hardly matters). But it also drops the need for the caller to know about the strbuf at all. Like: diff --git a/wt-status.c b/wt-status.c index 937a87bbd5..4f4706a6e2 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1703,6 +1703,18 @@ static void wt_shortstatus_unmerged(struct string_list_item *it, } } +static void emit_path(const char *in, const char *prefix) +{ + struct strbuf buf = STRBUF_INIT; + quote_path(in, prefix, &buf); + if (buf.buf[0] != '"' && strchr(buf.buf, ' ') != NULL) { + putchar('"'); + strbuf_addch(&buf, '"'); + } + fwrite(buf.buf, 1, buf.len, stdout); + strbuf_release(&buf); +} + static void wt_shortstatus_status(struct string_list_item *it, struct wt_status *s) { @@ -1722,26 +1734,12 @@ static void wt_shortstatus_status(struct string_list_item *it, if (d->head_path) fprintf(stdout, "%s%c", d->head_path, 0); } else { - struct strbuf onebuf = STRBUF_INIT; - const char *one; if (d->head_path) { - one = quote_path(d->head_path, s->prefix, &onebuf); - if (*one != '"' && strchr(one, ' ') != NULL) { - putchar('"'); - strbuf_addch(&onebuf, '"'); - one = onebuf.buf; - } - printf("%s -> ", one); - strbuf_release(&onebuf); + emit_path(d->head_path, s->prefix); + printf(" -> "); } - 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); + emit_path(it->string, s->prefix); + putchar('\n'); } } Though really I am fine with any solution that puts this pattern into a helper function rather than repeating it inline. -Peff