(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)})
  ]
)