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