(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'merging with submodules'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\n'> <'\tmkdir sub &&\n'> <'\t(cd sub &&\n'> <'\t git init &&\n'> 
          <'\t echo original > file &&\n'> <'\t git add file &&\n'> <'\t test_tick &&\n'> <'\t git commit -m sub-root) &&\n'> 
          <'\tgit add sub &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m root &&\n'> <'\n'> <'\tgit checkout -b a master &&\n'> 
          <'\t(cd sub &&\n'> <'\t echo A > file &&\n'> <'\t git add file &&\n'> <'\t test_tick &&\n'> 
          <'\t git commit -m sub-a) &&\n'> <'\tgit add sub &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m a &&\n'> <'\n'> 
          <'\tgit checkout -b b master &&\n'> <'\t(cd sub &&\n'> <'\t echo B > file &&\n'> <'\t git add file &&\n'> <'\t test_tick &&\n'> 
          <'\t git commit -m sub-b) &&\n'> <'\tgit add sub &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m b &&\n'> <'\n'> 
          <'\tgit checkout -b c a &&\n'> <'\tgit merge -s ours b &&\n'> <'\n'> <'\tgit checkout -b d b &&\n'> <'\tgit merge -s ours a\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup for merge search'>)} 
      {
        (SQ <'\n'> <'\tmkdir merge-search &&\n'> <'\t(cd merge-search &&\n'> <'\tgit init &&\n'> 
          <'\tmkdir sub &&\n'> <'\t(cd sub &&\n'> <'\t git init &&\n'> <'\t echo "file-a" > file-a &&\n'> <'\t git add file-a &&\n'> 
          <'\t git commit -m "sub-a" &&\n'> <'\t git branch sub-a) &&\n'> <'\tgit commit --allow-empty -m init &&\n'> <'\tgit branch init &&\n'> 
          <'\tgit add sub &&\n'> <'\tgit commit -m "a" &&\n'> <'\tgit branch a &&\n'> <'\n'> <'\tgit checkout -b b &&\n'> 
          <'\t(cd sub &&\n'> <'\t git checkout -b sub-b &&\n'> <'\t echo "file-b" > file-b &&\n'> <'\t git add file-b &&\n'> 
          <'\t git commit -m "sub-b") &&\n'> <'\tgit commit -a -m "b" &&\n'> <'\n'> <'\tgit checkout -b c a &&\n'> <'\t(cd sub &&\n'> 
          <'\t git checkout -b sub-c sub-a &&\n'> <'\t echo "file-c" > file-c &&\n'> <'\t git add file-c &&\n'> <'\t git commit -m "sub-c") &&\n'> 
          <'\tgit commit -a -m "c" &&\n'> <'\n'> <'\tgit checkout -b d a &&\n'> <'\t(cd sub &&\n'> <'\t git checkout -b sub-d sub-b &&\n'> 
          <'\t git merge sub-c) &&\n'> <'\tgit commit -a -m "d" &&\n'> <'\tgit branch test b &&\n'> <'\n'> <'\tgit checkout -b g init &&\n'> 
          <'\t(cd sub &&\n'> <'\t git checkout -b sub-g sub-c) &&\n'> <'\tgit add sub &&\n'> <'\tgit commit -a -m "g")\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merge with one side as a fast-forward of the other'>)} 
      {
        (SQ <'\n'> <'\t(cd merge-search &&\n'> <'\t git checkout -b test-forward b &&\n'> 
          <'\t git merge d &&\n'> <'\t git ls-tree test-forward sub | cut -f1 | cut -f3 -d" " > actual &&\n'> <'\t (cd sub &&\n'> 
          <'\t  git rev-parse sub-d > ../expect) &&\n'> <'\t test_cmp actual expect)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merging should conflict for non fast-forward'>)} 
      {
        (SQ <'\n'> <'\t(cd merge-search &&\n'> <'\t git checkout -b test-nonforward b &&\n'> 
          <'\t (cd sub &&\n'> <'\t  git rev-parse sub-d > ../expect) &&\n'> <'\t test_must_fail git merge c 2> actual  &&\n'> 
          <'\t grep $(cat expect) actual > /dev/null &&\n'> <'\t git reset --hard)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merging should fail for ambiguous common parent'>)} 
      {
        (SQ <'\n'> <'\t(cd merge-search &&\n'> <'\tgit checkout -b test-ambiguous b &&\n'> 
          <'\t(cd sub &&\n'> <'\t git checkout -b ambiguous sub-b &&\n'> <'\t git merge sub-c &&\n'> 
          <'\t git rev-parse sub-d > ../expect1 &&\n'> <'\t git rev-parse ambiguous > ../expect2) &&\n'> <'\ttest_must_fail git merge c 2> actual &&\n'> 
          <'\tgrep $(cat expect1) actual > /dev/null &&\n'> <'\tgrep $(cat expect2) actual > /dev/null &&\n'> <'\tgit reset --hard)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merging should fail for changes that are backwards'>)} 
      {
        (SQ <'\n'> <'\t(cd merge-search &&\n'> <'\tgit checkout -b bb a &&\n'> <'\t(cd sub &&\n'> 
          <'\t git checkout sub-b) &&\n'> <'\tgit commit -a -m "bb" &&\n'> <'\n'> <'\tgit checkout -b e bb &&\n'> <'\t(cd sub &&\n'> 
          <'\t git checkout sub-a) &&\n'> <'\tgit commit -a -m "e" &&\n'> <'\n'> <'\tgit checkout -b f bb &&\n'> <'\t(cd sub &&\n'> 
          <'\t git checkout sub-d) &&\n'> <'\tgit commit -a -m "f" &&\n'> <'\n'> <'\tgit checkout -b test-backward e &&\n'> 
          <'\ttest_must_fail git merge f)\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'git submodule status should display the merge conflict properly with merge base'>)} 
      {
        (SQ <'\n'> <'       (cd merge-search &&\n'> <'       cat >.gitmodules <<EOF &&\n'> 
          <'[submodule "sub"]\n'> <'       path = sub\n'> <'       url = $TRASH_DIRECTORY/sub\n'> <'EOF\n'> 
          <'       cat >expect <<EOF &&\n'> <'U0000000000000000000000000000000000000000 sub\n'> <'EOF\n'> 
          <'       git submodule status > actual &&\n'> <'       test_cmp expect actual &&\n'> <'\tgit reset --hard)\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'git submodule status should display the merge conflict properly without merge-base'>)} 
      {
        (SQ <'\n'> <'       (cd merge-search &&\n'> <'\tgit checkout -b test-no-merge-base g &&\n'> 
          <'\ttest_must_fail git merge b &&\n'> <'       cat >.gitmodules <<EOF &&\n'> <'[submodule "sub"]\n'> <'       path = sub\n'> 
          <'       url = $TRASH_DIRECTORY/sub\n'> <'EOF\n'> <'       cat >expect <<EOF &&\n'> <'U0000000000000000000000000000000000000000 sub\n'> 
          <'EOF\n'> <'       git submodule status > actual &&\n'> <'       test_cmp expect actual &&\n'> 
          <'       git reset --hard)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merging with a modify/modify conflict between merge bases'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard HEAD &&\n'> <'\tgit checkout -b test2 c &&\n'> 
          <'\tgit merge d\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup for recursive merge with submodule'>)} 
      {
        (SQ <'\n'> <'\tmkdir merge-recursive &&\n'> <'\t(cd merge-recursive &&\n'> <'\t git init &&\n'> 
          <'\t mkdir sub &&\n'> <'\t (cd sub &&\n'> <'\t  git init &&\n'> <'\t  test_commit a &&\n'> 
          <'\t  git checkout -b sub-b master &&\n'> <'\t  test_commit b &&\n'> <'\t  git checkout -b sub-c master &&\n'> <'\t  test_commit c &&\n'> 
          <'\t  git checkout -b sub-bc sub-b &&\n'> <'\t  git merge sub-c &&\n'> <'\t  git checkout -b sub-cb sub-c &&\n'> <'\t  git merge sub-b &&\n'> 
          <'\t  git checkout master) &&\n'> <'\t git add sub &&\n'> <'\t git commit -m a &&\n'> <'\t git checkout -b top-b master &&\n'> 
          <'\t (cd sub && git checkout sub-b) &&\n'> <'\t git add sub &&\n'> <'\t git commit -m b &&\n'> <'\t git checkout -b top-c master &&\n'> 
          <'\t (cd sub && git checkout sub-c) &&\n'> <'\t git add sub &&\n'> <'\t git commit -m c &&\n'> <'\t git checkout -b top-bc top-b &&\n'> 
          <'\t git merge -s ours --no-commit top-c &&\n'> <'\t (cd sub && git checkout sub-bc) &&\n'> <'\t git add sub &&\n'> <'\t git commit -m bc &&\n'> 
          <'\t git checkout -b top-cb top-c &&\n'> <'\t git merge -s ours --no-commit top-b &&\n'> <'\t (cd sub && git checkout sub-cb) &&\n'> 
          <'\t git add sub &&\n'> <'\t git commit -m cb)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'recursive merge with submodule'>)} 
      {
        (SQ <'\n'> <'\t(cd merge-recursive &&\n'> <'\t test_must_fail git merge top-bc &&\n'> 
          <'\t echo "160000 $(git rev-parse top-cb:sub) 2\tsub" > expect2 &&\n'> <'\t echo "160000 $(git rev-parse top-bc:sub) 3\tsub" > expect3 &&\n'> 
          <'\t git ls-files -u > actual &&\n'> <'\t grep "$(cat expect2)" actual > /dev/null &&\n'> 
          <'\t grep "$(cat expect3)" actual > /dev/null)\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)