(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'git rebase --merge test'>)}
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:T)
          op: assign_op.Equal
          rhs: {(DQ <'A quick brown fox\n'> <'jumps over the lazy dog.'>)}
          spids: [24]
        )
      ]
    )
    (command.ForEach
      iter_name: i
      iter_words: [{<1>} {<2>} {<3>} {<4>} {<5>} {<6>} {<7>} {<8>} {<9>} {<10>}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [(C {<echo>} {(DQ ($ Id.VSub_DollarName '$i') <' '> ($ Id.VSub_DollarName '$T'))})]
        )
      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<original>})]
    )
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\tgit add original &&\n'> <'\tgit commit -m"initial" &&\n'> 
          <'\tgit branch side &&\n'> <'\techo "11 $T" >>original &&\n'> <'\tgit commit -a -m"master updates a bit." &&\n'> <'\n'> 
          <'\techo "12 $T" >>original &&\n'> <'\tgit commit -a -m"master updates a bit more." &&\n'> <'\n'> <'\tgit checkout side &&\n'> 
          <'\t(echo "0 $T" ; cat original) >renamed &&\n'> <'\tgit add renamed &&\n'> <'\tgit update-index --force-remove original &&\n'> 
          <'\tgit commit -a -m"side renames and edits." &&\n'> <'\n'> <'\ttr "[a-z]" "[A-Z]" <original >newfile &&\n'> <'\tgit add newfile &&\n'> 
          <'\tgit commit -a -m"side edits further." &&\n'> <'\tgit branch second-side &&\n'> <'\n'> <'\ttr "[a-m]" "[A-M]" <original >newfile &&\n'> 
          <'\trm -f original &&\n'> <'\tgit commit -a -m"side edits once again." &&\n'> <'\n'> <'\tgit branch test-rebase side &&\n'> 
          <'\tgit branch test-rebase-pick side &&\n'> <'\tgit branch test-reference-pick side &&\n'> <'\tgit branch test-conflicts side &&\n'> 
          <'\tgit checkout -b test-merge side\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'reference merge'>)} 
      {(SQ <'\n'> <'\tgit merge -s recursive -m "reference merge" master\n'>)}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PRE_REBASE)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<git>} {<rev-parse>} {<test-rebase>})
              )
            }
          spids: [123]
        )
      ]
    )
    (C {<test_expect_success>} {<rebase>} 
      {(SQ <'\n'> <'\tgit checkout test-rebase &&\n'> <'\tGIT_TRACE=1 git rebase --merge master\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'test-rebase@{1} is pre rebase'>)} 
      {(SQ <'\n'> <'\ttest $PRE_REBASE = $(git rev-parse test-rebase@{1})\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'merge and rebase should match'>)} 
      {
        (SQ <'\n'> <'\tgit diff-tree -r test-rebase test-merge >difference &&\n'> 
          <'\tif test -s difference\n'> <'\tthen\n'> <'\t\tcat difference\n'> <'\t\t(exit 1)\n'> <'\telse\n'> <'\t\techo happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase the other way'>)} 
      {(SQ <'\n'> <'\tgit reset --hard master &&\n'> <'\tgit rebase --merge side\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase -Xtheirs'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b conflicting master~2 &&\n'> <'\techo "AB $T" >> original &&\n'> 
          <'\tgit commit -mconflicting original &&\n'> <'\tgit rebase -Xtheirs master &&\n'> <'\tgrep AB original &&\n'> <'\t! grep 11 original\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase -Xtheirs from orphan'>)} 
      {
        (SQ <'\n'> <'\tgit checkout --orphan orphan-conflicting master~2 &&\n'> 
          <'\techo "AB $T" >> original &&\n'> <'\tgit commit -morphan-conflicting original &&\n'> <'\tgit rebase -Xtheirs master &&\n'> 
          <'\tgrep AB original &&\n'> <'\t! grep 11 original\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'merge and rebase should match'>)} 
      {
        (SQ <'\n'> <'\tgit diff-tree -r test-rebase test-merge >difference &&\n'> 
          <'\tif test -s difference\n'> <'\tthen\n'> <'\t\tcat difference\n'> <'\t\t(exit 1)\n'> <'\telse\n'> <'\t\techo happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'picking rebase'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard side &&\n'> <'\tgit rebase --merge --onto master side^^ &&\n'> 
          <'\tmb=$(git merge-base master HEAD) &&\n'> <'\tif test "$mb" = "$(git rev-parse master)"\n'> <'\tthen\n'> <'\t\techo happy\n'> <'\telse\n'> 
          <'\t\tgit show-branch\n'> <'\t\t(exit 1)\n'> <'\tfi &&\n'> <'\tf=$(git diff-tree --name-only HEAD^ HEAD) &&\n'> 
          <'\tg=$(git diff-tree --name-only HEAD^^ HEAD^) &&\n'> <'\tcase "$f,$g" in\n'> <'\tnewfile,newfile)\n'> <'\t\techo happy ;;\n'> <'\t*)\n'> <'\t\techo "$f"\n'> 
          <'\t\techo "$g"\n'> <'\t\t(exit 1)\n'> <'\tesac\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase -s funny -Xopt'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "rm -fr test-bin funny.was.run" &&\n'> 
          <'\tmkdir test-bin &&\n'> <'\tcat >test-bin/git-merge-funny <<-EOF &&\n'> <'\t#!$SHELL_PATH\n'> 
          <'\tcase "\\$1" in --opt) ;; *) exit 2 ;; esac\n'> <'\tshift &&\n'> <'\t>funny.was.run &&\n'> <'\texec git merge-recursive "\\$@"\n'> <'\tEOF\n'> 
          <'\tchmod +x test-bin/git-merge-funny &&\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout -b test-funny master^ &&\n'> <'\ttest_commit funny &&\n'> 
          <'\t(\n'> <'\t\tPATH=./test-bin:$PATH\n'> <'\t\tgit rebase -s funny -Xopt master\n'> <'\t) &&\n'> 
          <'\ttest -f funny.was.run\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase --skip works with two conflicts in a row'>)} 
      {
        (SQ <'\n'> <'\tgit checkout second-side  &&\n'> <'\ttr "[A-Z]" "[a-z]" <newfile >tmp &&\n'> 
          <'\tmv tmp newfile &&\n'> <'\tgit commit -a -m"edit conflicting with side" &&\n'> <'\ttr "[d-f]" "[D-F]" <newfile >tmp &&\n'> 
          <'\tmv tmp newfile &&\n'> <'\tgit commit -a -m"another edit conflicting with side" &&\n'> 
          <'\ttest_must_fail git rebase --merge test-conflicts &&\n'> <'\ttest_must_fail git rebase --skip &&\n'> <'\tgit rebase --skip\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)