(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'rebase topology tests with merges'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/lib-rebase.sh'>})
    (command.ShFunction
      name: test_revision_subjects
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expected)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [29]
                )
              ]
            )
            (C {<shift>})
            (C {<Id.KW_Set set>} {<-->} 
              {
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (C {<git>} {<log>} {<--format> <Id.Lit_Equals '='> <Id.Lit_Other '%'> <s>} 
                      {<--no-walk> <Id.Lit_Equals '='> <unsorted>} {(DQ ($ Id.VSub_At '$@'))}
                    )
                )
              }
            )
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$expected'))} {<Id.Lit_Equals '='>} 
              {(DQ ($ Id.VSub_Star '$*'))}
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'setup of non-linear-history'>)} 
      {
        (SQ <'\n'> <'\ttest_commit a &&\n'> <'\ttest_commit b &&\n'> <'\ttest_commit c &&\n'> 
          <'\tgit checkout b &&\n'> <'\ttest_commit d &&\n'> <'\ttest_commit e &&\n'> <'\n'> <'\tgit checkout c &&\n'> 
          <'\ttest_commit g &&\n'> <'\trevert h g &&\n'> <'\tgit checkout d &&\n'> <'\tcherry_pick gp g &&\n'> <'\ttest_commit i &&\n'> 
          <'\tgit checkout b &&\n'> <'\ttest_commit f &&\n'> <'\n'> <'\tgit checkout d &&\n'> <'\ttest_commit n &&\n'> 
          <'\ttest_commit o &&\n'> <'\ttest_merge w e &&\n'> <'\ttest_merge v c &&\n'> <'\tgit checkout o &&\n'> <'\ttest_commit z\n'>
        )
      }
    )
    (command.ShFunction
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:result)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [140]
                )
              ]
            )
            (C {<shift>})
            (C {<test_expect_> ($ Id.VSub_DollarName '$result')} 
              {(DQ <'rebase '> ($ Id.VSub_Star '$*') <' after merge from upstream'>)} 
              {
                (DQ <'\n'> <'\t\treset_rebase &&\n'> <'\t\tgit rebase '> ($ Id.VSub_Star '$*') 
                  <' e w &&\n'> <'\t\ttest_cmp_rev e HEAD~2 &&\n'> <'\t\ttest_linear_range \'n o\' e..\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<test_run_rebase>} {<success>} {(SQ )})
    (C {<test_run_rebase>} {<success>} {<-m>})
    (C {<test_run_rebase>} {<success>} {<-i>})
    (command.ShFunction
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:result)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [197]
                )
              ]
            )
            (C {<shift>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expected)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [204]
                )
              ]
            )
            (C {<shift>})
            (C {<test_expect_> ($ Id.VSub_DollarName '$result')} 
              {
                (DQ <'rebase '> ($ Id.VSub_Star '$*') <' of non-linear history is linearized in place'>)
              } 
              {
                (DQ <'\n'> <'\t\treset_rebase &&\n'> <'\t\tgit rebase '> ($ Id.VSub_Star '$*') 
                  <' d w &&\n'> <'\t\ttest_cmp_rev d HEAD~3 &&\n'> <'\t\ttest_linear_range '>
                ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ ($ Id.VSub_DollarName '$expected')) 
                (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ <' d..\n'> <'\t'>)
              }
            )
          ]
        )
    )
    (C {<test_run_rebase>} {<success>} {(SQ <'e n o'>)} {(SQ )})
    (C {<test_run_rebase>} {<success>} {(SQ <'e n o'>)} {<-m>})
    (C {<test_run_rebase>} {<success>} {(SQ <'n o e'>)} {<-i>})
    (command.ShFunction
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:result)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [284]
                )
              ]
            )
            (C {<shift>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expected)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [291]
                )
              ]
            )
            (C {<shift>})
            (C {<test_expect_> ($ Id.VSub_DollarName '$result')} 
              {
                (DQ <'rebase '> ($ Id.VSub_Star '$*') <' of non-linear history is linearized upstream'>)
              } 
              {
                (DQ <'\n'> <'\t\treset_rebase &&\n'> <'\t\tgit rebase '> ($ Id.VSub_Star '$*') 
                  <' c w &&\n'> <'\t\ttest_cmp_rev c HEAD~4 &&\n'> <'\t\ttest_linear_range '>
                ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ ($ Id.VSub_DollarName '$expected')) 
                (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ <' c..\n'> <'\t'>)
              }
            )
          ]
        )
    )
    (C {<test_run_rebase>} {<success>} {(SQ <'d e n o'>)} {(SQ )})
    (C {<test_run_rebase>} {<success>} {(SQ <'d e n o'>)} {<-m>})
    (C {<test_run_rebase>} {<success>} {(SQ <'d n o e'>)} {<-i>})
    (command.ShFunction
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:result)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [371]
                )
              ]
            )
            (C {<shift>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expected)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [378]
                )
              ]
            )
            (C {<shift>})
            (C {<test_expect_> ($ Id.VSub_DollarName '$result')} 
              {
                (DQ <'rebase '> ($ Id.VSub_Star '$*') 
                  <' of non-linear history with merges after upstream merge is linearized'>
                )
              } 
              {
                (DQ <'\n'> <'\t\treset_rebase &&\n'> <'\t\tgit rebase '> ($ Id.VSub_Star '$*') 
                  <' c v &&\n'> <'\t\ttest_cmp_rev c HEAD~4 &&\n'> <'\t\ttest_linear_range '>
                ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ ($ Id.VSub_DollarName '$expected')) 
                (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (DQ <' c..\n'> <'\t'>)
              }
            )
          ]
        )
    )
    (C {<test_run_rebase>} {<success>} {(SQ <'d e n o'>)} {(SQ )})
    (C {<test_run_rebase>} {<success>} {(SQ <'d e n o'>)} {<-m>})
    (C {<test_run_rebase>} {<success>} {(SQ <'d n o e'>)} {<-i>})
    (C {<test_expect_success>} {(DQ <'rebase -p is no-op in non-linear history'>)} 
      {(DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p d w &&\n'> <'\ttest_cmp_rev w HEAD\n'>)}
    )
    (C {<test_expect_success>} {(DQ <'rebase -p is no-op when base inside second parent'>)} 
      {(DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p e w &&\n'> <'\ttest_cmp_rev w HEAD\n'>)}
    )
    (C {<test_expect_failure>} {(DQ <'rebase -p --root on non-linear history is a no-op'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p --root w &&\n'> <'\ttest_cmp_rev w HEAD\n'>)
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p re-creates merge from side branch'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p z w &&\n'> <'\ttest_cmp_rev z HEAD^ &&\n'> 
          <'\ttest_cmp_rev w^2 HEAD^2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p re-creates internal merge'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p c w &&\n'> <'\ttest_cmp_rev c HEAD~4 &&\n'> 
          <'\ttest_cmp_rev HEAD^2^ HEAD~3 &&\n'> <'\ttest_revision_subjects \'d n e o w\' HEAD~3 HEAD~2 HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p can re-create two branches on onto'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p --onto c d w &&\n'> 
          <'\ttest_cmp_rev c HEAD~3 &&\n'> <'\ttest_cmp_rev c HEAD^2^ &&\n'> <'\ttest_revision_subjects \'n e o w\' HEAD~2 HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup of non-linear-history for patch-equivalence tests'>)} 
      {(SQ <'\n'> <'\tgit checkout e &&\n'> <'\ttest_merge u i\n'>)}
    )
    (C {<test_expect_success>} 
      {(DQ <'rebase -p re-creates history around dropped commit matching upstream'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p h u &&\n'> <'\ttest_cmp_rev h HEAD~3 &&\n'> 
          <'\ttest_cmp_rev HEAD^2^ HEAD~2 &&\n'> <'\ttest_revision_subjects \'d i e u\' HEAD~2 HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p --onto in merged history drops patches in upstream'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p --onto f h u &&\n'> 
          <'\ttest_cmp_rev f HEAD~3 &&\n'> <'\ttest_cmp_rev HEAD^2^ HEAD~2 &&\n'> 
          <'\ttest_revision_subjects \'d i e u\' HEAD~2 HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(DQ <'rebase -p --onto in merged history does not drop patches in onto'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p --onto h f u &&\n'> 
          <'\ttest_cmp_rev h HEAD~3 &&\n'> <'\ttest_cmp_rev HEAD^2~2 HEAD~2 &&\n'> 
          <'\ttest_revision_subjects \'d gp i e u\' HEAD~2 HEAD^2^ HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup of non-linear-history for dropping whole side'>)} 
      {
        (SQ <'\n'> <'\tgit checkout gp &&\n'> <'\ttest_merge s e &&\n'> <'\tgit checkout e &&\n'> 
          <'\ttest_merge t gp\n'>
        )
      }
    )
    (C {<test_expect_failure>} 
      {(DQ <'rebase -p drops merge commit when entire first-parent side is dropped'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p h s &&\n'> <'\ttest_cmp_rev h HEAD~2 &&\n'> 
          <'\ttest_linear_range \'d e\' h..\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(DQ <'rebase -p drops merge commit when entire second-parent side is dropped'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p h t &&\n'> <'\ttest_cmp_rev h HEAD~2 &&\n'> 
          <'\ttest_linear_range \'d e\' h..\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup of non-linear-history for empty commits'>)} 
      {
        (SQ <'\n'> <'\tgit checkout n &&\n'> <'\tgit merge --no-commit e &&\n'> <'\tgit reset n . &&\n'> 
          <'\tgit commit -m r &&\n'> <'\tgit reset --hard &&\n'> <'\tgit clean -f &&\n'> <'\tgit tag r\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p re-creates empty internal merge commit'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p c r &&\n'> <'\ttest_cmp_rev c HEAD~3 &&\n'> 
          <'\ttest_cmp_rev HEAD^2^ HEAD~2 &&\n'> <'\ttest_revision_subjects \'d e n r\' HEAD~2 HEAD^2 HEAD^ HEAD\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase -p re-creates empty merge commit'>)} 
      {
        (DQ <'\n'> <'\treset_rebase &&\n'> <'\tgit rebase -p o r &&\n'> <'\ttest_cmp_rev e HEAD^2 &&\n'> 
          <'\ttest_cmp_rev o HEAD^ &&\n'> <'\ttest_revision_subjects \'r\' HEAD\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)