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