#!/bin/sh global test_description := ''fetch/push involving ref namespaces'' source ./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_expect_success 'hide namespaced refs with transfer.hideRefs' ' GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs=refs/tags \ ls-remote "ext::git %s ." >actual && printf "$commit1\trefs/heads/master\n" >expected && test_cmp expected actual ' test_expect_success 'check that transfer.hideRefs does not match unstripped refs' ' GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs=refs/namespaces/namespace/refs/tags \ ls-remote "ext::git %s ." >actual && printf "$commit1\trefs/heads/master\n" >expected && printf "$commit0\trefs/tags/0\n" >>expected && printf "$commit1\trefs/tags/1\n" >>expected && test_cmp expected actual ' test_expect_success 'hide full refs with transfer.hideRefs' ' GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs="^refs/namespaces/namespace/refs/tags" \ ls-remote "ext::git %s ." >actual && printf "$commit1\trefs/heads/master\n" >expected && test_cmp expected actual ' test_expect_success 'try to update a hidden ref' ' test_config -C pushee transfer.hideRefs refs/heads/master && test_must_fail git -C original push pushee-namespaced master ' test_expect_success 'try to update a ref that is not hidden' ' test_config -C pushee transfer.hideRefs refs/namespaces/namespace/refs/heads/master && git -C original push pushee-namespaced master ' test_expect_success 'try to update a hidden full ref' ' test_config -C pushee transfer.hideRefs "^refs/namespaces/namespace/refs/heads/master" && test_must_fail git -C original push pushee-namespaced master ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"fetch/push involving ref namespaces">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\ttest_tick &&\n"> <"\tgit init original &&\n"> <"\t(\n"> <"\t\tcd original &&\n"> <"\t\techo 0 >count &&\n"> <"\t\tgit add count &&\n"> <"\t\ttest_commit 0 &&\n"> <"\t\techo 1 >count &&\n"> <"\t\tgit add count &&\n"> <"\t\ttest_commit 1 &&\n"> < "\t\tgit remote add pushee-namespaced \"ext::git --namespace=namespace %s ../pushee\" &&\n" > <"\t\tgit remote add pushee-unnamespaced ../pushee\n"> <"\t) &&\n"> <"\tcommit0=$(cd original && git rev-parse HEAD^) &&\n"> <"\tcommit1=$(cd original && git rev-parse HEAD) &&\n"> <"\tgit init pushee &&\n"> <"\tgit init puller\n"> ) } ) (C {(test_expect_success)} {(SQ <"pushing into a repository using a ref namespace">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd original &&\n"> <"\t\tgit push pushee-namespaced master &&\n"> <"\t\tgit ls-remote pushee-namespaced >actual &&\n"> <"\t\tprintf \"$commit1\\trefs/heads/master\\n\" >expected &&\n"> <"\t\ttest_cmp expected actual &&\n"> <"\t\tgit push pushee-namespaced --tags &&\n"> <"\t\tgit ls-remote pushee-namespaced >actual &&\n"> <"\t\tprintf \"$commit0\\trefs/tags/0\\n\" >>expected &&\n"> <"\t\tprintf \"$commit1\\trefs/tags/1\\n\" >>expected &&\n"> <"\t\ttest_cmp expected actual &&\n"> <"\t\t# Verify that the GIT_NAMESPACE environment variable works as well\n"> <"\t\tGIT_NAMESPACE=namespace git ls-remote \"ext::git %s ../pushee\" >actual &&\n"> <"\t\ttest_cmp expected actual &&\n"> <"\t\t# Verify that --namespace overrides GIT_NAMESPACE\n"> <"\t\tGIT_NAMESPACE=garbage git ls-remote pushee-namespaced >actual &&\n"> <"\t\ttest_cmp expected actual &&\n"> <"\t\t# Try a namespace with no content\n"> <"\t\tgit ls-remote \"ext::git --namespace=garbage %s ../pushee\" >actual &&\n"> <"\t\ttest_cmp /dev/null actual &&\n"> <"\t\tgit ls-remote pushee-unnamespaced >actual &&\n"> < "\t\tsed -e \"s|refs/|refs/namespaces/namespace/refs/|\" expected >expected.unnamespaced &&\n" > <"\t\ttest_cmp expected.unnamespaced actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"pulling from a repository using a ref namespace">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd puller &&\n"> < "\t\tgit remote add -f pushee-namespaced \"ext::git --namespace=namespace %s ../pushee\" &&\n" > <"\t\tgit for-each-ref refs/ >actual &&\n"> < "\t\tprintf \"$commit1 commit\\trefs/remotes/pushee-namespaced/master\\n\" >expected &&\n" > <"\t\tprintf \"$commit0 commit\\trefs/tags/0\\n\" >>expected &&\n"> <"\t\tprintf \"$commit1 commit\\trefs/tags/1\\n\" >>expected &&\n"> <"\t\ttest_cmp expected actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"mirroring a repository using a ref namespace">)} { (SQ <"\n"> <"\tgit clone --mirror pushee mirror &&\n"> <"\t(\n"> <"\t\tcd mirror &&\n"> <"\t\tgit for-each-ref refs/ >actual &&\n"> <"\t\tprintf \"$commit1 commit\\trefs/namespaces/namespace/refs/heads/master\\n\" >expected &&\n"> < "\t\tprintf \"$commit0 commit\\trefs/namespaces/namespace/refs/tags/0\\n\" >>expected &&\n" > <"\t\tprintf \"$commit1 commit\\trefs/namespaces/namespace/refs/tags/1\\n\" >>expected &&\n"> <"\t\ttest_cmp expected actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"hide namespaced refs with transfer.hideRefs">)} { (SQ <"\n"> <"\tGIT_NAMESPACE=namespace \\\n"> <"\t\tgit -C pushee -c transfer.hideRefs=refs/tags \\\n"> <"\t\tls-remote \"ext::git %s .\" >actual &&\n"> <"\tprintf \"$commit1\\trefs/heads/master\\n\" >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"check that transfer.hideRefs does not match unstripped refs">)} { (SQ <"\n"> <"\tGIT_NAMESPACE=namespace \\\n"> <"\t\tgit -C pushee -c transfer.hideRefs=refs/namespaces/namespace/refs/tags \\\n"> <"\t\tls-remote \"ext::git %s .\" >actual &&\n"> <"\tprintf \"$commit1\\trefs/heads/master\\n\" >expected &&\n"> <"\tprintf \"$commit0\\trefs/tags/0\\n\" >>expected &&\n"> <"\tprintf \"$commit1\\trefs/tags/1\\n\" >>expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"hide full refs with transfer.hideRefs">)} { (SQ <"\n"> <"\tGIT_NAMESPACE=namespace \\\n"> <"\t\tgit -C pushee -c transfer.hideRefs=\"^refs/namespaces/namespace/refs/tags\" \\\n"> <"\t\tls-remote \"ext::git %s .\" >actual &&\n"> <"\tprintf \"$commit1\\trefs/heads/master\\n\" >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"try to update a hidden ref">)} { (SQ <"\n"> <"\ttest_config -C pushee transfer.hideRefs refs/heads/master &&\n"> <"\ttest_must_fail git -C original push pushee-namespaced master\n"> ) } ) (C {(test_expect_success)} {(SQ <"try to update a ref that is not hidden">)} { (SQ <"\n"> < "\ttest_config -C pushee transfer.hideRefs refs/namespaces/namespace/refs/heads/master &&\n" > <"\tgit -C original push pushee-namespaced master\n"> ) } ) (C {(test_expect_success)} {(SQ <"try to update a hidden full ref">)} { (SQ <"\n"> < "\ttest_config -C pushee transfer.hideRefs \"^refs/namespaces/namespace/refs/heads/master\" &&\n" > <"\ttest_must_fail git -C original push pushee-namespaced master\n"> ) } ) (C {(test_done)}) ] )