| #!/bin/sh | 
 |  | 
 | test_description='Test ls-files recurse-submodules feature | 
 |  | 
 | This test verifies the recurse-submodules feature correctly lists files from | 
 | submodules. | 
 | ' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success 'setup directory structure and submodules' ' | 
 | 	echo a >a && | 
 | 	mkdir b && | 
 | 	echo b >b/b && | 
 | 	git add a b && | 
 | 	git commit -m "add a and b" && | 
 | 	git init submodule && | 
 | 	echo c >submodule/c && | 
 | 	git -C submodule add c && | 
 | 	git -C submodule commit -m "add c" && | 
 | 	git submodule add ./submodule && | 
 | 	git commit -m "added submodule" | 
 | ' | 
 |  | 
 | test_expect_success 'ls-files correctly outputs files in submodule' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	submodule/c | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'ls-files correctly outputs files in submodule with -z' ' | 
 | 	lf_to_nul >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	submodule/c | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules -z >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'ls-files does not output files not added to a repo' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	submodule/c | 
 | 	EOF | 
 |  | 
 | 	echo a >not_added && | 
 | 	echo b >b/not_added && | 
 | 	echo c >submodule/not_added && | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'ls-files recurses more than 1 level' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	submodule/.gitmodules | 
 | 	submodule/c | 
 | 	submodule/subsub/d | 
 | 	EOF | 
 |  | 
 | 	git init submodule/subsub && | 
 | 	echo d >submodule/subsub/d && | 
 | 	git -C submodule/subsub add d && | 
 | 	git -C submodule/subsub commit -m "add d" && | 
 | 	git -C submodule submodule add ./subsub && | 
 | 	git -C submodule commit -m "added subsub" && | 
 | 	git submodule absorbgitdirs && | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'ls-files works with GIT_DIR' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	c | 
 | 	subsub/d | 
 | 	EOF | 
 |  | 
 | 	git --git-dir=submodule/.git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs setup' ' | 
 | 	echo e >submodule/subsub/e.txt && | 
 | 	git -C submodule/subsub add e.txt && | 
 | 	git -C submodule/subsub commit -m "adding e.txt" && | 
 | 	echo f >submodule/f.TXT && | 
 | 	echo g >submodule/g.txt && | 
 | 	git -C submodule add f.TXT g.txt && | 
 | 	git -C submodule commit -m "add f and g" && | 
 | 	echo h >h.txt && | 
 | 	mkdir sib && | 
 | 	echo sib >sib/file && | 
 | 	git add h.txt sib/file && | 
 | 	git commit -m "add h and sib/file" && | 
 | 	git init sub && | 
 | 	echo sub >sub/file && | 
 | 	git -C sub add file && | 
 | 	git -C sub commit -m "add file" && | 
 | 	git submodule add ./sub && | 
 | 	git commit -m "added sub" && | 
 |  | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	h.txt | 
 | 	sib/file | 
 | 	sub/file | 
 | 	submodule/.gitmodules | 
 | 	submodule/c | 
 | 	submodule/f.TXT | 
 | 	submodule/g.txt | 
 | 	submodule/subsub/d | 
 | 	submodule/subsub/e.txt | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual && | 
 | 	cat actual && | 
 | 	git ls-files --recurse-submodules "*" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'inactive submodule' ' | 
 | 	test_when_finished "git config --bool submodule.submodule.active true" && | 
 | 	test_when_finished "git -C submodule config --bool submodule.subsub.active true" && | 
 | 	git config --bool submodule.submodule.active "false" && | 
 |  | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	h.txt | 
 | 	sib/file | 
 | 	sub/file | 
 | 	submodule | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual && | 
 |  | 
 | 	git config --bool submodule.submodule.active "true" && | 
 | 	git -C submodule config --bool submodule.subsub.active "false" && | 
 |  | 
 | 	cat >expect <<-\EOF && | 
 | 	.gitmodules | 
 | 	a | 
 | 	b/b | 
 | 	h.txt | 
 | 	sib/file | 
 | 	sub/file | 
 | 	submodule/.gitmodules | 
 | 	submodule/c | 
 | 	submodule/f.TXT | 
 | 	submodule/g.txt | 
 | 	submodule/subsub | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	h.txt | 
 | 	submodule/g.txt | 
 | 	submodule/subsub/e.txt | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules "*.txt" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	h.txt | 
 | 	submodule/f.TXT | 
 | 	submodule/g.txt | 
 | 	submodule/subsub/e.txt | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules ":(icase)*.txt" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	h.txt | 
 | 	submodule/f.TXT | 
 | 	submodule/g.txt | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	sub/file | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules "sub" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "sub/" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "sub/file" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "su*/file" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "su?/file" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and pathspecs' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	sib/file | 
 | 	sub/file | 
 | 	EOF | 
 |  | 
 | 	git ls-files --recurse-submodules "s??/file" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "s???file" >actual && | 
 | 	test_cmp expect actual && | 
 | 	git ls-files --recurse-submodules "s*file" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules and relative paths' ' | 
 | 	# From subdir | 
 | 	cat >expect <<-\EOF && | 
 | 	b | 
 | 	EOF | 
 | 	git -C b ls-files --recurse-submodules >actual && | 
 | 	test_cmp expect actual && | 
 |  | 
 | 	# Relative path to top | 
 | 	cat >expect <<-\EOF && | 
 | 	../.gitmodules | 
 | 	../a | 
 | 	b | 
 | 	../h.txt | 
 | 	../sib/file | 
 | 	../sub/file | 
 | 	../submodule/.gitmodules | 
 | 	../submodule/c | 
 | 	../submodule/f.TXT | 
 | 	../submodule/g.txt | 
 | 	../submodule/subsub/d | 
 | 	../submodule/subsub/e.txt | 
 | 	EOF | 
 | 	git -C b ls-files --recurse-submodules -- .. >actual && | 
 | 	test_cmp expect actual && | 
 |  | 
 | 	# Relative path to submodule | 
 | 	cat >expect <<-\EOF && | 
 | 	../submodule/.gitmodules | 
 | 	../submodule/c | 
 | 	../submodule/f.TXT | 
 | 	../submodule/g.txt | 
 | 	../submodule/subsub/d | 
 | 	../submodule/subsub/e.txt | 
 | 	EOF | 
 | 	git -C b ls-files --recurse-submodules -- ../submodule >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success '--recurse-submodules does not support --error-unmatch' ' | 
 | 	test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual && | 
 | 	test_i18ngrep "does not support --error-unmatch" actual | 
 | ' | 
 |  | 
 | test_incompatible_with_recurse_submodules () { | 
 | 	test_expect_success "--recurse-submodules and $1 are incompatible" " | 
 | 		test_must_fail git ls-files --recurse-submodules $1 2>actual && | 
 | 		test_i18ngrep 'unsupported mode' actual | 
 | 	" | 
 | } | 
 |  | 
 | test_incompatible_with_recurse_submodules --deleted | 
 | test_incompatible_with_recurse_submodules --modified | 
 | test_incompatible_with_recurse_submodules --others | 
 | test_incompatible_with_recurse_submodules --stage | 
 | test_incompatible_with_recurse_submodules --killed | 
 | test_incompatible_with_recurse_submodules --unmerged | 
 |  | 
 | test_done |