(command.CommandList
  children: [
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'rebase topology tests with merges'>)}
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ VSub_DollarName '$TEST_DIRECTORY')) (/lib-rebase.sh)})
    (command.FuncDef
      name: test_revision_subjects
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:expected)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                )
              ]
            )
            (C {(shift)})
            (C {(set)} {(--)} 
              {
                (word_part.CommandSubPart
                  command_list: 
                    (command.CommandList
                      children: [
                        (C {(git)} {(log)} {(--format) (Lit_Other '=') (Lit_Other '%') (s)} 
                          {(--no-walk) (Lit_Other '=') (unsorted)} {(DQ ($ VSub_At '$@'))}
                        )
                      ]
                    )
                  left_token: <Left_CommandSub '$('>
                )
              }
            )
            (C {(test)} {(DQ ($ VSub_DollarName '$expected'))} {(Lit_Other '=')} {(DQ ($ 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.FuncDef
      name: test_run_rebase
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_DollarName '$result')} 
              {(DQ ('rebase ') ($ VSub_Star '$*') (' after merge from upstream'))} 
              {
                (DQ ('\n') ('\t\treset_rebase &&\n') ('\t\tgit rebase ') ($ 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.FuncDef
      name: test_run_rebase
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_DollarName '$result')} 
              {(DQ ('rebase ') ($ VSub_Star '$*') (' of non-linear history is linearized in place'))} 
              {
                (DQ ('\n') ('\t\treset_rebase &&\n') ('\t\tgit rebase ') ($ VSub_Star '$*') (' d w &&\n') 
                  ('\t\ttest_cmp_rev d HEAD~3 &&\n') ('\t\ttest_linear_range ')
                ) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_DollarName '$expected')) 
                (word_part.EscapedLiteralPart token:<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.FuncDef
      name: test_run_rebase
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_DollarName '$result')} 
              {(DQ ('rebase ') ($ VSub_Star '$*') (' of non-linear history is linearized upstream'))} 
              {
                (DQ ('\n') ('\t\treset_rebase &&\n') ('\t\tgit rebase ') ($ VSub_Star '$*') (' c w &&\n') 
                  ('\t\ttest_cmp_rev c HEAD~4 &&\n') ('\t\ttest_linear_range ')
                ) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_DollarName '$expected')) 
                (word_part.EscapedLiteralPart token:<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.FuncDef
      name: test_run_rebase
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                )
              ]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_DollarName '$result')} 
              {
                (DQ ('rebase ') ($ VSub_Star '$*') 
                  (' of non-linear history with merges after upstream merge is linearized')
                )
              } 
              {
                (DQ ('\n') ('\t\treset_rebase &&\n') ('\t\tgit rebase ') ($ VSub_Star '$*') (' c v &&\n') 
                  ('\t\ttest_cmp_rev c HEAD~4 &&\n') ('\t\ttest_linear_range ')
                ) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_DollarName '$expected')) 
                (word_part.EscapedLiteralPart token:<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)})
  ]
)