(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'check various push.default settings'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ <'setup bare remotes'>)} 
      {
        (SQ <'\n'> <'\tgit init --bare repo1 &&\n'> <'\tgit remote add parent1 repo1 &&\n'> 
          <'\tgit init --bare repo2 &&\n'> <'\tgit remote add parent2 repo2 &&\n'> <'\ttest_commit one &&\n'> <'\tgit push parent1 HEAD &&\n'> 
          <'\tgit push parent2 HEAD\n'>
        )
      }
    )
    (FuncDef
      name: check_pushed_commit
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (SimpleCommand
                  words: [
                    {(git)}
                    {(log)}
                    {(-1)}
                    {(--format) (Lit_Other '=') (SQ <'%h %s'>)}
                    {(DQ ($ VSub_Number '$1'))}
                  ]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[65])]
                )
                (SimpleCommand
                  words: [
                    {(git)}
                    {(--git-dir) (Lit_Other '=') 
                      (DQ 
                        (BracedVarSub
                          token: <VSub_Number 3>
                          suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(repo1)})
                          spids: [76 80]
                        )
                      )
                    }
                    {(log)}
                    {(-1)}
                    {(--format) (Lit_Other '=') (SQ <'%h %s'>)}
                    {(DQ ($ VSub_Number '$2'))}
                  ]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(actual)} spids:[97])]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
          spids: [46]
        )
      spids: [41 45]
    )
    (FuncDef
      name: test_push_success
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp]
              children: [
                (C {(git)} 
                  {
                    (BracedVarSub
                      token: <VSub_Number 1>
                      suffix_op: (StringUnary op_id:VTest_ColonPlus arg_word:{(-c)})
                      spids: [131 135]
                    )
                  } 
                  {
                    (BracedVarSub
                      token: <VSub_Number 1>
                      suffix_op: 
                        (StringUnary
                          op_id: VTest_ColonPlus
                          arg_word: {('push.default=') (DQ ($ VSub_Number '$1'))}
                        )
                      spids: [137 144]
                    )
                  } {(push)}
                )
                (C {(check_pushed_commit)} {(HEAD)} {(DQ ($ VSub_Number '$2'))} 
                  {(DQ ($ VSub_Number '$3'))}
                )
              ]
            )
          ]
          spids: [126]
        )
      spids: [121 125]
    )
    (FuncDef
      name: test_push_failure
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp Op_DAmp Op_DAmp]
              children: [
                (SimpleCommand
                  words: [
                    {(git)}
                    {(--git-dir) (Lit_Other '=') (repo1)}
                    {(log)}
                    {(--no-walk)}
                    {(--format) (Lit_Other '=') (SQ <'%h %s'>)}
                    {(--all)}
                  ]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[198])]
                )
                (C {(test_must_fail)} {(git)} 
                  {
                    (BracedVarSub
                      token: <VSub_Number 1>
                      suffix_op: (StringUnary op_id:VTest_ColonPlus arg_word:{(-c)})
                      spids: [208 212]
                    )
                  } 
                  {
                    (BracedVarSub
                      token: <VSub_Number 1>
                      suffix_op: 
                        (StringUnary
                          op_id: VTest_ColonPlus
                          arg_word: {('push.default=') (DQ ($ VSub_Number '$1'))}
                        )
                      spids: [214 221]
                    )
                  } {(push)}
                )
                (SimpleCommand
                  words: [
                    {(git)}
                    {(--git-dir) (Lit_Other '=') (repo1)}
                    {(log)}
                    {(--no-walk)}
                    {(--format) (Lit_Other '=') (SQ <'%h %s'>)}
                    {(--all)}
                  ]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(actual)} spids:[246])]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
          spids: [177]
        )
      spids: [172 176]
    )
    (FuncDef
      name: test_pushdefault_workflow
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:workflow) op:Equal rhs:{(central)} spids:[281])]
              spids: [281]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:pushdefault)
                  op: Equal
                  rhs: {(parent1)}
                  spids: [285]
                )
              ]
              spids: [285]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(test)} {(-n)} 
                          {
                            (DQ 
                              (BracedVarSub
                                token: <VSub_Number 4>
                                suffix_op: (StringUnary op_id:VTest_Hyphen arg_word:{(EmptyPart)})
                                spids: [296 299]
                              )
                            )
                          }
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:workflow)
                          op: Equal
                          rhs: {(triangular)}
                          spids: [306]
                        )
                      ]
                      spids: [306]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:pushdefault)
                          op: Equal
                          rhs: {(parent2)}
                          spids: [310]
                        )
                      ]
                      spids: [310]
                    )
                  ]
                  spids: [16777215 303]
                )
              ]
              spids: [16777215 314]
            )
            (C {(test_expect_success)} 
              {
                (DQ ('push.default = ') ($ VSub_Number '$2') (' ') ($ VSub_Number '$1') (' in ') 
                  ($ VSub_Name '$workflow') (' workflows')
                )
              } 
              {
                (DQ ('\n') ('\t\ttest_config branch.master.remote parent1 &&\n') 
                  ('\t\ttest_config branch.master.merge refs/heads/foo &&\n') ('\t\ttest_config remote.pushdefault ') ($ VSub_Name '$pushdefault') (' &&\n') 
                  ('\t\ttest_commit commit-for-') ($ VSub_Number '$2') 
                  (BracedVarSub
                    token: <VSub_Number 4>
                    suffix_op: (StringUnary op_id:VTest_Plus arg_word:{(-triangular)})
                    spids: [338 342]
                  ) (' &&\n') ('\t\ttest_push_') ($ VSub_Number '$1') (' ') ($ VSub_Number '$2') (' ') ($ VSub_Number '$3') 
                  (' ') 
                  (BracedVarSub
                    token: <VSub_Number 4>
                    suffix_op: (StringUnary op_id:VTest_Plus arg_word:{(repo2)})
                    spids: [351 355]
                  ) ('\n') ('\t')
                )
              }
            )
          ]
          spids: [278]
        )
      spids: [273 277]
    )
    (C {(test_expect_success)} {(SQ <'"upstream" pushes to configured upstream'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/foo &&\n'> <'\ttest_commit two &&\n'> <'\ttest_push_success upstream foo\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"upstream" does not push on unconfigured remote'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\ttest_unconfig branch.master.remote &&\n'> 
          <'\ttest_commit three &&\n'> <'\ttest_push_failure upstream\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"upstream" does not push on unconfigured branch'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_unconfig branch.master.merge &&\n'> <'\ttest_commit four &&\n'> <'\ttest_push_failure upstream\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"upstream" does not push when remotes do not match'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/foo &&\n'> <'\ttest_config push.default upstream &&\n'> <'\ttest_commit five &&\n'> 
          <'\ttest_must_fail git push parent2\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'push from/to new branch with upstream, matching and simple'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b new-branch &&\n'> <'\ttest_push_failure simple &&\n'> 
          <'\ttest_push_failure matching &&\n'> <'\ttest_push_failure upstream\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'push from/to new branch with current creates remote branch'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.new-branch.remote repo1 &&\n'> 
          <'\tgit checkout new-branch &&\n'> <'\ttest_push_success current new-branch\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'push to existing branch, with no upstream configured'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote repo1 &&\n'> <'\tgit checkout master &&\n'> 
          <'\ttest_push_failure simple &&\n'> <'\ttest_push_failure upstream\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'push to existing branch, upstream configured with same name'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote repo1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/master &&\n'> <'\tgit checkout master &&\n'> <'\ttest_commit six &&\n'> <'\ttest_push_success upstream master &&\n'> 
          <'\ttest_commit seven &&\n'> <'\ttest_push_success simple master\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'push to existing branch, upstream configured with different name'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote repo1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/other-name &&\n'> <'\tgit checkout master &&\n'> <'\ttest_commit eight &&\n'> 
          <'\ttest_push_success upstream other-name &&\n'> <'\ttest_commit nine &&\n'> <'\ttest_push_failure simple &&\n'> 
          <'\tgit --git-dir=repo1 log -1 --format="%h %s" "other-name" >expect-other-name &&\n'> <'\ttest_push_success current master &&\n'> 
          <'\tgit --git-dir=repo1 log -1 --format="%h %s" "other-name" >actual-other-name &&\n'> <'\ttest_cmp expect-other-name actual-other-name\n'>
        )
      }
    )
    (C {(test_pushdefault_workflow)} {(success)} {(current)} {(master)})
    (C {(test_pushdefault_workflow)} {(success)} {(upstream)} {(foo)})
    (C {(test_pushdefault_workflow)} {(failure)} {(simple)} {(master)})
    (C {(test_pushdefault_workflow)} {(success)} {(matching)} {(master)})
    (C {(test_pushdefault_workflow)} {(success)} {(current)} {(master)} {(triangular)})
    (C {(test_pushdefault_workflow)} {(failure)} {(upstream)} {(foo)} {(triangular)})
    (C {(test_pushdefault_workflow)} {(success)} {(simple)} {(master)} {(triangular)})
    (C {(test_pushdefault_workflow)} {(success)} {(matching)} {(master)} {(triangular)})
    (C {(test_expect_success)} {(SQ <'default behavior allows "simple" push'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/master &&\n'> <'\ttest_config remote.pushdefault parent1 &&\n'> <'\ttest_commit default-master-master &&\n'> 
          <'\ttest_push_success "" master\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'default behavior rejects non-simple push'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/foo &&\n'> <'\ttest_config remote.pushdefault parent1 &&\n'> <'\ttest_commit default-master-foo &&\n'> 
          <'\ttest_push_failure ""\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'default triangular behavior acts like "current"'>)} 
      {
        (SQ <'\n'> <'\ttest_config branch.master.remote parent1 &&\n'> 
          <'\ttest_config branch.master.merge refs/heads/foo &&\n'> <'\ttest_config remote.pushdefault parent2 &&\n'> <'\ttest_commit default-triangular &&\n'> 
          <'\ttest_push_success "" master repo2\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)