(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'fetch/push involving ref namespaces'>)}
          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>})
  ]
)