(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:'merging with submodules' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:48) (Token id:Id.Lit_Chars val:'\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\t echo original > file &&\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\t git commit -m sub-root) &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\tgit commit -m root &&\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\n' span_id:60) (Token id:Id.Lit_Chars val:'\tgit checkout -b a master &&\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\t echo A > file &&\n' span_id:63) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'\t git commit -m sub-a) &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\tgit commit -m a &&\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\n' span_id:70) (Token id:Id.Lit_Chars val:'\tgit checkout -b b master &&\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:72) (Token id:Id.Lit_Chars val:'\t echo B > file &&\n' span_id:73) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:74) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:75) 
          (Token id:Id.Lit_Chars val:'\t git commit -m sub-b) &&\n' span_id:76) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:77) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:78) (Token id:Id.Lit_Chars val:'\tgit commit -m b &&\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\n' span_id:80) (Token id:Id.Lit_Chars val:'\tgit checkout -b c a &&\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\tgit merge -s ours b &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b d b &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\tgit merge -s ours a\n' span_id:85)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for merge search' span_id:125))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\tmkdir merge-search &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\tgit init &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\t echo "file-a" > file-a &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\t git add file-a &&\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\t git commit -m "sub-a" &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\t git branch sub-a) &&\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m init &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\tgit branch init &&\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\tgit commit -m "a" &&\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\tgit branch a &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b b &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b sub-b &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t echo "file-b" > file-b &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\t git add file-b &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\t git commit -m "sub-b") &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m "b" &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b c a &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b sub-c sub-a &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\t echo "file-c" > file-c &&\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\t git add file-c &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\t git commit -m "sub-c") &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m "c" &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b d a &&\n' span_id:162) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:163) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b sub-d sub-b &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\t git merge sub-c) &&\n' span_id:165) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m "d" &&\n' span_id:166) (Token id:Id.Lit_Chars val:'\tgit branch test b &&\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\n' span_id:168) (Token id:Id.Lit_Chars val:'\tgit checkout -b g init &&\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:170) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-g sub-c) &&\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "g")\n' span_id:173)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'merge with one side as a fast-forward of the other'
            span_id: 180
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\t git checkout -b test-forward b &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\t git merge d &&\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\t git ls-tree test-forward sub | cut -f1 | cut -f3 -d" " > actual &&\n'
            span_id: 188
          ) (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:189) 
          (Token
            id: Id.Lit_Chars
            val: '\t  git rev-parse sub-d > ../expect) &&\n'
            span_id: 190
          ) (Token id:Id.Lit_Chars val:'\t test_cmp actual expect)\n' span_id:191)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merging should conflict for non fast-forward' span_id:198))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\t git checkout -b test-nonforward b &&\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\t  git rev-parse sub-d > ../expect) &&\n' span_id:206) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_must_fail git merge c 2> actual  &&\n'
            span_id: 207
          ) (Token id:Id.Lit_Chars val:'\t grep $(cat expect) actual > /dev/null &&\n' span_id:208) 
          (Token id:Id.Lit_Chars val:'\t git reset --hard)\n' span_id:209)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merging should fail for ambiguous common parent' span_id:216))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit checkout -b test-ambiguous b &&\n' span_id:222) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\t git checkout -b ambiguous sub-b &&\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\t git merge sub-c &&\n' span_id:225) (Token id:Id.Lit_Chars val:'\t git rev-parse sub-d > ../expect1 &&\n' span_id:226) 
          (Token
            id: Id.Lit_Chars
            val: '\t git rev-parse ambiguous > ../expect2) &&\n'
            span_id: 227
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c 2> actual &&\n' span_id:228) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep $(cat expect1) actual > /dev/null &&\n'
            span_id: 229
          ) (Token id:Id.Lit_Chars val:'\tgrep $(cat expect2) actual > /dev/null &&\n' span_id:230) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard)\n' span_id:231)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'merging should fail for changes that are backwards'
            span_id: 289
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\tgit checkout -b bb a &&\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\t git checkout sub-b) &&\n' span_id:297) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m "bb" &&\n' span_id:298) (Token id:Id.Lit_Chars val:'\n' span_id:299) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b e bb &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:301) 
          (Token id:Id.Lit_Chars val:'\t git checkout sub-a) &&\n' span_id:302) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "e" &&\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'\n' span_id:304) (Token id:Id.Lit_Chars val:'\tgit checkout -b f bb &&\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\t git checkout sub-d) &&\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m "f" &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b test-backward e &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge f)\n' span_id:311)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git submodule status should display the merge conflict properly with merge base'
            span_id: 325
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:329) 
          (Token id:Id.Lit_Chars val:'       (cd merge-search &&\n' span_id:330) (Token id:Id.Lit_Chars val:'       cat >.gitmodules <<EOF &&\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'[submodule "sub"]\n' span_id:332) (Token id:Id.Lit_Chars val:'       path = sub\n' span_id:333) 
          (Token id:Id.Lit_Chars val:'       url = $TRASH_DIRECTORY/sub\n' span_id:334) (Token id:Id.Lit_Chars val:'EOF\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'       cat >expect <<EOF &&\n' span_id:336) (Token id:Id.Lit_Chars val:'U0000000000000000000000000000000000000000 sub\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:338) (Token id:Id.Lit_Chars val:'       git submodule status > actual &&\n' span_id:339) 
          (Token id:Id.Lit_Chars val:'       test_cmp expect actual &&\n' span_id:340) (Token id:Id.Lit_Chars val:'\tgit reset --hard)\n' span_id:341)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'git submodule status should display the merge conflict properly without merge-base'
            span_id: 354
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'       (cd merge-search &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\tgit checkout -b test-no-merge-base g &&\n' span_id:360) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge b &&\n' span_id:361) (Token id:Id.Lit_Chars val:'       cat >.gitmodules <<EOF &&\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'[submodule "sub"]\n' span_id:363) (Token id:Id.Lit_Chars val:'       path = sub\n' span_id:364) 
          (Token id:Id.Lit_Chars val:'       url = $TRASH_DIRECTORY/sub\n' span_id:365) (Token id:Id.Lit_Chars val:'EOF\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'       cat >expect <<EOF &&\n' span_id:367) (Token id:Id.Lit_Chars val:'U0000000000000000000000000000000000000000 sub\n' span_id:368) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:369) (Token id:Id.Lit_Chars val:'       git submodule status > actual &&\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'       test_cmp expect actual &&\n' span_id:371) (Token id:Id.Lit_Chars val:'       git reset --hard)\n' span_id:372)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'merging with a modify/modify conflict between merge bases'
            span_id: 380
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:384) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD &&\n' span_id:385) (Token id:Id.Lit_Chars val:'\tgit checkout -b test2 c &&\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\tgit merge d\n' span_id:387)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup for recursive merge with submodule' span_id:397))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:401) 
          (Token id:Id.Lit_Chars val:'\tmkdir merge-recursive &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\t(cd merge-recursive &&\n' span_id:403) 
          (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:404) (Token id:Id.Lit_Chars val:'\t mkdir sub &&\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:406) (Token id:Id.Lit_Chars val:'\t  git init &&\n' span_id:407) 
          (Token id:Id.Lit_Chars val:'\t  test_commit a &&\n' span_id:408) (Token id:Id.Lit_Chars val:'\t  git checkout -b sub-b master &&\n' span_id:409) 
          (Token id:Id.Lit_Chars val:'\t  test_commit b &&\n' span_id:410) (Token id:Id.Lit_Chars val:'\t  git checkout -b sub-c master &&\n' span_id:411) 
          (Token id:Id.Lit_Chars val:'\t  test_commit c &&\n' span_id:412) (Token id:Id.Lit_Chars val:'\t  git checkout -b sub-bc sub-b &&\n' span_id:413) 
          (Token id:Id.Lit_Chars val:'\t  git merge sub-c &&\n' span_id:414) (Token id:Id.Lit_Chars val:'\t  git checkout -b sub-cb sub-c &&\n' span_id:415) 
          (Token id:Id.Lit_Chars val:'\t  git merge sub-b &&\n' span_id:416) (Token id:Id.Lit_Chars val:'\t  git checkout master) &&\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\t git commit -m a &&\n' span_id:419) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b top-b master &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-b) &&\n' span_id:421) 
          (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\t git commit -m b &&\n' span_id:423) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b top-c master &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-c) &&\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:426) (Token id:Id.Lit_Chars val:'\t git commit -m c &&\n' span_id:427) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b top-bc top-b &&\n' span_id:428) (Token id:Id.Lit_Chars val:'\t git merge -s ours --no-commit top-c &&\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-bc) &&\n' span_id:430) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:431) 
          (Token id:Id.Lit_Chars val:'\t git commit -m bc &&\n' span_id:432) (Token id:Id.Lit_Chars val:'\t git checkout -b top-cb top-c &&\n' span_id:433) 
          (Token
            id: Id.Lit_Chars
            val: '\t git merge -s ours --no-commit top-b &&\n'
            span_id: 434
          ) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-cb) &&\n' span_id:435) 
          (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\t git commit -m cb)\n' span_id:437)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'recursive merge with submodule' span_id:447))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\t(cd merge-recursive &&\n' span_id:452) (Token id:Id.Lit_Chars val:'\t test_must_fail git merge top-bc &&\n' span_id:453) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "160000 $(git rev-parse top-cb:sub) 2\tsub" > expect2 &&\n'
            span_id: 454
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "160000 $(git rev-parse top-bc:sub) 3\tsub" > expect3 &&\n'
            span_id: 455
          ) (Token id:Id.Lit_Chars val:'\t git ls-files -u > actual &&\n' span_id:456) 
          (Token
            id: Id.Lit_Chars
            val: '\t grep "$(cat expect2)" actual > /dev/null &&\n'
            span_id: 457
          ) (Token id:Id.Lit_Chars val:'\t grep "$(cat expect3)" actual > /dev/null)\n' span_id:458)
        )
      }
    )
    (C {(test_done)})
  ]
)