Am 08.09.20 um 19:39 schrieb Junio C Hamano: > Junio C Hamano <gitster@xxxxxxxxx> 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 don't particularly like how this print* function takes a printf format, but doesn't interpret its remaining arguments like printf does. > - 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. How about something like this then? diff --git a/wt-status.c b/wt-status.c index ff43932402..e0711aff04 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1829,19 +1829,19 @@ 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) +static const char *cquote(const char *in, const char *prefix, struct strbuf *out) { - 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); + struct strbuf sb = STRBUF_INIT; + const char *rel = relative_path(in, prefix, &sb); + int need_quotes = *rel != '"' && strchr(rel, ' '); + strbuf_reset(out); + if (need_quotes) + strbuf_addch(out, '"'); + quote_c_style(rel, out, NULL, 0); + if (need_quotes) + strbuf_addch(out, '"'); + strbuf_release(&sb); + return out->buf; } static void wt_shortstatus_unmerged(struct string_list_item *it, @@ -1849,6 +1849,7 @@ static void wt_shortstatus_unmerged(struct string_list_item *it, { struct wt_status_change_data *d = it->util; const char *how = "??"; + struct strbuf sb = STRBUF_INIT; switch (d->stagemask) { case 1: how = "DD"; break; /* both deleted */ @@ -1863,13 +1864,15 @@ static void wt_shortstatus_unmerged(struct string_list_item *it, if (s->null_termination) fprintf(stdout, " %s%c", it->string, 0); else - print_cquoted(" %s\n", it->string, s->prefix); + printf(" %s\n", cquote(it->string, s->prefix, &sb)); + strbuf_release(&sb); } static void wt_shortstatus_status(struct string_list_item *it, struct wt_status *s) { struct wt_status_change_data *d = it->util; + struct strbuf sb = STRBUF_INIT; if (d->index_status) color_fprintf(s->fp, color(WT_STATUS_UPDATED, s), "%c", d->index_status); @@ -1886,20 +1889,24 @@ static void wt_shortstatus_status(struct string_list_item *it, fprintf(stdout, "%s%c", d->rename_source, 0); } else { if (d->rename_source) - print_cquoted("%s -> ", d->rename_source, s->prefix); - print_cquoted("%s\n", it->string, s->prefix); + printf("%s -> ", cquote(d->rename_source, s->prefix, &sb)); + printf("%s\n", cquote(it->string, s->prefix, &sb)); } + strbuf_release(&sb); } static void wt_shortstatus_other(struct string_list_item *it, struct wt_status *s, const char *sign) { + struct strbuf sb = STRBUF_INIT; + if (s->null_termination) { fprintf(stdout, "%s %s%c", sign, it->string, 0); } else { color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign); - print_cquoted(" %s\n", it->string, s->prefix); + printf(" %s\n", cquote(it->string, s->prefix, &sb)); } + strbuf_release(&sb); } static void wt_shortstatus_print_tracking(struct wt_status *s)