(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:'compare & swap push force/delete safety' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: setup_srcdst_basic
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(rm)} {(-fr)} {(src)} {(dst)})
                (C {(git)} {(clone)} {(--no-local)} {(.)} {(src)})
                (C {(git)} {(clone)} {(--no-local)} {(src)} {(dst)})
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {(cd)} {(src)})
                            (C {(git)} {(checkout)} {(HEAD) (Id.Lit_Other '^') (0)})
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:88) 
          (Token id:Id.Lit_Chars val:'\t# create template repository\n' span_id:89) (Token id:Id.Lit_Chars val:'\ttest_commit A &&\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\ttest_commit B &&\n' span_id:91) (Token id:Id.Lit_Chars val:'\ttest_commit C\n' span_id:92)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (protected)' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\t(\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:107) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest_must_fail git push --force-with-lease=master:master origin master 2>err &&\n'
            span_id: 108
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "stale info" err\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\tgit ls-remote . refs/heads/master >expect &&\n' span_id:111) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 112
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, forced)' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\t(\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force --force-with-lease=master:master origin master 2>err &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "forced update" err\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:132) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 133
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:134)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, tracking)' span_id:141))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\t(\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^0\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >expect &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit E &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\t\tgit ls-remote . refs/remotes/origin/master >expect &&\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --force-with-lease=master origin master &&\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\t\tgit ls-remote . refs/remotes/origin/master >actual &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:160) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:161) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 162
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:163)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, tracking, forced)' span_id:170))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\t(\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:179) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^0\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\t(\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\ttest_commit E &&\n' span_id:184) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-remote . refs/remotes/origin/master >expect &&\n'
            span_id: 185
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force --force-with-lease=master origin master\n'
            span_id: 186
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote dst refs/heads/master >expect &&\n'
            span_id: 188
          ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:190)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed)' span_id:197))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t(\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:205) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=master:master^ origin master\n'
            span_id: 206
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:207) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote dst refs/heads/master >expect &&\n'
            span_id: 208
          ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:210)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed, tracking)' span_id:217))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:221) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\t(\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:225) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=master origin master 2>err &&\n'
            span_id: 226
          ) (Token id:Id.Lit_Chars val:'\t\t! grep "forced update" err\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:229) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 230
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:231)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed even though no-ff)' span_id:238))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:242) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\t(\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD^ &&\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:247) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=master origin master 2>err &&\n'
            span_id: 248
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "forced update" err\n' span_id:249) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:251) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 252
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:253)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to delete (protected)' span_id:260))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >expect &&\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:267) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:268) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --force-with-lease=master:master^ origin :master\n'
            span_id: 269
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:270) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 271
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:272)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to delete (protected, forced)' span_id:279))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:284) (Token id:Id.Lit_Chars val:'\t(\n' span_id:285) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:286) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force --force-with-lease=master:master^ origin :master\n'
            span_id: 287
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:288) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:291)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to delete (allowed)' span_id:298))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:303) (Token id:Id.Lit_Chars val:'\t(\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:305) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=master origin :master 2>err &&\n'
            span_id: 306
          ) (Token id:Id.Lit_Chars val:'\t\tgrep deleted err\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:309) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/master >actual &&\n'
            span_id: 310
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:311)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cover everything with default force-with-lease (protected)'
            span_id: 318
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\t(\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\tgit branch naster master^\n' span_id:326) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/\\* >expect &&\n' span_id:328) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:329) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:330) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --force-with-lease origin master master:naster\n'
            span_id: 331
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:332) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/\\* >actual &&\n'
            span_id: 333
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:334)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cover everything with default force-with-lease (allowed)'
            span_id: 341
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:346) (Token id:Id.Lit_Chars val:'\t(\n' span_id:347) 
          (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\t\tgit branch naster master^\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:350) (Token id:Id.Lit_Chars val:'\t(\n' span_id:351) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:352) (Token id:Id.Lit_Chars val:'\t\tgit fetch &&\n' span_id:353) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease origin master master:naster\n'
            span_id: 354
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:355) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote dst refs/heads/master |\n'
            span_id: 356
          ) (Token id:Id.Lit_Chars val:'\tsed -e "s/master/naster/" >expect &&\n' span_id:357) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote src refs/heads/naster >actual &&\n'
            span_id: 358
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:359)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'new branch covered by force-with-lease' span_id:366))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\t(\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=branch origin branch\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:376) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote dst refs/heads/branch >expect &&\n'
            span_id: 377
          ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/branch >actual &&\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:379)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'new branch covered by force-with-lease (explicit)'
            span_id: 386
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:390) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:391) (Token id:Id.Lit_Chars val:'\t(\n' span_id:392) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:394) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit push --force-with-lease=branch: origin branch\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-remote dst refs/heads/branch >expect &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/branch >actual &&\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:399)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'new branch already exists' span_id:406))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:410) 
          (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:411) (Token id:Id.Lit_Chars val:'\t(\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b branch master &&\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit F\n' span_id:415) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:416) (Token id:Id.Lit_Chars val:'\t(\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:419) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git push --force-with-lease=branch: origin branch\n'
            span_id: 420
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:421)
        )
      }
    )
    (C {(test_done)})
  ]
)