summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorAntoine Pelisse <apelisse@gmail.com>2013-02-23 16:48:45 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-02-24 07:52:39 (GMT)
commitd020e27fdaeb7d04247cdf5a0ff84d97626d5f5a (patch)
tree9d6a52c0617701b333bad6c68303977c19cd78f7 /diff.c
parentf174a2583c9f42315b60205890fa67a79a1f1669 (diff)
downloadgit-d020e27fdaeb7d04247cdf5a0ff84d97626d5f5a.zip
git-d020e27fdaeb7d04247cdf5a0ff84d97626d5f5a.tar.gz
git-d020e27fdaeb7d04247cdf5a0ff84d97626d5f5a.tar.bz2
diff: Fix rename pretty-print when suffix and prefix overlap
When considering a rename for two files that have a suffix and a prefix that can overlap, a confusing line is shown. As an example, renaming "a/b/b/c" to "a/b/c" shows "a/b/{ => }/b/c". Currently, what we do is calculate the common prefix ("a/b/"), and the common suffix ("/b/c"), but the same "/b/" is actually counted both in prefix and suffix. Then when calculating the size of the non-common part, we end-up with a negative value which is reset to 0, thus the "{ => }". Do not allow the common suffix to overlap the common prefix and stop when reaching a "/" that would be in both. Signed-off-by: Antoine Pelisse <apelisse@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/diff.c b/diff.c
index 9038f19..e1d82c9 100644
--- a/diff.c
+++ b/diff.c
@@ -1177,7 +1177,16 @@ static char *pprint_rename(const char *a, const char *b)
old = a + len_a;
new = b + len_b;
sfx_length = 0;
- while (a <= old && b <= new && *old == *new) {
+ /*
+ * Note:
+ * if pfx_length is 0, old/new will never reach a - 1 because it
+ * would mean the whole string is common suffix. But then, the
+ * whole string would also be a common prefix, and we would not
+ * have pfx_length equals 0.
+ */
+ while (a + pfx_length - 1 <= old &&
+ b + pfx_length - 1 <= new &&
+ *old == *new) {
if (*old == '/')
sfx_length = len_a - (old - a);
old--;