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