diff options
| author | Patrick Steinhardt <ps@pks.im> | 2018-10-04 11:19:28 +0200 |
|---|---|---|
| committer | Patrick Steinhardt <ps@pks.im> | 2018-10-04 11:26:24 +0200 |
| commit | e5090ee329aecdc2a298e442868cbf1d4b10d0e9 (patch) | |
| tree | 954fe48c57b851d49aa689d3c03a6a47b897dde1 /src/diff_stats.c | |
| parent | 3148efd2ee750d879493839f751fa1f80ec0612b (diff) | |
| download | libgit2-e5090ee329aecdc2a298e442868cbf1d4b10d0e9.tar.gz | |
diff_stats: use git's formatting of renames with common directories
In cases where a file gets renamed such that the directories containing
it previous and after the rename have a common prefix, then git will
avoid printing this prefix twice and instead format the rename as
"prefix/{old => new}". We currently didn't do anything like that, but
simply printed "prefix/old -> prefix/new".
Adjust our behaviour to instead match upstream. Adjust the test for this
behaviour to expect the new format.
Diffstat (limited to 'src/diff_stats.c')
| -rw-r--r-- | src/diff_stats.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/diff_stats.c b/src/diff_stats.c index 583c68459..3af591443 100644 --- a/src/diff_stats.c +++ b/src/diff_stats.c @@ -61,15 +61,29 @@ int git_diff_file_stats__full_to_buf( old_size = delta->old_file.size; new_size = delta->new_file.size; - if (git_buf_printf(out, " %s", old_path) < 0) - goto on_error; - if (strcmp(old_path, new_path) != 0) { + size_t common_dirlen; + int error; + padding = stats->max_name - strlen(old_path) - strlen(new_path); - if (git_buf_printf(out, DIFF_RENAME_FILE_SEPARATOR "%s", new_path) < 0) + if ((common_dirlen = git_path_common_dirlen(old_path, new_path)) && + common_dirlen <= INT_MAX) { + error = git_buf_printf(out, " %.*s{%s"DIFF_RENAME_FILE_SEPARATOR"%s}", + (int) common_dirlen, old_path, + old_path + common_dirlen, + new_path + common_dirlen); + } else { + error = git_buf_printf(out, " %s" DIFF_RENAME_FILE_SEPARATOR "%s", + old_path, new_path); + } + + if (error < 0) goto on_error; } else { + if (git_buf_printf(out, " %s", old_path) < 0) + goto on_error; + padding = stats->max_name - strlen(old_path); if (stats->renames > 0) |
