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