25d5ea410f
Earlier implementation had a major screw-up in the memory management area. Rename/copy logic sometimes borrowed a pointer to a structure without any provision for downstream to determine which pointer is shared and which is not. This resulted in the later clean-up code to sometimes double free such structure, resulting in a segfault. This made -M and -C useless. Another problem the earlier implementation had was that it reordered the patches, and forced the logic to differentiate renames and copies to depend on that particular order. This problem was fixed by teaching rename/copy detection logic not to do any reordering, and rename-copy differentiator not to depend on the order of the patches. The diffs will leave rename/copy detector in the same destination path order as the patch that was fed into it. Some test vectors have been reordered to accommodate this change. It also adds a sanity check logic to the human-readable diff-raw output to detect paths with embedded TAB and LF characters, which cannot be expressed with that format. This idea came up during a discussion with Chris Wedgwood. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
135 lines
4.2 KiB
Bash
135 lines
4.2 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
|
|
test_description='More rename detection
|
|
|
|
'
|
|
. ./test-lib.sh
|
|
|
|
compare_diff_patch () {
|
|
# When heuristics are improved, the score numbers would change.
|
|
# Ignore them while comparing.
|
|
sed -e '/^similarity index [0-9]*%$/d' <"$1" >.tmp-1
|
|
sed -e '/^similarity index [0-9]*%$/d' <"$2" >.tmp-2
|
|
diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
|
}
|
|
|
|
test_expect_success \
|
|
'prepare reference tree' \
|
|
'cat ../../COPYING >COPYING &&
|
|
echo frotz >rezrov &&
|
|
git-update-cache --add COPYING rezrov &&
|
|
tree=$(git-write-tree) &&
|
|
echo $tree'
|
|
|
|
test_expect_success \
|
|
'prepare work tree' \
|
|
'sed -e 's/HOWEVER/However/' <COPYING >COPYING.1 &&
|
|
sed -e 's/GPL/G.P.L/g' <COPYING >COPYING.2 &&
|
|
rm -f COPYING &&
|
|
git-update-cache --add --remove COPYING COPYING.?'
|
|
|
|
# tree has COPYING and rezrov. work tree has COPYING.1 and COPYING.2,
|
|
# both are slightly edited, and unchanged rezrov. So we say you
|
|
# copy-and-edit one, and rename-and-edit the other. We do not say
|
|
# anything about rezrov.
|
|
|
|
GIT_DIFF_OPTS=--unified=0 git-diff-cache -M -p $tree >current
|
|
cat >expected <<\EOF
|
|
diff --git a/COPYING b/COPYING.1
|
|
copy from COPYING
|
|
copy to COPYING.1
|
|
--- a/COPYING
|
|
+++ b/COPYING.1
|
|
@@ -6 +6 @@
|
|
- HOWEVER, in order to allow a migration to GPLv3 if that seems like
|
|
+ However, in order to allow a migration to GPLv3 if that seems like
|
|
diff --git a/COPYING b/COPYING.2
|
|
rename old COPYING
|
|
rename new COPYING.2
|
|
--- a/COPYING
|
|
+++ b/COPYING.2
|
|
@@ -2 +2 @@
|
|
- Note that the only valid version of the GPL as far as this project
|
|
+ Note that the only valid version of the G.P.L as far as this project
|
|
@@ -6 +6 @@
|
|
- HOWEVER, in order to allow a migration to GPLv3 if that seems like
|
|
+ HOWEVER, in order to allow a migration to G.P.Lv3 if that seems like
|
|
@@ -12 +12 @@
|
|
- This file is licensed under the GPL v2, or a later version
|
|
+ This file is licensed under the G.P.L v2, or a later version
|
|
EOF
|
|
|
|
test_expect_success \
|
|
'validate output from rename/copy detection (#1)' \
|
|
'compare_diff_patch current expected'
|
|
|
|
test_expect_success \
|
|
'prepare work tree again' \
|
|
'mv COPYING.2 COPYING &&
|
|
git-update-cache --add --remove COPYING COPYING.1 COPYING.2'
|
|
|
|
# tree has COPYING and rezrov. work tree has COPYING and COPYING.1,
|
|
# both are slightly edited, and unchanged rezrov. So we say you
|
|
# edited one, and copy-and-edit the other. We do not say
|
|
# anything about rezrov.
|
|
|
|
GIT_DIFF_OPTS=--unified=0 git-diff-cache -C -p $tree >current
|
|
cat >expected <<\EOF
|
|
diff --git a/COPYING b/COPYING
|
|
--- a/COPYING
|
|
+++ b/COPYING
|
|
@@ -2 +2 @@
|
|
- Note that the only valid version of the GPL as far as this project
|
|
+ Note that the only valid version of the G.P.L as far as this project
|
|
@@ -6 +6 @@
|
|
- HOWEVER, in order to allow a migration to GPLv3 if that seems like
|
|
+ HOWEVER, in order to allow a migration to G.P.Lv3 if that seems like
|
|
@@ -12 +12 @@
|
|
- This file is licensed under the GPL v2, or a later version
|
|
+ This file is licensed under the G.P.L v2, or a later version
|
|
diff --git a/COPYING b/COPYING.1
|
|
copy from COPYING
|
|
copy to COPYING.1
|
|
--- a/COPYING
|
|
+++ b/COPYING.1
|
|
@@ -6 +6 @@
|
|
- HOWEVER, in order to allow a migration to GPLv3 if that seems like
|
|
+ However, in order to allow a migration to GPLv3 if that seems like
|
|
EOF
|
|
|
|
test_expect_success \
|
|
'validate output from rename/copy detection (#2)' \
|
|
'compare_diff_patch current expected'
|
|
|
|
test_expect_success \
|
|
'prepare work tree once again' \
|
|
'cat ../../COPYING >COPYING &&
|
|
git-update-cache --add --remove COPYING COPYING.1'
|
|
|
|
# tree has COPYING and rezrov. work tree has COPYING and COPYING.1,
|
|
# but COPYING is not edited. We say you copy-and-edit COPYING.1; this
|
|
# is only possible because -C mode now reports the unmodified file to
|
|
# the diff-core. Unchanged rezrov, although being fed to
|
|
# git-diff-cache as well, should not be mentioned.
|
|
|
|
GIT_DIFF_OPTS=--unified=0 git-diff-cache -C -p $tree >current
|
|
cat >expected <<\EOF
|
|
diff --git a/COPYING b/COPYING.1
|
|
copy from COPYING
|
|
copy to COPYING.1
|
|
--- a/COPYING
|
|
+++ b/COPYING.1
|
|
@@ -6 +6 @@
|
|
- HOWEVER, in order to allow a migration to GPLv3 if that seems like
|
|
+ However, in order to allow a migration to GPLv3 if that seems like
|
|
EOF
|
|
|
|
test_expect_success \
|
|
'validate output from rename/copy detection (#3)' \
|
|
'compare_diff_patch current expected'
|
|
|
|
test_done
|