(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)})
  ]
)