209 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='directory traversal handling, especially with common prefixes'
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| test_expect_success 'setup' '
 | |
| 	test_commit hello &&
 | |
| 
 | |
| 	>empty &&
 | |
| 	mkdir untracked_dir &&
 | |
| 	>untracked_dir/empty &&
 | |
| 	git init untracked_repo &&
 | |
| 	>untracked_repo/empty &&
 | |
| 
 | |
| 	cat <<-EOF >.gitignore &&
 | |
| 	ignored
 | |
| 	an_ignored_dir/
 | |
| 	EOF
 | |
| 	mkdir an_ignored_dir &&
 | |
| 	mkdir an_untracked_dir &&
 | |
| 	>an_ignored_dir/ignored &&
 | |
| 	>an_ignored_dir/untracked &&
 | |
| 	>an_untracked_dir/ignored &&
 | |
| 	>an_untracked_dir/untracked
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o shows the right entries' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	.gitignore
 | |
| 	actual
 | |
| 	an_ignored_dir/ignored
 | |
| 	an_ignored_dir/untracked
 | |
| 	an_untracked_dir/ignored
 | |
| 	an_untracked_dir/untracked
 | |
| 	empty
 | |
| 	expect
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o --exclude-standard shows the right entries' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	.gitignore
 | |
| 	actual
 | |
| 	an_untracked_dir/untracked
 | |
| 	empty
 | |
| 	expect
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o --exclude-standard >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_dir recurses' '
 | |
| 	echo untracked_dir/empty >expect &&
 | |
| 	git ls-files -o untracked_dir >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_dir/ recurses' '
 | |
| 	echo untracked_dir/empty >expect &&
 | |
| 	git ls-files -o untracked_dir/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o --directory untracked_dir does not recurse' '
 | |
| 	echo untracked_dir/ >expect &&
 | |
| 	git ls-files -o --directory untracked_dir >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o --directory untracked_dir/ does not recurse' '
 | |
| 	echo untracked_dir/ >expect &&
 | |
| 	git ls-files -o --directory untracked_dir/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_repo does not recurse' '
 | |
| 	echo untracked_repo/ >expect &&
 | |
| 	git ls-files -o untracked_repo >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_repo/ does not recurse' '
 | |
| 	echo untracked_repo/ >expect &&
 | |
| 	git ls-files -o untracked_repo/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_dir untracked_repo recurses into untracked_dir only' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o untracked_dir untracked_repo >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o untracked_dir/ untracked_repo/ recurses into untracked_dir only' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o untracked_dir/ untracked_repo/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o --directory untracked_dir untracked_repo does not recurse' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_dir/
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o --directory untracked_dir untracked_repo >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o --directory untracked_dir/ untracked_repo/ does not recurse' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_dir/
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o --directory untracked_dir/ untracked_repo/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o .git shows nothing' '
 | |
| 	git ls-files -o .git >actual &&
 | |
| 	test_must_be_empty actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o .git/ shows nothing' '
 | |
| 	git ls-files -o .git/ >actual &&
 | |
| 	test_must_be_empty actual
 | |
| '
 | |
| 
 | |
| test_expect_success FUNNYNAMES 'git ls-files -o untracked_* recurses appropriately' '
 | |
| 	mkdir "untracked_*" &&
 | |
| 	>"untracked_*/empty" &&
 | |
| 
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_*/empty
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o "untracked_*" >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| # It turns out fill_directory returns the right paths, but ls-files' post-call
 | |
| # filtering in show_dir_entry() via calling dir_path_match() which ends up
 | |
| # in git_fnmatch() has logic for PATHSPEC_ONESTAR that assumes the pathspec
 | |
| # must match the full path; it doesn't check it for matching a leading
 | |
| # directory.
 | |
| test_expect_failure FUNNYNAMES 'git ls-files -o untracked_*/ recurses appropriately' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_*/empty
 | |
| 	untracked_dir/empty
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o "untracked_*/" >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success FUNNYNAMES 'git ls-files -o --directory untracked_* does not recurse' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_*/
 | |
| 	untracked_dir/
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o --directory "untracked_*" >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success FUNNYNAMES 'git ls-files -o --directory untracked_*/ does not recurse' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	untracked_*/
 | |
| 	untracked_dir/
 | |
| 	untracked_repo/
 | |
| 	EOF
 | |
| 	git ls-files -o --directory "untracked_*/" >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git ls-files -o consistent between one or two dirs' '
 | |
| 	git ls-files -o --exclude-standard an_ignored_dir/ an_untracked_dir/ >tmp &&
 | |
| 	! grep ^an_ignored_dir/ tmp >expect &&
 | |
| 	git ls-files -o --exclude-standard an_ignored_dir/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| # ls-files doesn't have a way to request showing both untracked and ignored
 | |
| # files at the same time, so use `git status --ignored`
 | |
| test_expect_success 'git status --ignored shows same files under dir with or without pathspec' '
 | |
| 	cat <<-EOF >expect &&
 | |
| 	?? an_untracked_dir/
 | |
| 	!! an_untracked_dir/ignored
 | |
| 	EOF
 | |
| 	git status --porcelain --ignored >output &&
 | |
| 	grep an_untracked_dir output >expect &&
 | |
| 	git status --porcelain --ignored an_untracked_dir/ >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_done
 |