git submodule commands can now access .gitmodules from the current branch even when it's not in the working tree, add some tests for that scenario. Signed-off-by: Antonio Ospite <ao2@xxxxxx> --- For the test files I used the most used style in other tests, Stefan suggested to avoid subshells and use "git -C" but subshells make the test look cleaner IMHO. t/t7416-submodule-sparse-gitmodules.sh | 112 +++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 t/t7416-submodule-sparse-gitmodules.sh diff --git a/t/t7416-submodule-sparse-gitmodules.sh b/t/t7416-submodule-sparse-gitmodules.sh new file mode 100755 index 0000000000..3c7a53316b --- /dev/null +++ b/t/t7416-submodule-sparse-gitmodules.sh @@ -0,0 +1,112 @@ +#!/bin/sh +# +# Copyright (C) 2018 Antonio Ospite <ao2@xxxxxx> +# + +test_description=' Test reading/writing .gitmodules is not in the working tree + +This test verifies that, when .gitmodules is in the current branch but is not +in the working tree reading from it still works but writing to it does not. + +The test setup uses a sparse checkout, but the same scenario can be set up +also by committing .gitmodules and then just removing it from the filesystem. + +NOTE: "git mv" and "git rm" are still supposed to work even without +a .gitmodules file, as stated in the t3600-rm.sh and t7001-mv.sh tests. +' + +. ./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 '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 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 tree in 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 state and the test below would pass. +# +# Maybe cmd_add should do the cleanup from above itself when failing to add +# a submodule. +test_expect_failure 'init submodule after adding failed when the gitmodules config is not checked out' ' + (cd super && + git submodule init + ) +' + +test_done -- 2.18.0