git-commit-vandalism/t/t4031-diff-rewrite-binary.sh
Jeff King 3aa1f7ca37 diff: respect textconv in rewrite diffs
Currently we just skip rewrite diffs for binary files; this
patch makes an exception for files which will be textconv'd,
and actually performs the textconv before generating the
diff.

Conceptually, rewrite diffs should be in the exact same
format as the a non-rewrite diff, except that we refuse to
share any context. Thus it makes very little sense for "git
diff" to show a textconv'd diff, but for "git diff -B" to
show "Binary files differ".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-12-09 22:28:55 -08:00

68 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
test_description='rewrite diff on binary file'
. ./test-lib.sh
# We must be large enough to meet the MINIMUM_BREAK_SIZE
# requirement.
make_file() {
# common first line to help identify rewrite versus regular diff
printf "=\n" >file
for i in 1 2 3 4 5 6 7 8 9 10
do
for j in 1 2 3 4 5 6 7 8 9
do
for k in 1 2 3 4 5
do
printf "$1\n"
done
done
done >>file
}
test_expect_success 'create binary file with changes' '
make_file "\\0" &&
git add file &&
make_file "\\01"
'
test_expect_success 'vanilla diff is binary' '
git diff >diff &&
grep "Binary files a/file and b/file differ" diff
'
test_expect_success 'rewrite diff is binary' '
git diff -B >diff &&
grep "dissimilarity index" diff &&
grep "Binary files a/file and b/file differ" diff
'
test_expect_success 'rewrite diff can show binary patch' '
git diff -B --binary >diff &&
grep "dissimilarity index" diff &&
grep "GIT binary patch" diff
'
{
echo "#!$SHELL_PATH"
cat >dump <<'EOF'
perl -e '$/ = undef; $_ = <>; s/./ord($&)/ge; print $_' < "$1"
EOF
} >dump
chmod +x dump
test_expect_success 'setup textconv' '
echo file diff=foo >.gitattributes &&
git config diff.foo.textconv "$PWD"/dump
'
test_expect_success 'rewrite diff respects textconv' '
git diff -B >diff &&
grep "dissimilarity index" diff &&
grep "^-61" diff &&
grep "^-0" diff
'
test_done