git submodule commands can now access .gitmodules from the index when it's not checked out in the work tree, add some tests for that scenario. Signed-off-by: Antonio Ospite <ao2@xxxxxx> --- t/t7415-submodule-sparse-gitmodules.sh | 124 +++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100755 t/t7415-submodule-sparse-gitmodules.sh diff --git a/t/t7415-submodule-sparse-gitmodules.sh b/t/t7415-submodule-sparse-gitmodules.sh new file mode 100755 index 000000000..3ae269b3a --- /dev/null +++ b/t/t7415-submodule-sparse-gitmodules.sh @@ -0,0 +1,124 @@ +#!/bin/sh +# +# Copyright (C) 2018 Antonio Ospite <ao2@xxxxxx> +# + +test_description=' Test reading/writing the gitmodules config file when not checked out + +This test verifies that reading the gitmodules config file from the index when +it is not checked out works, and that writing to it does not. +' + +. ./test-lib.sh + +test_expect_success 'sparse checkout setup which hides .gitmodules' ' + echo file > file && + git add file && + test_tick && + git commit -m upstream && + git clone . super && + git clone super submodule && + git clone super new_submodule && + (cd super && + git submodule add ../submodule + test_tick && + git commit -m submodule && + cat >.git/info/sparse-checkout <<\EOF && +/* +!/.gitmodules +EOF + git config core.sparsecheckout true && + git read-tree -m -u HEAD && + test ! -e .gitmodules + ) +' + +test_expect_success 'reading gitmodules config file when it is not checked out' ' + (cd super && + echo "../submodule" >expected && + git submodule--helper config submodule.submodule.url >actual && + test_cmp expected actual + ) +' + +test_expect_success 'not writing gitmodules config file when it is not checked out' ' + (cd super && + test_must_fail git submodule--helper config submodule.submodule.url newurl + ) +' + +test_expect_success 'not staging gitmodules config when it is not checked out' ' + (cd super && + test_must_fail git submodule--helper config --stage + ) +' + +test_expect_success 'not even staging manually crafted .gitmodules when it is not supposed to be checked out' ' + (cd super && + echo "bogus content" > .gitmodules && + test_must_fail git submodule--helper config --stage && + rm .gitmodules + ) +' + +test_expect_success 'initialising submodule when the gitmodules config is not checked out' ' + (cd super && + git submodule init + ) +' + +test_expect_success 'showing submodule summary when the gitmodules config is not checked out' ' + (cd super && + git submodule summary + ) +' + +test_expect_success 'updating submodule when the gitmodules config is not checked out' ' + (cd submodule && + echo file2 >file2 && + git add file2 && + git commit -m "add file2 to submodule" + ) && + (cd super && + git submodule update + ) +' + +test_expect_success 'not moving submodule when the gitmodules config is not checked out' ' + (cd super && + test_must_fail git mv submodule moved_submodule + ) +' + +test_expect_success 'not removing submodule when the gitmodules config is not checked out' ' + (cd super && + test_must_fail git rm -r submodule + ) +' + +test_expect_success 'not adding submodules when the gitmodules config is not checked out' ' + (cd super && + test_must_fail git submodule add ../new_submodule + ) +' + +# "git add" in the test above fails as expected, however it still leaves the +# cloned directory there and adds a config entry to .git/config. This is +# because no cleanup is done by cmd_add in git-submodule.sh when "git +# submodule--helper config" fails to add a new config setting. +# +# If we added the following commands to the test above: +# +# rm -rf .git/modules/new_submodule && +# git reset HEAD new_submodule && +# rm -rf new_submodule +# +# then the repository would be in a clean status and the test below would +# pass, but maybe cmd_add should do that. +test_expect_failure 'init submodule after adding failed when the gitmodules config is not checked out' ' + (cd super && + git submodule init + ) +' + +test_done -- 2.17.0