summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-10-04 11:19:28 +0200
committerPatrick Steinhardt <ps@pks.im>2018-10-04 11:26:24 +0200
commite5090ee329aecdc2a298e442868cbf1d4b10d0e9 (patch)
tree954fe48c57b851d49aa689d3c03a6a47b897dde1
parent3148efd2ee750d879493839f751fa1f80ec0612b (diff)
downloadlibgit2-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.
-rw-r--r--src/diff_stats.c22
-rw-r--r--tests/diff/stats.c2
2 files changed, 19 insertions, 5 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)
diff --git a/tests/diff/stats.c b/tests/diff/stats.c
index 1149b5067..150355686 100644
--- a/tests/diff/stats.c
+++ b/tests/diff/stats.c
@@ -214,7 +214,7 @@ void test_diff_stats__rename_in_subdirectory(void)
{
git_buf buf = GIT_BUF_INIT;
const char *stat =
- " dir/orig.txt => dir/renamed.txt | 0\n"
+ " dir/{orig.txt => renamed.txt} | 0\n"
" 1 file changed, 0 insertions(+), 0 deletions(-)\n";
diff_stats_from_commit_oid(