(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)})
  ]
)