Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- This looks a bit ugly because quote_crlf() is now also called on the untracked files, which are not NUL terminated. Maybe someone has an idea how to do this more elegantly. builtin-runstatus.c | 1 + wt-status.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- wt-status.h | 1 + 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/builtin-runstatus.c b/builtin-runstatus.c index 2db25c8..8d167a9 100644 --- a/builtin-runstatus.c +++ b/builtin-runstatus.c @@ -14,6 +14,7 @@ int cmd_runstatus(int argc, const char **argv, const char *prefix) git_config(git_status_config); wt_status_prepare(&s); + s.prefix = prefix; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "--color")) diff --git a/wt-status.c b/wt-status.c index 03b5ec4..7386d41 100644 --- a/wt-status.c +++ b/wt-status.c @@ -82,16 +82,48 @@ static void wt_status_print_trailer(struct wt_status *s) color_fprintf_ln(s->fp, color(WT_STATUS_HEADER), "#"); } -static const char *quote_crlf(const char *in, char *buf, size_t sz) +static const char *quote_crlf(const char *in, int len, char *buf, size_t sz, + const char *prefix) { const char *scan; char *out; const char *ret = in; + int off = 0; + + if (len < 0) + len = strlen(in); + + if (prefix) { + while (prefix[off] && off < len && prefix[off] == in[off]) + if (prefix[off] == '/') { + prefix += off + 1; + in += off + 1; + len -= off + 1; + off = 0; + } else + off++; + for (off = 0; *prefix; prefix++) + if (*prefix == '/') { + if (off + 4 >= sz) { + warning ("Could not prefix path: %s", + in); + return in; + } + strcpy(buf + off, "../"); + off += 3; + } + ret = buf; + } - for (scan = in, out = buf; *scan; scan++) { + for (scan = in, out = buf + off; len; scan++, len--) { int ch = *scan; int quoted; + if (out - buf + 3 >= sz) { + warning ("Could not quote path: %s", in); + break; + } + switch (ch) { case '\n': quoted = 'n'; @@ -118,8 +150,8 @@ static void wt_status_print_filepair(struct wt_status *s, const char *one, *two; char onebuf[PATH_MAX], twobuf[PATH_MAX]; - one = quote_crlf(p->one->path, onebuf, sizeof(onebuf)); - two = quote_crlf(p->two->path, twobuf, sizeof(twobuf)); + one = quote_crlf(p->one->path, -1, onebuf, sizeof(onebuf), s->prefix); + two = quote_crlf(p->two->path, -1, twobuf, sizeof(twobuf), s->prefix); color_fprintf(s->fp, color(WT_STATUS_HEADER), "#\t"); switch (p->status) { @@ -215,8 +247,8 @@ static void wt_status_print_initial(struct wt_status *s) for (i = 0; i < active_nr; i++) { color_fprintf(s->fp, color(WT_STATUS_HEADER), "#\t"); color_fprintf_ln(s->fp, color(WT_STATUS_UPDATED), "new file: %s", - quote_crlf(active_cache[i]->name, - buf, sizeof(buf))); + quote_crlf(active_cache[i]->name, -1, + buf, sizeof(buf), s->prefix)); } if (active_nr) wt_status_print_trailer(s); @@ -254,6 +286,7 @@ static void wt_status_print_untracked(struct wt_status *s) const char *x; int i; int shown_header = 0; + char buf[PATH_MAX]; memset(&dir, 0, sizeof(dir)); @@ -291,8 +324,9 @@ static void wt_status_print_untracked(struct wt_status *s) shown_header = 1; } color_fprintf(s->fp, color(WT_STATUS_HEADER), "#\t"); - color_fprintf_ln(s->fp, color(WT_STATUS_UNTRACKED), "%.*s", - ent->len, ent->name); + color_fprintf_ln(s->fp, color(WT_STATUS_UNTRACKED), "%s", + quote_crlf(ent->name, ent->len, + buf, sizeof(buf), s->prefix)); } } diff --git a/wt-status.h b/wt-status.h index 7744932..f58ebcb 100644 --- a/wt-status.h +++ b/wt-status.h @@ -23,6 +23,7 @@ struct wt_status { int workdir_untracked; const char *index_file; FILE *fp; + const char *prefix; }; int git_status_config(const char *var, const char *value); -- 1.5.3.5.1597.g7191 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html