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>
67 lines
1.5 KiB
Bash
67 lines
1.5 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
|
|
test_description='More rename detection tests.
|
|
|
|
The rename detection logic should be able to detect pure rename or
|
|
copy of symbolic links, but should not produce rename/copy followed
|
|
by an edit for them.
|
|
'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success \
|
|
'prepare reference tree' \
|
|
'echo xyzzy | tr -d '\\\\'012 >yomin &&
|
|
ln -s xyzzy frotz &&
|
|
git-update-cache --add frotz yomin &&
|
|
tree=$(git-write-tree) &&
|
|
echo $tree'
|
|
|
|
test_expect_success \
|
|
'prepare work tree' \
|
|
'mv frotz rezrov &&
|
|
rm -f yomin &&
|
|
ln -s xyzzy nitfol &&
|
|
ln -s xzzzy bozbar &&
|
|
git-update-cache --add --remove frotz rezrov nitfol bozbar yomin'
|
|
|
|
# tree has frotz pointing at xyzzy, and yomin that contains xyzzy to
|
|
# confuse things. work tree has rezrov (xyzzy) nitfol (xyzzy) and
|
|
# bozbar (xzzzy).
|
|
# rezrov and nitfol are rename/copy of frotz and bozbar should be
|
|
# a new creation.
|
|
|
|
GIT_DIFF_OPTS=--unified=0 git-diff-cache -M -p $tree >current
|
|
cat >expected <<\EOF
|
|
diff --git a/bozbar b/bozbar
|
|
new file mode 120000
|
|
--- /dev/null
|
|
+++ b/bozbar
|
|
@@ -0,0 +1 @@
|
|
+xzzzy
|
|
\ No newline at end of file
|
|
diff --git a/frotz b/nitfol
|
|
similarity index 100%
|
|
copy from frotz
|
|
copy to nitfol
|
|
diff --git a/frotz b/rezrov
|
|
similarity index 100%
|
|
rename old frotz
|
|
rename new rezrov
|
|
diff --git a/yomin b/yomin
|
|
deleted file mode 100644
|
|
--- a/yomin
|
|
+++ /dev/null
|
|
@@ -1 +0,0 @@
|
|
-xyzzy
|
|
\ No newline at end of file
|
|
EOF
|
|
|
|
test_expect_success \
|
|
'validate diff output' \
|
|
'diff -u current expected'
|
|
|
|
test_done
|