(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"rebase topology tests with merges">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/lib-rebase.sh)})
    (FuncDef
      name: test_revision_subjects
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number "$1"))}
                  spids: [29]
                )
              ]
              spids: [29]
            )
            (C {(shift)})
            (C {(set)} {(--)} 
              {
                (CommandSubPart
                  command_list: 
                    (CommandList
                      children: [
                        (C {(git)} {(log)} {(--format) (Lit_Other "=") (Lit_Other "%") (s)} 
                          {(--no-walk) (Lit_Other "=") (unsorted)} {(DQ ($ VSub_At "$@"))}
                        )
                      ]
                    )
                  left_token: <Left_CommandSub "$(">
                  spids: [42 59]
                )
              }
            )
            (C {(test)} {(DQ ($ VSub_Name "$expected"))} {(Lit_Other "=")} {(DQ ($ VSub_Star "$*"))})
          ]
          spids: [26]
        )
      spids: [21 25]
    )
    (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">
        )
      }
    )
    (FuncDef
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [140]
                )
              ]
              spids: [140]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_Name "$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")
                )
              }
            )
          ]
          spids: [137]
        )
      spids: [132 136]
    )
    (C {(test_run_rebase)} {(success)} {(SQ )})
    (C {(test_run_rebase)} {(success)} {(-m)})
    (C {(test_run_rebase)} {(success)} {(-i)})
    (FuncDef
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [197]
                )
              ]
              spids: [197]
            )
            (C {(shift)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [204]
                )
              ]
              spids: [204]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_Name "$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 ")
                ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_Name "$expected")) 
                (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ (" d..\n") ("\t"))
              }
            )
          ]
          spids: [194]
        )
      spids: [189 193]
    )
    (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)})
    (FuncDef
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [284]
                )
              ]
              spids: [284]
            )
            (C {(shift)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [291]
                )
              ]
              spids: [291]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_Name "$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 ")
                ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_Name "$expected")) 
                (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ (" c..\n") ("\t"))
              }
            )
          ]
          spids: [281]
        )
      spids: [276 280]
    )
    (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)})
    (FuncDef
      name: test_run_rebase
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:result)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [371]
                )
              ]
              spids: [371]
            )
            (C {(shift)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:expected)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [378]
                )
              ]
              spids: [378]
            )
            (C {(shift)})
            (C {(test_expect_) ($ VSub_Name "$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 ")
                ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ ($ VSub_Name "$expected")) 
                (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (DQ (" c..\n") ("\t"))
              }
            )
          ]
          spids: [368]
        )
      spids: [363 367]
    )
    (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)})
  ]
)