diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2016-07-01 18:03:31 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-07-06 11:48:25 -0700 |
commit | bc437d10202c015a5733f706dc44fa6bbf4d85b9 (patch) | |
tree | 47dfb2453743e78b671584e08d9abe3af9e9d259 /builtin/fetch.c | |
parent | 6bc91f23a6e14d540ab6950b438d40cf678143f0 (diff) | |
download | git-bc437d10202c015a5733f706dc44fa6bbf4d85b9.tar.gz |
fetch: reduce duplicate in ref update status lines with placeholder
In the "remote -> local" line, if either ref is a substring of the
other, the common part in the other string is replaced with "*". For
example
abc -> origin/abc
refs/pull/123/head -> pull/123
become
abc -> origin/*
refs/*/head -> pull/123
Activated with fetch.output=compact.
For the record, this output is not perfect. A single giant ref can
push all refs very far to the right and likely be wrapped around. We
may have a few options:
- exclude these long lines smarter
- break the line after "->", exclude it from column width calculation
- implement a new format, { -> origin/}foo, which makes the problem
go away at the cost of a bit harder to read
- reverse all the arrows so we have "* <- looong-ref", again still
hard to read.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/fetch.c')
-rw-r--r-- | builtin/fetch.c | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/builtin/fetch.c b/builtin/fetch.c index 2bc609b7f7..0a2eed1807 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -451,6 +451,7 @@ fail: } static int refcol_width = 10; +static int compact_format; static void adjust_refcol_width(const struct ref *ref) { @@ -462,6 +463,7 @@ static void adjust_refcol_width(const struct ref *ref) max = term_columns(); rlen = utf8_strwidth(prettify_refname(ref->name)); + llen = utf8_strwidth(prettify_refname(ref->peer_ref->name)); /* @@ -470,10 +472,19 @@ static void adjust_refcol_width(const struct ref *ref) * anyway because we don't know if the error explanation part * will be printed in update_local_ref) */ + if (compact_format) { + llen = 0; + max = max * 2 / 3; + } len = 21 /* flag and summary */ + rlen + 4 /* -> */ + llen; if (len >= max) return; + /* + * Not precise calculation for compact mode because '*' can + * appear on the left hand side of '->' and shrink the column + * back. + */ if (refcol_width < rlen) refcol_width = rlen; } @@ -481,6 +492,16 @@ static void adjust_refcol_width(const struct ref *ref) static void prepare_format_display(struct ref *ref_map) { struct ref *rm; + const char *format = "full"; + + git_config_get_string_const("fetch.output", &format); + if (!strcasecmp(format, "full")) + compact_format = 0; + else if (!strcasecmp(format, "compact")) + compact_format = 1; + else + die(_("configuration fetch.output contains invalid value %s"), + format); for (rm = ref_map; rm; rm = rm->next) { if (rm->status == REF_STATUS_REJECT_SHALLOW || @@ -492,12 +513,66 @@ static void prepare_format_display(struct ref *ref_map) } } +static void print_remote_to_local(struct strbuf *display, + const char *remote, const char *local) +{ + strbuf_addf(display, "%-*s -> %s", refcol_width, remote, local); +} + +static int find_and_replace(struct strbuf *haystack, + const char *needle, + const char *placeholder) +{ + const char *p = strstr(haystack->buf, needle); + int plen, nlen; + + if (!p) + return 0; + + if (p > haystack->buf && p[-1] != '/') + return 0; + + plen = strlen(p); + nlen = strlen(needle); + if (plen > nlen && p[nlen] != '/') + return 0; + + strbuf_splice(haystack, p - haystack->buf, nlen, + placeholder, strlen(placeholder)); + return 1; +} + +static void print_compact(struct strbuf *display, + const char *remote, const char *local) +{ + struct strbuf r = STRBUF_INIT; + struct strbuf l = STRBUF_INIT; + + if (!strcmp(remote, local)) { + strbuf_addf(display, "%-*s -> *", refcol_width, remote); + return; + } + + strbuf_addstr(&r, remote); + strbuf_addstr(&l, local); + + if (!find_and_replace(&r, local, "*")) + find_and_replace(&l, remote, "*"); + print_remote_to_local(display, r.buf, l.buf); + + strbuf_release(&r); + strbuf_release(&l); +} + static void format_display(struct strbuf *display, char code, const char *summary, const char *error, const char *remote, const char *local) { strbuf_addf(display, "%c %-*s ", code, TRANSPORT_SUMMARY(summary)); - strbuf_addf(display, "%-*s -> %s", refcol_width, remote, local); + if (!compact_format) + print_remote_to_local(display, remote, local); + else + print_compact(display, remote, local); if (error) strbuf_addf(display, " (%s)", error); } |