Merge branch 'sb/checkout-recurse-submodules'
[gitweb.git] / t / t7300-clean.sh
index 634808a708588896f2e6ffbc1e2e28575409b0eb..b89fd2a6ada025fc0e68b1a1c3d7e739aacec688 100755 (executable)
@@ -451,6 +451,146 @@ test_expect_success 'nested git work tree' '
        ! test -d bar
 '
 
+test_expect_success 'should clean things that almost look like git but are not' '
+       rm -fr almost_git almost_bare_git almost_submodule &&
+       mkdir -p almost_git/.git/objects &&
+       mkdir -p almost_git/.git/refs &&
+       cat >almost_git/.git/HEAD <<-\EOF &&
+       garbage
+       EOF
+       cp -r almost_git/.git/ almost_bare_git &&
+       mkdir almost_submodule/ &&
+       cat >almost_submodule/.git <<-\EOF &&
+       garbage
+       EOF
+       test_when_finished "rm -rf almost_*" &&
+       git clean -f -d &&
+       test_path_is_missing almost_git &&
+       test_path_is_missing almost_bare_git &&
+       test_path_is_missing almost_submodule
+'
+
+test_expect_success 'should not clean submodules' '
+       rm -fr repo to_clean sub1 sub2 &&
+       mkdir repo to_clean &&
+       (
+               cd repo &&
+               git init &&
+               test_commit msg hello.world
+       ) &&
+       git submodule add ./repo/.git sub1 &&
+       git commit -m "sub1" &&
+       git branch before_sub2 &&
+       git submodule add ./repo/.git sub2 &&
+       git commit -m "sub2" &&
+       git checkout before_sub2 &&
+       >to_clean/should_clean.this &&
+       git clean -f -d &&
+       test_path_is_file repo/.git/index &&
+       test_path_is_file repo/hello.world &&
+       test_path_is_file sub1/.git &&
+       test_path_is_file sub1/hello.world &&
+       test_path_is_file sub2/.git &&
+       test_path_is_file sub2/hello.world &&
+       test_path_is_missing to_clean
+'
+
+test_expect_success POSIXPERM,SANITY 'should avoid cleaning possible submodules' '
+       rm -fr to_clean possible_sub1 &&
+       mkdir to_clean possible_sub1 &&
+       test_when_finished "rm -rf possible_sub*" &&
+       echo "gitdir: foo" >possible_sub1/.git &&
+       >possible_sub1/hello.world &&
+       chmod 0 possible_sub1/.git &&
+       >to_clean/should_clean.this &&
+       git clean -f -d &&
+       test_path_is_file possible_sub1/.git &&
+       test_path_is_file possible_sub1/hello.world &&
+       test_path_is_missing to_clean
+'
+
+test_expect_success 'nested (empty) git should be kept' '
+       rm -fr empty_repo to_clean &&
+       git init empty_repo &&
+       mkdir to_clean &&
+       >to_clean/should_clean.this &&
+       git clean -f -d &&
+       test_path_is_file empty_repo/.git/HEAD &&
+       test_path_is_missing to_clean
+'
+
+test_expect_success 'nested bare repositories should be cleaned' '
+       rm -fr bare1 bare2 subdir &&
+       git init --bare bare1 &&
+       git clone --local --bare . bare2 &&
+       mkdir subdir &&
+       cp -r bare2 subdir/bare3 &&
+       git clean -f -d &&
+       test_path_is_missing bare1 &&
+       test_path_is_missing bare2 &&
+       test_path_is_missing subdir
+'
+
+test_expect_failure 'nested (empty) bare repositories should be cleaned even when in .git' '
+       rm -fr strange_bare &&
+       mkdir strange_bare &&
+       git init --bare strange_bare/.git &&
+       git clean -f -d &&
+       test_path_is_missing strange_bare
+'
+
+test_expect_failure 'nested (non-empty) bare repositories should be cleaned even when in .git' '
+       rm -fr strange_bare &&
+       mkdir strange_bare &&
+       git clone --local --bare . strange_bare/.git &&
+       git clean -f -d &&
+       test_path_is_missing strange_bare
+'
+
+test_expect_success 'giving path in nested git work tree will remove it' '
+       rm -fr repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+               mkdir -p bar/baz &&
+               test_commit msg bar/baz/hello.world
+       ) &&
+       git clean -f -d repo/bar/baz &&
+       test_path_is_file repo/.git/HEAD &&
+       test_path_is_dir repo/bar/ &&
+       test_path_is_missing repo/bar/baz
+'
+
+test_expect_success 'giving path to nested .git will not remove it' '
+       rm -fr repo &&
+       mkdir repo untracked &&
+       (
+               cd repo &&
+               git init &&
+               test_commit msg hello.world
+       ) &&
+       git clean -f -d repo/.git &&
+       test_path_is_file repo/.git/HEAD &&
+       test_path_is_dir repo/.git/refs &&
+       test_path_is_dir repo/.git/objects &&
+       test_path_is_dir untracked/
+'
+
+test_expect_success 'giving path to nested .git/ will remove contents' '
+       rm -fr repo untracked &&
+       mkdir repo untracked &&
+       (
+               cd repo &&
+               git init &&
+               test_commit msg hello.world
+       ) &&
+       git clean -f -d repo/.git/ &&
+       test_path_is_dir repo/.git &&
+       test_dir_is_empty repo/.git &&
+       test_path_is_dir untracked/
+'
+
 test_expect_success 'force removal of nested git work tree' '
        rm -fr foo bar baz &&
        mkdir -p foo bar baz/boo &&