From: Yoshioka Tsuneo Date: Fri, 11 Oct 2013 11:24:19 GMT Subject: [PATCH] diff.c: keep arrow(=>) on show_stats()'s shortened filename part to make rename visible. Message-ID: <38848735-7CFA-404E-AE51-4F445F813266@gmail.com> "git diff -M --stat" can detect rename and show renamed file name like "foofoofoo => barbarbar", but if destination filename is long the line is shortened like "...barbarbar" so there is no way to know whether the file is renamed or existed in the source commit. This commit makes it visible like "...foo => ...bar". Signed-off-by: Tsuneo Yoshioka --- diff.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/diff.c b/diff.c index a04a34d..9b55546 100644 --- a/diff.c +++ b/diff.c @@ -1643,13 +1643,53 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) len = name_width; name_len = strlen(name); if (name_width < name_len) { - char *slash; - prefix = "..."; - len -= 3; - name += name_len - len; - slash = strchr(name, '/'); - if (slash) - name = slash; + char *arrow = strstr(name, " => "); + if(arrow){ + int prefix_len = (name_width- 4) / 2; + int f_omit; + char *pre_arrow = alloca(name_width + 10); + char *post_arrow = arrow + 4; + char *prefix_buf = alloca(name_width + 10); + char *pre_arrow_slash = NULL; + + if(arrow - name < prefix_len){ + prefix_len = (int)(arrow - name); + f_omit = 0; + }else{ + prefix_len -= 3; + f_omit = 1; + } + strncpy(pre_arrow, arrow - prefix_len, prefix_len); + pre_arrow[prefix_len] = '¥0'; + pre_arrow_slash = strchr(pre_arrow, '/'); + if(f_omit && pre_arrow_slash){ + pre_arrow = pre_arrow_slash; + } + sprintf(prefix_buf, "%s%s => ", (f_omit ? "..." : ""), pre_arrow); + prefix = prefix_buf; + + if(strlen(post_arrow) > name_width - strlen(prefix)){ + char *post_arrow_slash = NULL; + + post_arrow += strlen(post_arrow) - (name_width - strlen(prefix) - 3); + strcat(prefix_buf, "..."); + post_arrow_slash = strchr(post_arrow, '/'); + if(post_arrow_slash){ + post_arrow = post_arrow_slash; + } + name = post_arrow; + name_len = (int) (name_width - strlen(prefix)); + } + len -= strlen(prefix); + }else{ + char *slash = NULL; + prefix = "..."; + len -= 3; + name += name_len - len; + slash = strchr(name, '/'); + if (slash) + name = slash; + } } if (file->is_binary) { -- 1.8.4.475.g867697c