| #!/bin/sh | 
 |  | 
 | test_description='test case exclude pathspec' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	for p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do | 
 | 		if echo $p | grep /; then | 
 | 			mkdir -p $(dirname $p) | 
 | 		fi && | 
 | 		: >$p && | 
 | 		git add $p && | 
 | 		git commit -m $p || return 1 | 
 | 	done && | 
 | 	git log --oneline --format=%s >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | sub/sub/sub/file | 
 | sub/file2 | 
 | sub/sub/file | 
 | sub/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'exclude only pathspec uses default implicit pathspec' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude)sub" >expect && | 
 | 	git log --oneline --format=%s -- ":(exclude)sub" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude sub' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude)sub" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude sub/sub/file' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | sub/sub/sub/file | 
 | sub/file2 | 
 | sub/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude sub using mnemonic' ' | 
 | 	git log --oneline --format=%s -- . ":!sub" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude :(icase)SUB' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude sub2 from sub' ' | 
 | 	( | 
 | 	cd sub && | 
 | 	git log --oneline --format=%s -- :/ ":/!sub2" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub/sub/sub/file | 
 | sub/file2 | 
 | sub/sub/file | 
 | sub/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude sub/*file' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude)sub/*file" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | sub/file2 | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude :(glob)sub/*/file' ' | 
 | 	git log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual && | 
 | 	cat <<EOF >expect && | 
 | sub2/file | 
 | sub/sub/sub/file | 
 | sub/file2 | 
 | sub/file | 
 | file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude sub' ' | 
 | 	git ls-files -- . ":(exclude)sub" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude sub/sub/file' ' | 
 | 	git ls-files -- . ":(exclude)sub/sub/file" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub/file | 
 | sub/file2 | 
 | sub/sub/sub/file | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude sub using mnemonic' ' | 
 | 	git ls-files -- . ":!sub" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude :(icase)SUB' ' | 
 | 	git ls-files -- . ":(exclude,icase)SUB" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude sub2 from sub' ' | 
 | 	( | 
 | 	cd sub && | 
 | 	git ls-files -- :/ ":/!sub2" >actual && | 
 | 	cat <<EOF >expect && | 
 | ../file | 
 | file | 
 | file2 | 
 | sub/file | 
 | sub/sub/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude sub/*file' ' | 
 | 	git ls-files -- . ":(exclude)sub/*file" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub/file2 | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'm_p_d() exclude :(glob)sub/*/file' ' | 
 | 	git ls-files -- . ":(exclude,glob)sub/*/file" >actual && | 
 | 	cat <<EOF >expect && | 
 | file | 
 | sub/file | 
 | sub/file2 | 
 | sub/sub/sub/file | 
 | sub2/file | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'multiple exclusions' ' | 
 | 	git ls-files -- ":^*/file2" ":^sub2" >actual && | 
 | 	cat <<-\EOF >expect && | 
 | 	file | 
 | 	sub/file | 
 | 	sub/sub/file | 
 | 	sub/sub/sub/file | 
 | 	EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 't_e_i() exclude case #8' ' | 
 | 	git init case8 && | 
 | 	( | 
 | 		cd case8 && | 
 | 		echo file >file1 && | 
 | 		echo file >file2 && | 
 | 		git add file1 file2 && | 
 | 		git commit -m twofiles && | 
 | 		git grep -l file HEAD :^file2 >actual && | 
 | 		echo HEAD:file1 >expected && | 
 | 		test_cmp expected actual && | 
 | 		git grep -l file HEAD :^file1 >actual && | 
 | 		echo HEAD:file2 >expected && | 
 | 		test_cmp expected actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'grep --untracked PATTERN' ' | 
 | 	# This test is not an actual test of exclude patterns, rather it | 
 | 	# is here solely to ensure that if any tests are inserted, deleted, or | 
 | 	# changed above, that we still have untracked files with the expected | 
 | 	# contents for the NEXT two tests. | 
 | 	cat <<-\EOF >expect-grep && | 
 | 	actual | 
 | 	expect | 
 | 	sub/actual | 
 | 	sub/expect | 
 | 	EOF | 
 | 	git grep -l --untracked file -- >actual-grep && | 
 | 	test_cmp expect-grep actual-grep | 
 | ' | 
 |  | 
 | test_expect_success 'grep --untracked PATTERN :(exclude)DIR' ' | 
 | 	cat <<-\EOF >expect-grep && | 
 | 	actual | 
 | 	expect | 
 | 	EOF | 
 | 	git grep -l --untracked file -- ":(exclude)sub" >actual-grep && | 
 | 	test_cmp expect-grep actual-grep | 
 | ' | 
 |  | 
 | test_expect_success 'grep --untracked PATTERN :(exclude)*FILE' ' | 
 | 	cat <<-\EOF >expect-grep && | 
 | 	actual | 
 | 	sub/actual | 
 | 	EOF | 
 | 	git grep -l --untracked file -- ":(exclude)*expect" >actual-grep && | 
 | 	test_cmp expect-grep actual-grep | 
 | ' | 
 |  | 
 | test_done |