 3867f6d650
			
		
	
	3867f6d650
	
	
	
		
			
			Move 'repository_format_worktree_config' out of the global scope and into
the 'repository' struct. This change is similar to how
'repository_format_partial_clone' was moved in ebaf3bcf1a (repository: move
global r_f_p_c to repo struct, 2021-06-17), adding it to the 'repository'
struct and updating 'setup.c' & 'repository.c' functions to assign the value
appropriately.
The primary goal of this change is to be able to load the worktree config of
a submodule depending on whether that submodule - not its superproject - has
'extensions.worktreeConfig' enabled. To ensure 'do_git_config_sequence()'
has access to the newly repo-scoped configuration, add a 'struct repository'
argument to 'do_git_config_sequence()' and pass it the 'repo' value from
'config_with_options()'.
Finally, add/update tests in 't3007-ls-files-recurse-submodules.sh' to
verify 'extensions.worktreeConfig' is read an used independently by
superprojects and submodules.
Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			349 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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 '--stage' '
 | |
| 	GITMODULES_HASH=$(git rev-parse HEAD:.gitmodules) &&
 | |
| 	A_HASH=$(git rev-parse HEAD:a) &&
 | |
| 	B_HASH=$(git rev-parse HEAD:b/b) &&
 | |
| 	C_HASH=$(git -C submodule rev-parse HEAD:c) &&
 | |
| 
 | |
| 	cat >expect <<-EOF &&
 | |
| 	100644 $GITMODULES_HASH 0	.gitmodules
 | |
| 	100644 $A_HASH 0	a
 | |
| 	100644 $B_HASH 0	b/b
 | |
| 	100644 $C_HASH 0	submodule/c
 | |
| 	EOF
 | |
| 
 | |
| 	git ls-files --stage --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 &&
 | |
| 	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_expect_success '--recurse-submodules parses submodule repo config' '
 | |
| 	test_config -C submodule index.sparse "invalid non-boolean value" &&
 | |
| 	test_must_fail git ls-files --recurse-submodules 2>err &&
 | |
| 	grep "bad boolean config value" err
 | |
| '
 | |
| 
 | |
| test_expect_success '--recurse-submodules parses submodule worktree config' '
 | |
| 	test_config -C submodule extensions.worktreeConfig true &&
 | |
| 	test_config -C submodule --worktree index.sparse "invalid non-boolean value" &&
 | |
| 
 | |
| 	test_must_fail git ls-files --recurse-submodules 2>err &&
 | |
| 	grep "bad boolean config value" err
 | |
| '
 | |
| 
 | |
| test_expect_success '--recurse-submodules submodules ignore super project worktreeConfig extension' '
 | |
| 	# Enable worktree config in both super project & submodule, set an
 | |
| 	# invalid config in the submodule worktree config
 | |
| 	test_config extensions.worktreeConfig true &&
 | |
| 	test_config -C submodule extensions.worktreeConfig true &&
 | |
| 	test_config -C submodule --worktree index.sparse "invalid non-boolean value" &&
 | |
| 
 | |
| 	# Now, disable the worktree config in the submodule. Note that we need
 | |
| 	# to manually re-enable extensions.worktreeConfig when the test is
 | |
| 	# finished, otherwise the test_unconfig of index.sparse will not work.
 | |
| 	test_unconfig -C submodule extensions.worktreeConfig &&
 | |
| 	test_when_finished "git -C submodule config extensions.worktreeConfig true" &&
 | |
| 
 | |
| 	# With extensions.worktreeConfig disabled in the submodule, the invalid
 | |
| 	# worktree config is not picked up.
 | |
| 	git ls-files --recurse-submodules 2>err &&
 | |
| 	! grep "bad boolean config value" err
 | |
| '
 | |
| 
 | |
| 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 --killed
 | |
| test_incompatible_with_recurse_submodules --unmerged
 | |
| 
 | |
| test_done
 |