 ded0abc73c
			
		
	
	ded0abc73c
	
	
	
		
			
			The logic in builtin_diffstat assumes that a
complete_rewrite pair should have its lines counted. This is
nonsensical for binary files and leads to confusing things
like:
  $ git diff --stat --summary HEAD^ HEAD
   foo.rand |  Bin 4096 -> 4096 bytes
   1 files changed, 0 insertions(+), 0 deletions(-)
  $ git diff --stat --summary -B HEAD^ HEAD
   foo.rand |   34 +++++++++++++++-------------------
   1 files changed, 15 insertions(+), 19 deletions(-)
   rewrite foo.rand (100%)
So let's reorder the function to handle binary files first
(which from diffstat's perspective look like complete
rewrites anyway), then rewrites, then actual diffstats.
There are two bonus prizes to this reorder:
  1. It gets rid of a now-superfluous goto.
  2. The binary case is at the top, which means we can
     further optimize it in the next patch.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 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
 | |
| '
 | |
| 
 | |
| test_expect_success 'rewrite diff --stat shows binary changes' '
 | |
| 	git diff -B --stat --summary >diff &&
 | |
| 	grep "Bin" diff &&
 | |
| 	grep "0 insertions.*0 deletions" diff &&
 | |
| 	grep " rewrite file" diff
 | |
| '
 | |
| 
 | |
| {
 | |
| 	echo "#!$SHELL_PATH"
 | |
| 	cat <<'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
 |