(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'git mktag: tag object verify test'>)}
          spids: [10]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: check_verify_failure
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expect)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                  spids: [42]
                )
              ]
            )
            (C {<test_expect_success>} {(DQ ($ Id.VSub_Number '$1'))} 
              {
                (SQ <'\n'> <'\t\t( test_must_fail git mktag <tag.sig 2>message ) &&\n'> 
                  <'\t\tgrep "$expect" message\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <setup>)} 
      {
        (SQ <'\n'> <'\techo Hello >A &&\n'> <'\tgit update-index --add A &&\n'> 
          <'\tgit commit -m "Initial commit" &&\n'> <'\thead=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 105
              stdin_parts: [<'too short for a tag\n'>]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'Tag object length check'>)} {(SQ <'^error: .*size wrong.*$'>)})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 141
              stdin_parts: [
                <'xxxxxx 139e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type tag\n'>
                <'tag mytag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"object" line label check'>)} 
      {(SQ <'^error: char0: .*"object "$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 175
              stdin_parts: [
                <'object zz9e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type tag\n'>
                <'tag mytag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"object" line SHA1 check'>)} 
      {(SQ <'^error: char7: .*SHA1 hash$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 209
              stdin_parts: [
                <'object 779e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'xxxx tag\n'>
                <'tag mytag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"type" line label check'>)} 
      {(SQ <'^error: char47: .*"\\\\ntype "$'>)}
    )
    (command.Simple
      words: [{<echo>} {(DQ <'object 779e9b33986b1c2670fff52c5067603117b3e895'>)}]
      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})]
      do_fork: T
    )
    (command.Simple
      words: [{<printf>} {(DQ <'type tagsssssssssssssssssssssssssssssss'>)}]
      redirects: [(redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"type" line eol check'>)} {(SQ <'^error: char48: .*"\\\\n"$'>)})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 280
              stdin_parts: [
                <'object 779e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type tag\n'>
                <'xxx mytag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"tag" line label check #1'>)} 
      {(SQ <'^error: char57: no "tag " found$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 314
              stdin_parts: [
                <'object 779e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type taggggggggggggggggggggggggggggggg\n'>
                <'tag\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"tag" line label check #2'>)} 
      {(SQ <'^error: char87: no "tag " found$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 348
              stdin_parts: [
                <'object 779e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type taggggggggggggggggggggggggggggggg\n'>
                <'tag mytag\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"type" line type-name length check'>)} 
      {(SQ <'^error: char53: type too long$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 384
              stdin_parts: [
                <'object 779e9b33986b1c2670fff52c5067603117b3e895\n'>
                <'type tagggg\n'>
                <'tag mytag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'verify object (SHA1/type) check'>)} 
      {(SQ <'^error: char7: could not verify object.*$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 422
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag my\ttag\n'>
                <'tagger . <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'verify tag-name check'>)} 
      {(SQ <'^error: char67: could not verify tag name$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 460
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'\n'>
                <'This is filler\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"tagger" line label check #1'>)} 
      {(SQ <'^error: char70: could not find "tagger "$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 499
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger\n'>
                <'\n'>
                <'This is filler\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'"tagger" line label check #2'>)} 
      {(SQ <'^error: char70: could not find "tagger "$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 538
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger  <> 0 +0000\n'>
                <'\n'>
                <'This is filler\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'disallow missing tag author name'>)} 
      {(SQ <'^error: char77: missing tagger name$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 577
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <\n'>
                <' > 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'disallow malformed tagger'>)} 
      {(SQ <'^error: char77: malformed tagger field$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 615
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'allow empty tag email'>)} 
      {(SQ <'git mktag <tag.sig >.git/refs/tags/mytag 2>message'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 655
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tag ger@example.com> 0 +0000\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'disallow spaces in tag email'>)} 
      {(SQ <'^error: char77: malformed tagger field$'>)}
    )
    (command.Simple
      words: [{<tr>} {(SQ <_>)} {(SQ <' '>)}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 701
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com>__\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'disallow missing tag timestamp'>)} 
      {(SQ <'^error: char107: missing tag timestamp$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 739
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> Tue Mar 25 15:47:44 2008\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid tag timestamp1'>)} 
      {(SQ <'^error: char107: missing tag timestamp$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 777
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 2008-03-31T12:20:15-0500\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid tag timestamp2'>)} 
      {(SQ <'^error: char111: malformed tag timestamp$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 815
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 1206478233 GMT\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid tag timezone1'>)} 
      {(SQ <'^error: char118: malformed tag timezone$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 853
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 1206478233 +  30\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid tag timezone2'>)} 
      {(SQ <'^error: char118: malformed tag timezone$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 891
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 1206478233 -1430\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid tag timezone3'>)} 
      {(SQ <'^error: char118: malformed tag timezone$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 930
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 1206478233 -0500\n'>
                <'this line should not be here\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<check_verify_failure>} {(SQ <'detect invalid header entry'>)} 
      {(SQ <'^error: char124: trailing garbage in tag header$'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<tag.sig>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 968
              stdin_parts: [
                <'object '>
                ($ Id.VSub_DollarName '$head')
                <'\n'>
                <'type commit\n'>
                <'tag mytag\n'>
                <'tagger T A Gger <tagger@example.com> 1206478233 -0500\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'create valid tag'>)} 
      {(SQ <'git mktag <tag.sig >.git/refs/tags/mytag 2>message'>)}
    )
    (C {<test_expect_success>} {(SQ <'check mytag'>)} {(SQ <'git tag -l | grep mytag'>)})
    (C {<test_done>})
  ]
)