(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'git clean basic tests'>)} spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(git)} {(config)} {(clean.requireForce)} {(no)}) (C {(test_expect_success)} {(SQ <setup>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p src &&\n'> <'\ttouch src/part1.c Makefile &&\n'> <'\techo build >.gitignore &&\n'> <'\techo \\*.o >>.gitignore &&\n'> <'\tgit add . &&\n'> <'\tgit commit -m setup &&\n'> <'\ttouch src/part2.c README &&\n'> <'\tgit add .\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean with skip-worktree .gitignore'>)} { (SQ <'\n'> <'\tgit update-index --skip-worktree .gitignore &&\n'> <'\trm .gitignore &&\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so &&\n'> <'\tgit update-index --no-skip-worktree .gitignore &&\n'> <'\tgit checkout .gitignore\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean src/'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean src/ &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean src/ src/'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean src/ src/ &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean with prefix'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs src/test &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so src/test/1.c &&\n'> <'\t(cd src/ && git clean) &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f src/test/1.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} {(SQ <'git clean with relative prefix'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\twould_clean=$(\n'> <'\t\tcd docs &&\n'> <'\t\tgit clean -n ../src |\n'> <'\t\tsed -n -e "s|^Would remove ||p"\n'> <'\t) &&\n'> <'\tverbose test "$would_clean" = ../src/part3.c\n'> ) } ) (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} {(SQ <'git clean with absolute path'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\twould_clean=$(\n'> <'\t\tcd docs &&\n'> <'\t\tgit clean -n "$(pwd)/../src" |\n'> <'\t\tsed -n -e "s|^Would remove ||p"\n'> <'\t) &&\n'> <'\tverbose test "$would_clean" = ../src/part3.c\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean with out of work tree relative path'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\t(\n'> <'\t\tcd docs &&\n'> <'\t\ttest_must_fail git clean -n ../..\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean with out of work tree absolute path'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tdd=$(cd .. && pwd) &&\n'> <'\t(\n'> <'\t\tcd docs &&\n'> <'\t\ttest_must_fail git clean -n $dd\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d with prefix and path'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs src/feature &&\n'> <'\ttouch a.out src/part3.c src/feature/file.c docs/manual.txt obj.o build/lib.so &&\n'> <'\t(cd src/ && git clean -d feature/) &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest ! -f src/feature/file.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <'git clean symbolic link'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tln -s docs/manual.txt src/part4.c &&\n'> <'\tgit clean &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest ! -f src/part4.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean with wildcard'>)} { (SQ <'\n'> <'\n'> <'\ttouch a.clean b.clean other.c &&\n'> <'\tgit clean "*.clean" &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.clean &&\n'> <'\ttest ! -f b.clean &&\n'> <'\ttest -f other.c\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -n'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -n &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -d &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest ! -d docs &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d src/ examples/'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs examples &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so examples/1.c &&\n'> <'\tgit clean -d src/ examples/ &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest ! -f examples/1.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -x'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -x &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d -x'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -d -x &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest ! -d docs &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest ! -d build\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d -x with ignored tracked directory'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -d -x -e src &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest ! -d docs &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest ! -d build\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -X'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -X &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d -X'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -d -X &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest ! -d build\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d -X with ignored tracked directory'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -d -X -e src &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest ! -f obj.o &&\n'> <'\ttest ! -d build\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'clean.requireForce defaults to true'>)} { (SQ <'\n'> <'\n'> <'\tgit config --unset clean.requireForce &&\n'> <'\ttest_must_fail git clean\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <clean.requireForce>)} { (SQ <'\n'> <'\n'> <'\tgit config clean.requireForce true &&\n'> <'\ttest_must_fail git clean\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'clean.requireForce and -n'>)} { (SQ <'\n'> <'\n'> <'\tmkdir -p build docs &&\n'> <'\ttouch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&\n'> <'\tgit clean -n &&\n'> <'\ttest -f Makefile &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest -f a.out &&\n'> <'\ttest -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SQ <'clean.requireForce and -f'>)} { (SQ <'\n'> <'\n'> <'\tgit clean -f &&\n'> <'\ttest -f README &&\n'> <'\ttest -f src/part1.c &&\n'> <'\ttest -f src/part2.c &&\n'> <'\ttest ! -f a.out &&\n'> <'\ttest ! -f src/part3.c &&\n'> <'\ttest -f docs/manual.txt &&\n'> <'\ttest -f obj.o &&\n'> <'\ttest -f build/lib.so\n'> <'\n'> ) } ) (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} {(SQ <core.excludesfile>)} { (SQ <'\n'> <'\n'> <'\techo excludes >excludes &&\n'> <'\techo included >included &&\n'> <'\tgit config core.excludesfile excludes &&\n'> <'\toutput=$(git clean -n excludes included 2>&1) &&\n'> <'\texpr "$output" : ".*included" >/dev/null &&\n'> <'\t! expr "$output" : ".*excludes" >/dev/null\n'> <'\n'> ) } ) (C {(test_expect_success)} {(SANITY)} {(SQ <'removal failure'>)} { (SQ <'\n'> <'\n'> <'\tmkdir foo &&\n'> <'\ttouch foo/bar &&\n'> <'\ttest_when_finished "chmod 755 foo" &&\n'> <'\t(exec <foo/bar &&\n'> <'\t chmod 0 foo &&\n'> <'\t test_must_fail git clean -f -d)\n'> ) } ) (C {(test_expect_success)} {(SQ <'nested git work tree'>)} { (SQ <'\n'> <'\trm -fr foo bar baz &&\n'> <'\tmkdir -p foo bar baz/boo &&\n'> <'\t(\n'> <'\t\tcd foo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit nested hello.world\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd bar &&\n'> <'\t\t>goodbye.people\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd baz/boo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit deeply.nested deeper.world\n'> <'\t) &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest -f foo/.git/index &&\n'> <'\ttest -f foo/hello.world &&\n'> <'\ttest -f baz/boo/.git/index &&\n'> <'\ttest -f baz/boo/deeper.world &&\n'> <'\t! test -d bar\n'> ) } ) (C {(test_expect_success)} {(SQ <'should clean things that almost look like git but are not'>)} { (SQ <'\n'> <'\trm -fr almost_git almost_bare_git almost_submodule &&\n'> <'\tmkdir -p almost_git/.git/objects &&\n'> <'\tmkdir -p almost_git/.git/refs &&\n'> <'\tcat >almost_git/.git/HEAD <<-\\EOF &&\n'> <'\tgarbage\n'> <'\tEOF\n'> <'\tcp -r almost_git/.git/ almost_bare_git &&\n'> <'\tmkdir almost_submodule/ &&\n'> <'\tcat >almost_submodule/.git <<-\\EOF &&\n'> <'\tgarbage\n'> <'\tEOF\n'> <'\ttest_when_finished "rm -rf almost_*" &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_missing almost_git &&\n'> <'\ttest_path_is_missing almost_bare_git &&\n'> <'\ttest_path_is_missing almost_submodule\n'> ) } ) (C {(test_expect_success)} {(SQ <'should not clean submodules'>)} { (SQ <'\n'> <'\trm -fr repo to_clean sub1 sub2 &&\n'> <'\tmkdir repo to_clean &&\n'> <'\t(\n'> <'\t\tcd repo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit msg hello.world\n'> <'\t) &&\n'> <'\tgit submodule add ./repo/.git sub1 &&\n'> <'\tgit commit -m "sub1" &&\n'> <'\tgit branch before_sub2 &&\n'> <'\tgit submodule add ./repo/.git sub2 &&\n'> <'\tgit commit -m "sub2" &&\n'> <'\tgit checkout before_sub2 &&\n'> <'\t>to_clean/should_clean.this &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_file repo/.git/index &&\n'> <'\ttest_path_is_file repo/hello.world &&\n'> <'\ttest_path_is_file sub1/.git &&\n'> <'\ttest_path_is_file sub1/hello.world &&\n'> <'\ttest_path_is_file sub2/.git &&\n'> <'\ttest_path_is_file sub2/hello.world &&\n'> <'\ttest_path_is_missing to_clean\n'> ) } ) (C {(test_expect_success)} {(POSIXPERM) (Lit_Comma ',') (SANITY)} {(SQ <'should avoid cleaning possible submodules'>)} { (SQ <'\n'> <'\trm -fr to_clean possible_sub1 &&\n'> <'\tmkdir to_clean possible_sub1 &&\n'> <'\ttest_when_finished "rm -rf possible_sub*" &&\n'> <'\techo "gitdir: foo" >possible_sub1/.git &&\n'> <'\t>possible_sub1/hello.world &&\n'> <'\tchmod 0 possible_sub1/.git &&\n'> <'\t>to_clean/should_clean.this &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_file possible_sub1/.git &&\n'> <'\ttest_path_is_file possible_sub1/hello.world &&\n'> <'\ttest_path_is_missing to_clean\n'> ) } ) (C {(test_expect_success)} {(SQ <'nested (empty) git should be kept'>)} { (SQ <'\n'> <'\trm -fr empty_repo to_clean &&\n'> <'\tgit init empty_repo &&\n'> <'\tmkdir to_clean &&\n'> <'\t>to_clean/should_clean.this &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_file empty_repo/.git/HEAD &&\n'> <'\ttest_path_is_missing to_clean\n'> ) } ) (C {(test_expect_success)} {(SQ <'nested bare repositories should be cleaned'>)} { (SQ <'\n'> <'\trm -fr bare1 bare2 subdir &&\n'> <'\tgit init --bare bare1 &&\n'> <'\tgit clone --local --bare . bare2 &&\n'> <'\tmkdir subdir &&\n'> <'\tcp -r bare2 subdir/bare3 &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_missing bare1 &&\n'> <'\ttest_path_is_missing bare2 &&\n'> <'\ttest_path_is_missing subdir\n'> ) } ) (C {(test_expect_failure)} {(SQ <'nested (empty) bare repositories should be cleaned even when in .git'>)} { (SQ <'\n'> <'\trm -fr strange_bare &&\n'> <'\tmkdir strange_bare &&\n'> <'\tgit init --bare strange_bare/.git &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_missing strange_bare\n'> ) } ) (C {(test_expect_failure)} {(SQ <'nested (non-empty) bare repositories should be cleaned even when in .git'>)} { (SQ <'\n'> <'\trm -fr strange_bare &&\n'> <'\tmkdir strange_bare &&\n'> <'\tgit clone --local --bare . strange_bare/.git &&\n'> <'\tgit clean -f -d &&\n'> <'\ttest_path_is_missing strange_bare\n'> ) } ) (C {(test_expect_success)} {(SQ <'giving path in nested git work tree will remove it'>)} { (SQ <'\n'> <'\trm -fr repo &&\n'> <'\tmkdir repo &&\n'> <'\t(\n'> <'\t\tcd repo &&\n'> <'\t\tgit init &&\n'> <'\t\tmkdir -p bar/baz &&\n'> <'\t\ttest_commit msg bar/baz/hello.world\n'> <'\t) &&\n'> <'\tgit clean -f -d repo/bar/baz &&\n'> <'\ttest_path_is_file repo/.git/HEAD &&\n'> <'\ttest_path_is_dir repo/bar/ &&\n'> <'\ttest_path_is_missing repo/bar/baz\n'> ) } ) (C {(test_expect_success)} {(SQ <'giving path to nested .git will not remove it'>)} { (SQ <'\n'> <'\trm -fr repo &&\n'> <'\tmkdir repo untracked &&\n'> <'\t(\n'> <'\t\tcd repo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit msg hello.world\n'> <'\t) &&\n'> <'\tgit clean -f -d repo/.git &&\n'> <'\ttest_path_is_file repo/.git/HEAD &&\n'> <'\ttest_path_is_dir repo/.git/refs &&\n'> <'\ttest_path_is_dir repo/.git/objects &&\n'> <'\ttest_path_is_dir untracked/\n'> ) } ) (C {(test_expect_success)} {(SQ <'giving path to nested .git/ will remove contents'>)} { (SQ <'\n'> <'\trm -fr repo untracked &&\n'> <'\tmkdir repo untracked &&\n'> <'\t(\n'> <'\t\tcd repo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit msg hello.world\n'> <'\t) &&\n'> <'\tgit clean -f -d repo/.git/ &&\n'> <'\ttest_path_is_dir repo/.git &&\n'> <'\ttest_dir_is_empty repo/.git &&\n'> <'\ttest_path_is_dir untracked/\n'> ) } ) (C {(test_expect_success)} {(SQ <'force removal of nested git work tree'>)} { (SQ <'\n'> <'\trm -fr foo bar baz &&\n'> <'\tmkdir -p foo bar baz/boo &&\n'> <'\t(\n'> <'\t\tcd foo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit nested hello.world\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd bar &&\n'> <'\t\t>goodbye.people\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd baz/boo &&\n'> <'\t\tgit init &&\n'> <'\t\ttest_commit deeply.nested deeper.world\n'> <'\t) &&\n'> <'\tgit clean -f -f -d &&\n'> <'\t! test -d foo &&\n'> <'\t! test -d bar &&\n'> <'\t! test -d baz\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -e'>)} { (SQ <'\n'> <'\trm -fr repo &&\n'> <'\tmkdir repo &&\n'> <'\t(\n'> <'\t\tcd repo &&\n'> <'\t\tgit init &&\n'> <'\t\ttouch known 1 2 3 &&\n'> <'\t\tgit add known &&\n'> <'\t\tgit clean -f -e 1 -e 2 &&\n'> <'\t\ttest -e 1 &&\n'> <'\t\ttest -e 2 &&\n'> <'\t\t! (test -e 3) &&\n'> <'\t\ttest -e known\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(SANITY)} {(SQ <'git clean -d with an unreadable empty directory'>)} { (SQ <'\n'> <'\tmkdir foo &&\n'> <'\tchmod a= foo &&\n'> <'\tgit clean -dfx foo &&\n'> <'\t! test -d foo\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d respects pathspecs (dir is prefix of pathspec)'>)} { (SQ <'\n'> <'\tmkdir -p foo &&\n'> <'\tmkdir -p foobar &&\n'> <'\tgit clean -df foobar &&\n'> <'\ttest_path_is_dir foo &&\n'> <'\ttest_path_is_missing foobar\n'> ) } ) (C {(test_expect_success)} {(SQ <'git clean -d respects pathspecs (pathspec is prefix of dir)'>)} { (SQ <'\n'> <'\tmkdir -p foo &&\n'> <'\tmkdir -p foobar &&\n'> <'\tgit clean -df foo &&\n'> <'\ttest_path_is_missing foo &&\n'> <'\ttest_path_is_dir foobar\n'> ) } ) (C {(test_done)}) ] )