You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
7.3 KiB
258 lines
7.3 KiB
#!/bin/sh |
|
# |
|
# Copyright (c) 2014 Heiko Voigt |
|
# |
|
|
|
test_description='Test submodules config cache infrastructure |
|
|
|
This test verifies that parsing .gitmodules configurations directly |
|
from the database and from the worktree works. |
|
' |
|
|
|
TEST_NO_CREATE_REPO=1 |
|
. ./test-lib.sh |
|
|
|
test_expect_success 'submodule config cache setup' ' |
|
mkdir submodule && |
|
(cd submodule && |
|
git init && |
|
echo a >a && |
|
git add . && |
|
git commit -ma |
|
) && |
|
mkdir super && |
|
(cd super && |
|
git init && |
|
git submodule add ../submodule && |
|
git submodule add ../submodule a && |
|
git commit -m "add as submodule and as a" && |
|
git mv a b && |
|
git commit -m "move a to b" |
|
) |
|
' |
|
|
|
test_expect_success 'configuration parsing with error' ' |
|
test_when_finished "rm -rf repo" && |
|
test_create_repo repo && |
|
cat >repo/.gitmodules <<-\EOF && |
|
[submodule "s"] |
|
path |
|
ignore |
|
EOF |
|
( |
|
cd repo && |
|
test_must_fail test-tool submodule-config "" s 2>actual && |
|
test_i18ngrep "bad config" actual |
|
) |
|
' |
|
|
|
cat >super/expect <<EOF |
|
Submodule name: 'a' for path 'a' |
|
Submodule name: 'a' for path 'b' |
|
Submodule name: 'submodule' for path 'submodule' |
|
Submodule name: 'submodule' for path 'submodule' |
|
EOF |
|
|
|
test_expect_success 'test parsing and lookup of submodule config by path' ' |
|
(cd super && |
|
test-tool submodule-config \ |
|
HEAD^ a \ |
|
HEAD b \ |
|
HEAD^ submodule \ |
|
HEAD submodule \ |
|
>actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'test parsing and lookup of submodule config by name' ' |
|
(cd super && |
|
test-tool submodule-config --name \ |
|
HEAD^ a \ |
|
HEAD a \ |
|
HEAD^ submodule \ |
|
HEAD submodule \ |
|
>actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
cat >super/expect_error <<EOF |
|
Submodule name: 'a' for path 'b' |
|
Submodule name: 'submodule' for path 'submodule' |
|
EOF |
|
|
|
test_expect_success 'error in history of one submodule config lets continue, stderr message contains blob ref' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
cp .gitmodules .gitmodules.bak && |
|
echo " value = \"" >>.gitmodules && |
|
git add .gitmodules && |
|
mv .gitmodules.bak .gitmodules && |
|
git commit -m "add error" && |
|
sha1=$(git rev-parse HEAD) && |
|
test-tool submodule-config \ |
|
HEAD b \ |
|
HEAD submodule \ |
|
>actual \ |
|
2>actual_stderr && |
|
test_cmp expect_error actual && |
|
test_i18ngrep "submodule-blob $sha1:.gitmodules" actual_stderr >/dev/null |
|
) |
|
' |
|
|
|
test_expect_success 'using different treeishs works' ' |
|
( |
|
cd super && |
|
git tag new_tag && |
|
tree=$(git rev-parse HEAD^{tree}) && |
|
commit=$(git rev-parse HEAD^{commit}) && |
|
test-tool submodule-config $commit b >expect && |
|
test-tool submodule-config $tree b >actual.1 && |
|
test-tool submodule-config new_tag b >actual.2 && |
|
test_cmp expect actual.1 && |
|
test_cmp expect actual.2 |
|
) |
|
' |
|
|
|
test_expect_success 'error in history in fetchrecursesubmodule lets continue' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
git config -f .gitmodules \ |
|
submodule.submodule.fetchrecursesubmodules blabla && |
|
git add .gitmodules && |
|
git config --unset -f .gitmodules \ |
|
submodule.submodule.fetchrecursesubmodules && |
|
git commit -m "add error in fetchrecursesubmodules" && |
|
test-tool submodule-config \ |
|
HEAD b \ |
|
HEAD submodule \ |
|
>actual && |
|
test_cmp expect_error actual |
|
) |
|
' |
|
|
|
test_expect_success 'reading submodules config from the working tree with "submodule--helper config"' ' |
|
(cd super && |
|
echo "../submodule" >expect && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'unsetting submodules config from the working tree with "submodule--helper config --unset"' ' |
|
(cd super && |
|
git submodule--helper config --unset submodule.submodule.url && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_must_be_empty actual |
|
) |
|
' |
|
|
|
|
|
test_expect_success 'writing submodules config with "submodule--helper config"' ' |
|
(cd super && |
|
echo "new_url" >expect && |
|
git submodule--helper config submodule.submodule.url "new_url" && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'overwriting unstaged submodules config with "submodule--helper config"' ' |
|
test_when_finished "git -C super checkout .gitmodules" && |
|
(cd super && |
|
echo "newer_url" >expect && |
|
git submodule--helper config submodule.submodule.url "newer_url" && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'writeable .gitmodules when it is in the working tree' ' |
|
git -C super submodule--helper config --check-writeable |
|
' |
|
|
|
test_expect_success 'writeable .gitmodules when it is nowhere in the repository' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
git rm .gitmodules && |
|
git commit -m "remove .gitmodules from the current branch" && |
|
git submodule--helper config --check-writeable |
|
) |
|
' |
|
|
|
test_expect_success 'non-writeable .gitmodules when it is in the index but not in the working tree' ' |
|
test_when_finished "git -C super checkout .gitmodules" && |
|
(cd super && |
|
rm -f .gitmodules && |
|
test_must_fail git submodule--helper config --check-writeable |
|
) |
|
' |
|
|
|
test_expect_success 'non-writeable .gitmodules when it is in the current branch but not in the index' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
git rm .gitmodules && |
|
test_must_fail git submodule--helper config --check-writeable |
|
) |
|
' |
|
|
|
test_expect_success 'reading submodules config from the index when .gitmodules is not in the working tree' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
git submodule--helper config submodule.submodule.url "staged_url" && |
|
git add .gitmodules && |
|
rm -f .gitmodules && |
|
echo "staged_url" >expect && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'reading submodules config from the current branch when .gitmodules is not in the index' ' |
|
ORIG=$(git -C super rev-parse HEAD) && |
|
test_when_finished "git -C super reset --hard $ORIG" && |
|
(cd super && |
|
git rm .gitmodules && |
|
echo "../submodule" >expect && |
|
git submodule--helper config submodule.submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'reading nested submodules config' ' |
|
(cd super && |
|
git init submodule/nested_submodule && |
|
echo "a" >submodule/nested_submodule/a && |
|
git -C submodule/nested_submodule add a && |
|
git -C submodule/nested_submodule commit -m "add a" && |
|
git -C submodule submodule add ./nested_submodule && |
|
git -C submodule add nested_submodule && |
|
git -C submodule commit -m "added nested_submodule" && |
|
git add submodule && |
|
git commit -m "updated submodule" && |
|
echo "./nested_submodule" >expect && |
|
test-tool submodule-nested-repo-config \ |
|
submodule submodule.nested_submodule.url >actual && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_expect_success 'reading nested submodules config when .gitmodules is not in the working tree' ' |
|
test_when_finished "git -C super/submodule checkout .gitmodules" && |
|
(cd super && |
|
echo "./nested_submodule" >expect && |
|
rm submodule/.gitmodules && |
|
test-tool submodule-nested-repo-config \ |
|
submodule submodule.nested_submodule.url >actual 2>warning && |
|
test_must_be_empty warning && |
|
test_cmp expect actual |
|
) |
|
' |
|
|
|
test_done
|
|
|