(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'Test handling of ref names that check-ref-format rejects'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} {(SQ <'\n'> <'\ttest_commit one &&\n'> <'\ttest_commit two\n'>)})
    (C {(test_expect_success)} {(SQ <'fast-import: fail on invalid branch name ".badbranchname"'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&\n'> 
          <'\tcat >input <<-INPUT_END &&\n'> <'\t\tcommit .badbranchname\n'> 
          <'\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n'> <'\t\tdata <<COMMIT\n'> <'\t\tcorrupt\n'> <'\t\tCOMMIT\n'> <'\n'> <'\t\tfrom refs/heads/master\n'> <'\n'> 
          <'\tINPUT_END\n'> <'\ttest_must_fail git fast-import <input\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'fast-import: fail on invalid branch name "bad[branch]name"'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&\n'> 
          <'\tcat >input <<-INPUT_END &&\n'> <'\t\tcommit bad[branch]name\n'> 
          <'\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n'> <'\t\tdata <<COMMIT\n'> <'\t\tcorrupt\n'> <'\t\tCOMMIT\n'> <'\n'> <'\t\tfrom refs/heads/master\n'> <'\n'> 
          <'\tINPUT_END\n'> <'\ttest_must_fail git fast-import <input\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'git branch shows badly named ref as warning'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit branch >output 2>error &&\n'> 
          <
'\ttest_i18ngrep -e "ignoring ref with broken name refs/heads/broken\\.\\.\\.ref" error &&\n'
          > <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete badly named ref'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit branch -d broken...ref &&\n'> <'\tgit branch >output 2>error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -D can delete badly named ref'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit branch -D broken...ref &&\n'> <'\tgit branch >output 2>error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -D cannot delete non-ref in .git dir'>)} 
      {
        (SQ <'\n'> <'\techo precious >.git/my-private-file &&\n'> <'\techo precious >expect &&\n'> 
          <'\ttest_must_fail git branch -D ../../my-private-file &&\n'> <'\ttest_cmp expect .git/my-private-file\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -D cannot delete ref in .git dir'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse HEAD >.git/my-private-file &&\n'> 
          <'\tgit rev-parse HEAD >expect &&\n'> <'\tgit branch foo/legit &&\n'> 
          <'\ttest_must_fail git branch -D foo////./././../../../my-private-file &&\n'> <'\ttest_cmp expect .git/my-private-file\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -D cannot delete absolute path'>)} 
      {
        (SQ <'\n'> <'\tgit branch -f extra &&\n'> 
          <'\ttest_must_fail git branch -D "$(pwd)/.git/refs/heads/extra" &&\n'> <'\ttest_cmp_rev HEAD extra\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'git branch cannot create a badly named ref'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> 
          <'\ttest_must_fail git branch broken...ref &&\n'> <'\tgit branch >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -m cannot rename to a bad ref name'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> 
          <'\ttest_might_fail git branch -D goodref &&\n'> <'\tgit branch goodref &&\n'> <'\ttest_must_fail git branch -m goodref broken...ref &&\n'> 
          <'\ttest_cmp_rev master goodref &&\n'> <'\tgit branch >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_failure)} {(SQ <'branch -m can rename from a bad ref name'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit branch -m broken...ref renamed &&\n'> <'\ttest_cmp_rev master renamed &&\n'> 
          <'\tgit branch >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'push cannot create a badly named ref'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> 
          <'\ttest_must_fail git push "file://$(pwd)" HEAD:refs/heads/broken...ref &&\n'> <'\tgit branch >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_failure)} {(SQ <'push --mirror can delete badly named ref'>)} 
      {
        (SQ <'\n'> <'\ttop=$(pwd) &&\n'> <'\tgit init src &&\n'> <'\tgit init dest &&\n'> <'\n'> <'\t(\n'> 
          <'\t\tcd src &&\n'> <'\t\ttest_commit one\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd dest &&\n'> <'\t\ttest_commit two &&\n'> 
          <'\t\tgit checkout --detach &&\n'> <'\t\tcp .git/refs/heads/master .git/refs/heads/broken...ref\n'> <'\t) &&\n'> 
          <'\tgit -C src push --mirror "file://$top/dest" &&\n'> <'\tgit -C dest branch >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rev-parse skips symref pointing to broken name'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> 
          <'\tgit branch shadow one &&\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/tags/shadow &&\n'> <'\ttest_when_finished "rm -f .git/refs/tags/shadow" &&\n'> 
          <'\tgit rev-parse --verify one >expect &&\n'> <'\tgit rev-parse --verify shadow >actual 2>err &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\ttest_i18ngrep "ignoring dangling symref refs/tags/shadow" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'for-each-ref emits warnings for broken names'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tprintf "ref: refs/heads/master\\n" >.git/refs/heads/broken...symref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...symref" &&\n'> <'\tgit for-each-ref >output 2>error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output &&\n'> 
          <'\t! grep -e "badname" output &&\n'> <'\t! grep -e "broken\\.\\.\\.symref" output &&\n'> 
          <
'\ttest_i18ngrep "ignoring ref with broken name refs/heads/broken\\.\\.\\.ref" error &&\n'
          > <'\ttest_i18ngrep "ignoring broken ref refs/heads/badname" error &&\n'> 
          <
'\ttest_i18ngrep "ignoring ref with broken name refs/heads/broken\\.\\.\\.symref" error\n'
          >
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref -d can delete broken name'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit update-ref -d refs/heads/broken...ref >output 2>error &&\n'> 
          <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error &&\n'> <'\tgit branch >output 2>error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete broken name'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tgit branch -d broken...ref >output 2>error &&\n'> 
          <'\ttest_i18ngrep "Deleted branch broken...ref (was broken)" output &&\n'> <'\ttest_must_be_empty error &&\n'> <'\tgit branch >output 2>error &&\n'> 
          <'\t! grep -e "broken\\.\\.\\.ref" error &&\n'> <'\t! grep -e "broken\\.\\.\\.ref" output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --no-deref -d can delete symref to broken name'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tgit update-ref --no-deref -d refs/heads/badname >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/badname &&\n'> <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete symref to broken name'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tgit branch -d badname >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/badname &&\n'> <'\ttest_i18ngrep "Deleted branch badname (was refs/heads/broken\\.\\.\\.ref)" output &&\n'> 
          <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'update-ref --no-deref -d can delete dangling symref to broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tgit update-ref --no-deref -d refs/heads/badname >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/badname &&\n'> <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete dangling symref to broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tgit branch -d badname >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/badname &&\n'> <'\ttest_i18ngrep "Deleted branch badname (was refs/heads/broken\\.\\.\\.ref)" output &&\n'> 
          <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref -d can delete broken name through symref'>)} 
      {
        (SQ <'\n'> <'\tcp .git/refs/heads/master .git/refs/heads/broken...ref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...ref" &&\n'> <'\tprintf "ref: refs/heads/broken...ref\\n" >.git/refs/heads/badname &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/badname" &&\n'> <'\tgit update-ref -d refs/heads/badname >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/broken...ref &&\n'> <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --no-deref -d can delete symref with broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/master\\n" >.git/refs/heads/broken...symref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...symref" &&\n'> <'\tgit update-ref --no-deref -d refs/heads/broken...symref >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/broken...symref &&\n'> <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete symref with broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/master\\n" >.git/refs/heads/broken...symref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...symref" &&\n'> <'\tgit branch -d broken...symref >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/broken...symref &&\n'> <'\ttest_i18ngrep "Deleted branch broken...symref (was refs/heads/master)" output &&\n'> 
          <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'update-ref --no-deref -d can delete dangling symref with broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/idonotexist\\n" >.git/refs/heads/broken...symref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...symref" &&\n'> <'\tgit update-ref --no-deref -d refs/heads/broken...symref >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/broken...symref &&\n'> <'\ttest_must_be_empty output &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'branch -d can delete dangling symref with broken name'>)} 
      {
        (SQ <'\n'> <'\tprintf "ref: refs/heads/idonotexist\\n" >.git/refs/heads/broken...symref &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/broken...symref" &&\n'> <'\tgit branch -d broken...symref >output 2>error &&\n'> 
          <'\ttest_path_is_missing .git/refs/heads/broken...symref &&\n'> <'\ttest_i18ngrep "Deleted branch broken...symref (was refs/heads/idonotexist)" output &&\n'> 
          <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref -d cannot delete non-ref in .git dir'>)} 
      {
        (SQ <'\n'> <'\techo precious >.git/my-private-file &&\n'> <'\techo precious >expect &&\n'> 
          <'\ttest_must_fail git update-ref -d my-private-file >output 2>error &&\n'> <'\ttest_must_be_empty output &&\n'> 
          <'\ttest_i18ngrep -e "refusing to update ref with bad name" error &&\n'> <'\ttest_cmp expect .git/my-private-file\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref -d cannot delete absolute path'>)} 
      {
        (SQ <'\n'> <'\tgit branch -f extra &&\n'> 
          <'\ttest_must_fail git update-ref -d "$(pwd)/.git/refs/heads/extra" &&\n'> <'\ttest_cmp_rev HEAD extra\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin fails create with bad ref name'>)} 
      {
        (SQ <'\n'> <'\techo "create ~a refs/heads/master" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin fails update with bad ref name'>)} 
      {
        (SQ <'\n'> <'\techo "update ~a refs/heads/master" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin fails delete with bad ref name'>)} 
      {
        (SQ <'\n'> <'\techo "delete ~a refs/heads/master" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin -z fails create with bad ref name'>)} 
      {
        (SQ <'\n'> <'\tprintf "%s\\0" "create ~a " refs/heads/master >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a " err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin -z fails update with bad ref name'>)} 
      {
        (SQ <'\n'> <'\tprintf "%s\\0" "update ~a" refs/heads/master "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --stdin -z fails delete with bad ref name'>)} 
      {
        (SQ <'\n'> <'\tprintf "%s\\0" "delete ~a" refs/heads/master >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: invalid ref format: ~a" err\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)