(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:USAGE)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'<tag>' span_id:6))}
          spids: [4]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SUBDIRECTORY_OK)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:Yes span_id:11))}
          spids: [9]
        )
      ]
    )
    (C {(.)} {(git-sh-setup)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:verbose)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [19]
        )
      ]
    )
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:21)
      cond: [(C {(test)} {($ Id.VSub_Pound '$#')} {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(0)})]
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [
                    {(-v)}
                    {(--v)}
                    {(--ve)}
                    {(--ver)}
                    {(--verb)}
                    {(--verbo)}
                    {(--verbos)}
                    {(--verbose)}
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:verbose)
                          op: assign_op.Equal
                          rhs: {(t)}
                          spids: [62]
                        )
                      ]
                    )
                  ]
                  spids: [44 59 65 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Break val:break span_id:72)
                    )
                  ]
                  spids: [68 69 74 -1]
                )
              ]
            )
            (C {(shift)})
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_Pound '$#'))} 
              {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(DQ (1))} {(Id.Lit_RBracket ']')}
            )
          ]
          action: [(C {(usage)})]
          spids: [85 102]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:type)
              op: assign_op.Equal
              rhs: 
                {
                  (DQ 
                    (command_sub
                      left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:112)
                      command_list: 
                        (command.CommandList
                          children: [
                            (command.Simple
                              words: [{(git)} {(cat-file)} {(-t)} {(DQ ($ Id.VSub_Number '$1'))}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'2>' span_id:123)
                                  fd: 2
                                  arg_word: {(/dev/null)}
                                )
                              ]
                            )
                          ]
                        )
                    )
                  )
                }
              spids: [110]
            )
          ]
        )
        (C {(die)} {(DQ ($ Id.VSub_Number '$1') (': no such object.'))})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(test)} {(DQ ($ Id.VSub_DollarName '$type'))} {(Id.Lit_Equals '=')} {(tag)})
        (C {(die)} 
          {
            (DQ ($ Id.VSub_Number '$1') (': cannot verify a non-tag object of type ') 
              ($ Id.VSub_DollarName '$type') (.)
            )
          }
        )
      ]
    )
    (command.Case
      to_match: {(DQ ($ Id.VSub_DollarName '$verbose'))}
      arms: [
        (case_arm
          pat_list: [{(t)}]
          action: [
            (command.Pipeline
              children: [
                (C {(git)} {(cat-file)} {(-p)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(sed)} {(-n)} {(-e)} 
                  {(SQ (Token id:Id.Lit_Chars val:'/^-----BEGIN PGP SIGNATURE-----/q' span_id:194))} {(-e)} {(p)}
                )
              ]
              negated: F
            )
          ]
          spids: [170 171 202 -1]
        )
      ]
    )
    (C {(trap)} {(SQ (Token id:Id.Lit_Chars val:'rm -f "$GIT_DIR/.tmp-vtag"' span_id:210))} {(0)})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.Simple
          words: [{(git)} {(cat-file)} {(tag)} {(DQ ($ Id.VSub_Number '$1'))}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:226)
              fd: -1
              arg_word: {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/.tmp-vtag))}
            )
          ]
        )
        (command.ControlFlow
          token: (Token id:Id.ControlFlow_Exit val:exit span_id:234)
          arg_word: {(1)}
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.Pipeline
          children: [
            (command.Simple
              words: [
                {(sed)}
                {(-n)}
                {(-e)}
                {
                  (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) 
                    (Token
                      id: Id.Lit_Chars
                      val: '\t/^-----BEGIN PGP SIGNATURE-----$/q\n'
                      span_id: 246
                    ) (Token id:Id.Lit_Chars val:'\tp\n' span_id:247)
                  )
                }
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:250)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/.tmp-vtag))}
                )
              ]
            )
            (C {(gpg)} {(--verify)} {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/.tmp-vtag))} {(-)})
          ]
          negated: F
        )
        (command.ControlFlow
          token: (Token id:Id.ControlFlow_Exit val:exit span_id:271)
          arg_word: {(1)}
        )
      ]
    )
    (C {(rm)} {(-f)} {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/.tmp-vtag))})
  ]
)