(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: 'pushing to a repository using the atomic push option'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: mk_repo_pair
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(rm)} {(-rf)} {(workbench)} {(upstream)})
                (C {(test_create_repo)} {(upstream)})
                (C {(test_create_repo)} {(workbench)})
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {(cd)} {(upstream)})
                            (C {(git)} {(config)} {(receive.denyCurrentBranch)} {(warn)})
                          ]
                        )
                      ]
                    )
                )
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {(cd)} {(workbench)})
                            (C {(git)} {(remote)} {(add)} {(up)} {(../upstream)})
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: test_refs
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(test)} {($ Id.VSub_Pound '$#')} {(Id.Lit_Equals '=')} {(2)})
                (command.Simple
                  words: [
                    {(git)}
                    {(-C)}
                    {(upstream)}
                    {(rev-parse)}
                    {(--verify)}
                    {(DQ ($ Id.VSub_Number '$1'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:137)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(git)}
                    {(-C)}
                    {(workbench)}
                    {(rev-parse)}
                    {(--verify)}
                    {(DQ ($ Id.VSub_Number '$2'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:157)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push works for a single branch' span_id:175))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:180) (Token id:Id.Lit_Chars val:'\t(\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:182) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:184) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --atomic up master\n' span_id:186) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master master\n' span_id:188)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push works for two branches' span_id:195))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\t(\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\t\tgit branch second &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\t\tgit push --atomic up master second\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:210) (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:212)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push works in combination with --mirror' span_id:219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\t(\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:226) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --atomic --mirror up\n' span_id:230) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:233)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push works in combination with --force' span_id:240))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t(\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:247) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\t\tgit branch second master &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\t\ttest_commit two_a &&\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\t\ttest_commit two_b &&\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit three_b &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\t\t# The actual test is below\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\t\ttest_commit three_a &&\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD^ &&\n' span_id:260) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force --atomic up master second\n'
            span_id: 261
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:262) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:264)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push fails if one branch fails' span_id:280))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:284) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:285) (Token id:Id.Lit_Chars val:'\t(\n' span_id:286) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:287) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:288) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD~2 &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit five &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit six &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git push --atomic --all up\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{7} &&\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{4}\n' span_id:301)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push fails if one tag fails remotely' span_id:308))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:312) 
          (Token id:Id.Lit_Chars val:'\t# prepare the repo\n' span_id:313) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:315) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:321) (Token id:Id.Lit_Chars val:'\t# a third party modifies the server side:\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:323) (Token id:Id.Lit_Chars val:'\t\tcd upstream &&\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\tgit tag test_tag second\n' span_id:326) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\t# see if we can now push both branches.\n' span_id:328) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:329) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:331) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:332) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:333) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:334) 
          (Token id:Id.Lit_Chars val:'\t\tgit tag test_tag &&\n' span_id:335) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --tags --atomic up master second\n'
            span_id: 336
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{3} &&\n' span_id:338) (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{1}\n' span_id:339)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'atomic push obeys update hook preventing a branch to be pushed'
            span_id: 346
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:350) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:351) (Token id:Id.Lit_Chars val:'\t(\n' span_id:352) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:353) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:354) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up\n' span_id:357) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t(\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t\tcd upstream &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\tHOOKDIR="$(git rev-parse --git-dir)/hooks" &&\n' span_id:361) 
          (Token id:Id.Lit_Chars val:'\t\tHOOK="$HOOKDIR/update" &&\n' span_id:362) (Token id:Id.Lit_Chars val:'\t\tmkdir -p "$HOOKDIR" &&\n' span_id:363) 
          (Token id:Id.Lit_Chars val:'\t\twrite_script "$HOOK" <<-\\EOF\n' span_id:364) (Token id:Id.Lit_Chars val:'\t\t\t# only allow update to master from now on\n' span_id:365) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest "$1" = "refs/heads/master"\n' span_id:366) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:367) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:368) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:369) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --atomic up master second\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{3} &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{1}\n' span_id:378)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'atomic push is not advertised if configured' span_id:385))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\t(\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\t\tcd upstream\n' span_id:392) (Token id:Id.Lit_Chars val:'\t\tgit config receive.advertiseatomic 0\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\t(\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:399) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --atomic up master\n'
            span_id: 400
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:401) 
          (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{1}\n' span_id:402)
        )
      }
    )
    (C {(test_done)})
  ]
)