"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 <yoshiokatsuneo@xxxxxxxxx> --- 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 -- 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