(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'send-pack --stdin tests' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: create_ref
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:tree)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:23)
                            command_list: (command.CommandList children:[(C {(git)} {(write-tree)})])
                          )
                        }
                      spids: [22]
                    )
                  ]
                )
                (C {(test_tick)})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:commit)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:38)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(DQ ($ Id.VSub_Number '$1'))})
                                      (C {(git)} {(commit-tree)} {($ Id.VSub_DollarName '$tree')})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [37]
                    )
                  ]
                )
                (C {(git)} {(update-ref)} {(DQ ($ Id.VSub_Number '$1'))} 
                  {($ Id.VSub_DollarName '$commit')}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: clear_remote
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(rm)} {(-rf)} {(remote.git)})
                (C {(git)} {(init)} {(--bare)} {(remote.git)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: verify_push
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(git)} {(rev-parse)} {(DQ ($ Id.VSub_Number '$1'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:114)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(git)}
                    {(--git-dir) (Id.Lit_Equals '=') (remote.git)}
                    {(rev-parse)}
                    {
                      (DQ 
                        (braced_var_sub
                          token: (Token id:Id.VSub_Number val:2 span_id:130)
                          suffix_op: 
                            (suffix_op.Unary
                              op_id: Id.VTest_ColonHyphen
                              arg_word: {($ Id.VSub_Number '$1')}
                            )
                        )
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:136)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup refs' span_id:154))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\tcat >refs <<-\\EOF &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\trefs/heads/A\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\trefs/heads/C\n' span_id:161) (Token id:Id.Lit_Chars val:'\trefs/tags/D\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\trefs/heads/B\n' span_id:163) (Token id:Id.Lit_Chars val:'\trefs/tags/E\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:165) (Token id:Id.Lit_Chars val:'\tfor i in $(cat refs); do\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\t\tcreate_ref $i || return 1\n' span_id:167) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:168)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'refs on cmdline' span_id:178))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\tgit send-pack remote.git $(cat refs) &&\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\tfor i in $(cat refs); do\n' span_id:185) (Token id:Id.Lit_Chars val:'\t\tverify_push $i || return 1\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\tdone\n' span_id:187)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'refs over stdin' span_id:194))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\tgit send-pack remote.git --stdin <refs &&\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tfor i in $(cat refs); do\n' span_id:201) (Token id:Id.Lit_Chars val:'\t\tverify_push $i || return 1\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\tdone\n' span_id:203)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'stdin lines are full refspecs' span_id:210))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:215) (Token id:Id.Lit_Chars val:'\techo "A:other" >input &&\n' span_id:216) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit send-pack remote.git --stdin <input &&\n'
            span_id: 217
          ) (Token id:Id.Lit_Chars val:'\tverify_push refs/heads/A refs/heads/other\n' span_id:218)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'stdin mixed with cmdline' span_id:225))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\techo A >input &&\n' span_id:231) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit send-pack remote.git --stdin B <input &&\n'
            span_id: 232
          ) (Token id:Id.Lit_Chars val:'\tverify_push A &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\tverify_push B\n' span_id:234)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cmdline refs written in order' span_id:241))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\ttest_must_fail git send-pack remote.git A:foo B:foo &&\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\tverify_push A foo\n' span_id:248)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--stdin refs come after cmdline' span_id:255))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\techo A:foo >input &&\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git send-pack remote.git --stdin B:foo <input &&\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\tverify_push B foo\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'refspecs and --mirror do not mix (cmdline)' span_id:270))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:275) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git send-pack remote.git --mirror $(cat refs)\n'
            span_id: 276
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'refspecs and --mirror do not mix (stdin)' span_id:283))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\tclear_remote &&\n' span_id:288) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git send-pack remote.git --mirror --stdin <refs\n'
            span_id: 289
          )
        )
      }
    )
    (C {(test_done)})
  ]
)