| #!/bin/sh | 
 |  | 
 | test_description='fetch/push involving ref namespaces' | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success setup ' | 
 | 	test_tick && | 
 | 	git init original && | 
 | 	( | 
 | 		cd original && | 
 | 		echo 0 >count && | 
 | 		git add count && | 
 | 		test_commit 0 && | 
 | 		echo 1 >count && | 
 | 		git add count && | 
 | 		test_commit 1 && | 
 | 		git remote add pushee-namespaced "ext::git --namespace=namespace %s ../pushee" && | 
 | 		git remote add pushee-unnamespaced ../pushee | 
 | 	) && | 
 | 	commit0=$(cd original && git rev-parse HEAD^) && | 
 | 	commit1=$(cd original && git rev-parse HEAD) && | 
 | 	git init pushee && | 
 | 	git init puller | 
 | ' | 
 |  | 
 | test_expect_success 'pushing into a repository using a ref namespace' ' | 
 | 	( | 
 | 		cd original && | 
 | 		git push pushee-namespaced master && | 
 | 		git ls-remote pushee-namespaced >actual && | 
 | 		printf "$commit1\trefs/heads/master\n" >expected && | 
 | 		test_cmp expected actual && | 
 | 		git push pushee-namespaced --tags && | 
 | 		git ls-remote pushee-namespaced >actual && | 
 | 		printf "$commit0\trefs/tags/0\n" >>expected && | 
 | 		printf "$commit1\trefs/tags/1\n" >>expected && | 
 | 		test_cmp expected actual && | 
 | 		# Verify that the GIT_NAMESPACE environment variable works as well | 
 | 		GIT_NAMESPACE=namespace git ls-remote "ext::git %s ../pushee" >actual && | 
 | 		test_cmp expected actual && | 
 | 		# Verify that --namespace overrides GIT_NAMESPACE | 
 | 		GIT_NAMESPACE=garbage git ls-remote pushee-namespaced >actual && | 
 | 		test_cmp expected actual && | 
 | 		# Try a namespace with no content | 
 | 		git ls-remote "ext::git --namespace=garbage %s ../pushee" >actual && | 
 | 		test_cmp /dev/null actual && | 
 | 		git ls-remote pushee-unnamespaced >actual && | 
 | 		sed -e "s|refs/|refs/namespaces/namespace/refs/|" expected >expected.unnamespaced && | 
 | 		test_cmp expected.unnamespaced actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'pulling from a repository using a ref namespace' ' | 
 | 	( | 
 | 		cd puller && | 
 | 		git remote add -f pushee-namespaced "ext::git --namespace=namespace %s ../pushee" && | 
 | 		git for-each-ref refs/ >actual && | 
 | 		printf "$commit1 commit\trefs/remotes/pushee-namespaced/master\n" >expected && | 
 | 		printf "$commit0 commit\trefs/tags/0\n" >>expected && | 
 | 		printf "$commit1 commit\trefs/tags/1\n" >>expected && | 
 | 		test_cmp expected actual | 
 | 	) | 
 | ' | 
 |  | 
 | # This test with clone --mirror checks for possible regressions in clone | 
 | # or the machinery underneath it. It ensures that no future change | 
 | # causes clone to ignore refs in refs/namespaces/*. In particular, it | 
 | # protects against a regression caused by any future change to the refs | 
 | # machinery that might cause it to ignore refs outside of refs/heads/* | 
 | # or refs/tags/*. More generally, this test also checks the high-level | 
 | # functionality of using clone --mirror to back up a set of repos hosted | 
 | # in the namespaces of a single repo. | 
 | test_expect_success 'mirroring a repository using a ref namespace' ' | 
 | 	git clone --mirror pushee mirror && | 
 | 	( | 
 | 		cd mirror && | 
 | 		git for-each-ref refs/ >actual && | 
 | 		printf "$commit1 commit\trefs/namespaces/namespace/refs/heads/master\n" >expected && | 
 | 		printf "$commit0 commit\trefs/namespaces/namespace/refs/tags/0\n" >>expected && | 
 | 		printf "$commit1 commit\trefs/namespaces/namespace/refs/tags/1\n" >>expected && | 
 | 		test_cmp expected actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_done |