| #!/bin/sh | 
 |  | 
 | test_description='core.whitespace rules and git apply' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | prepare_test_file () { | 
 |  | 
 | 	# A line that has character X is touched iff RULE is in effect: | 
 | 	#       X  RULE | 
 | 	#   	!  trailing-space | 
 | 	#   	@  space-before-tab | 
 | 	#   	#  indent-with-non-tab | 
 | 	sed -e "s/_/ /g" -e "s/>/	/" <<-\EOF | 
 | 		An_SP in an ordinary line>and a HT. | 
 | 		>A HT. | 
 | 		_>A SP and a HT (@). | 
 | 		_>_A SP, a HT and a SP (@). | 
 | 		_______Seven SP. | 
 | 		________Eight SP (#). | 
 | 		_______>Seven SP and a HT (@). | 
 | 		________>Eight SP and a HT (@#). | 
 | 		_______>_Seven SP, a HT and a SP (@). | 
 | 		________>_Eight SP, a HT and a SP (@#). | 
 | 		_______________Fifteen SP (#). | 
 | 		_______________>Fifteen SP and a HT (@#). | 
 | 		________________Sixteen SP (#). | 
 | 		________________>Sixteen SP and a HT (@#). | 
 | 		_____a__Five SP, a non WS, two SP. | 
 | 		A line with a (!) trailing SP_ | 
 | 		A line with a (!) trailing HT> | 
 | 	EOF | 
 | } | 
 |  | 
 | apply_patch () { | 
 | 	>target && | 
 | 	sed -e "s|\([ab]\)/file|\1/target|" <patch | | 
 | 	git apply "$@" | 
 | } | 
 |  | 
 | test_fix () { | 
 |  | 
 | 	# fix should not barf | 
 | 	apply_patch --whitespace=fix || return 1 | 
 |  | 
 | 	# find touched lines | 
 | 	diff file target | sed -n -e "s/^> //p" >fixed | 
 |  | 
 | 	# the changed lines are all expeced to change | 
 | 	fixed_cnt=$(wc -l <fixed) | 
 | 	case "$1" in | 
 | 	'') expect_cnt=$fixed_cnt ;; | 
 | 	?*) expect_cnt=$(grep "[$1]" <fixed | wc -l) ;; | 
 | 	esac | 
 | 	test $fixed_cnt -eq $expect_cnt || return 1 | 
 |  | 
 | 	# and we are not missing anything | 
 | 	case "$1" in | 
 | 	'') expect_cnt=0 ;; | 
 | 	?*) expect_cnt=$(grep "[$1]" <file | wc -l) ;; | 
 | 	esac | 
 | 	test $fixed_cnt -eq $expect_cnt || return 1 | 
 |  | 
 | 	# Get the patch actually applied | 
 | 	git diff-files -p target >fixed-patch | 
 | 	test -s fixed-patch && return 0 | 
 |  | 
 | 	# Make sure it is complaint-free | 
 | 	>target | 
 | 	git apply --whitespace=error-all <fixed-patch | 
 |  | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 |  | 
 | 	>file && | 
 | 	git add file && | 
 | 	prepare_test_file >file && | 
 | 	git diff-files -p >patch && | 
 | 	>target && | 
 | 	git add target | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'whitespace=nowarn, default rule' ' | 
 |  | 
 | 	apply_patch --whitespace=nowarn && | 
 | 	diff file target | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'whitespace=warn, default rule' ' | 
 |  | 
 | 	apply_patch --whitespace=warn && | 
 | 	diff file target | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'whitespace=error-all, default rule' ' | 
 |  | 
 | 	apply_patch --whitespace=error-all && return 1 | 
 | 	test -s target && return 1 | 
 | 	: happy | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'whitespace=error-all, no rule' ' | 
 |  | 
 | 	git config core.whitespace -trailing,-space-before,-indent && | 
 | 	apply_patch --whitespace=error-all && | 
 | 	diff file target | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'whitespace=error-all, no rule (attribute)' ' | 
 |  | 
 | 	git config --unset core.whitespace && | 
 | 	echo "target -whitespace" >.gitattributes && | 
 | 	apply_patch --whitespace=error-all && | 
 | 	diff file target | 
 |  | 
 | ' | 
 |  | 
 | for t in - '' | 
 | do | 
 | 	case "$t" in '') tt='!' ;; *) tt= ;; esac | 
 | 	for s in - '' | 
 | 	do | 
 | 		case "$s" in '') ts='@' ;; *) ts= ;; esac | 
 | 		for i in - '' | 
 | 		do | 
 | 			case "$i" in '') ti='#' ;; *) ti= ;; esac | 
 | 			rule=${t}trailing,${s}space,${i}indent | 
 |  | 
 | 			rm -f .gitattributes | 
 | 			test_expect_success "rule=$rule" ' | 
 | 				git config core.whitespace "$rule" && | 
 | 				test_fix "$tt$ts$ti" | 
 | 			' | 
 |  | 
 | 			test_expect_success "rule=$rule (attributes)" ' | 
 | 				git config --unset core.whitespace && | 
 | 				echo "target whitespace=$rule" >.gitattributes && | 
 | 				test_fix "$tt$ts$ti" | 
 | 			' | 
 |  | 
 | 		done | 
 | 	done | 
 | done | 
 |  | 
 | test_done |