|  | #!/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 |