| #!/bin/sh | |
| test_description='check that submodule operations do not follow symlinks' | |
| . ./test-lib.sh | |
| test_expect_success 'prepare' ' | |
| git config --global protocol.file.allow always && | |
| test_commit initial && | |
| git init upstream && | |
| test_commit -C upstream upstream submodule_file && | |
| git submodule add ./upstream a/sm && | |
| test_tick && | |
| git commit -m submodule | |
| ' | |
| test_expect_success SYMLINKS 'git submodule update must not create submodule behind symlink' ' | |
| rm -rf a b && | |
| mkdir b && | |
| ln -s b a && | |
| test_path_is_missing b/sm && | |
| test_must_fail git submodule update && | |
| test_path_is_missing b/sm | |
| ' | |
| test_expect_success SYMLINKS,CASE_INSENSITIVE_FS 'git submodule update must not create submodule behind symlink on case insensitive fs' ' | |
| rm -rf a b && | |
| mkdir b && | |
| ln -s b A && | |
| test_must_fail git submodule update && | |
| test_path_is_missing b/sm | |
| ' | |
| prepare_symlink_to_repo() { | |
| rm -rf a && | |
| mkdir a && | |
| git init a/target && | |
| git -C a/target fetch ../../upstream && | |
| ln -s target a/sm | |
| } | |
| test_expect_success SYMLINKS 'git restore --recurse-submodules must not be confused by a symlink' ' | |
| prepare_symlink_to_repo && | |
| test_must_fail git restore --recurse-submodules a/sm && | |
| test_path_is_missing a/sm/submodule_file && | |
| test_path_is_dir a/target/.git && | |
| test_path_is_missing a/target/submodule_file | |
| ' | |
| test_expect_success SYMLINKS 'git restore --recurse-submodules must not migrate git dir of symlinked repo' ' | |
| prepare_symlink_to_repo && | |
| rm -rf .git/modules && | |
| test_must_fail git restore --recurse-submodules a/sm && | |
| test_path_is_dir a/target/.git && | |
| test_path_is_missing .git/modules/a/sm && | |
| test_path_is_missing a/target/submodule_file | |
| ' | |
| test_expect_success SYMLINKS 'git checkout -f --recurse-submodules must not migrate git dir of symlinked repo when removing submodule' ' | |
| prepare_symlink_to_repo && | |
| rm -rf .git/modules && | |
| test_must_fail git checkout -f --recurse-submodules initial && | |
| test_path_is_dir a/target/.git && | |
| test_path_is_missing .git/modules/a/sm | |
| ' | |
| test_done |