(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'rebase topology tests with merges' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-rebase.sh)})
    (command.ShFunction
      name: test_revision_subjects
      body: 
        (command.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: (Token id:Id.Left_DollarParen val:'$(' span_id:42)
                  command_list: 
                    (command.CommandList
                      children: [
                        (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 (Token id:Id.Lit_Chars val:'setup of non-linear-history' span_id:101))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\ttest_commit a &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\ttest_commit b &&\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\ttest_commit c &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\tgit checkout b &&\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\ttest_commit d &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\ttest_commit e &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\n' span_id:112) (Token id:Id.Lit_Chars val:'\tgit checkout c &&\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\ttest_commit g &&\n' span_id:114) (Token id:Id.Lit_Chars val:'\trevert h g &&\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'\tgit checkout d &&\n' span_id:116) (Token id:Id.Lit_Chars val:'\tcherry_pick gp g &&\n' span_id:117) 
          (Token id:Id.Lit_Chars val:'\ttest_commit i &&\n' span_id:118) (Token id:Id.Lit_Chars val:'\tgit checkout b &&\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\ttest_commit f &&\n' span_id:120) (Token id:Id.Lit_Chars val:'\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\tgit checkout d &&\n' span_id:122) (Token id:Id.Lit_Chars val:'\ttest_commit n &&\n' span_id:123) 
          (Token id:Id.Lit_Chars val:'\ttest_commit o &&\n' span_id:124) (Token id:Id.Lit_Chars val:'\ttest_merge w e &&\n' span_id:125) 
          (Token id:Id.Lit_Chars val:'\ttest_merge v c &&\n' span_id:126) (Token id:Id.Lit_Chars val:'\tgit checkout o &&\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\ttest_commit z\n' span_id:128)
        )
      }
    )
    (command.ShFunction
      name: test_run_rebase
      body: 
        (command.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: 
        (command.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:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:229)) 
                (DQ ($ Id.VSub_DollarName '$expected')) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:233)) 
                (DQ (' d..\n') ('\t'))
              }
            )
          ]
        )
    )
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'e n o' span_id:249))} {(SQ )})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'e n o' span_id:260))} {(-m)})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'n o e' span_id:270))} {(-i)})
    (command.ShFunction
      name: test_run_rebase
      body: 
        (command.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:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:316)) 
                (DQ ($ Id.VSub_DollarName '$expected')) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:320)) 
                (DQ (' c..\n') ('\t'))
              }
            )
          ]
        )
    )
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d e n o' span_id:336))} {(SQ )})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d e n o' span_id:347))} {(-m)})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d n o e' span_id:357))} {(-i)})
    (command.ShFunction
      name: test_run_rebase
      body: 
        (command.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:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:403)) 
                (DQ ($ Id.VSub_DollarName '$expected')) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:407)) 
                (DQ (' c..\n') ('\t'))
              }
            )
          ]
        )
    )
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d e n o' span_id:423))} {(SQ )})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d e n o' span_id:434))} {(-m)})
    (C {(test_run_rebase)} {(success)} {(SQ (Token id:Id.Lit_Chars val:'d n o e' span_id:444))} {(-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 
          (Token
            id: Id.Lit_Chars
            val: 'setup of non-linear-history for patch-equivalence tests'
            span_id: 572
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:576) 
          (Token id:Id.Lit_Chars val:'\tgit checkout e &&\n' span_id:577) (Token id:Id.Lit_Chars val:'\ttest_merge u i\n' span_id:578)
        )
      }
    )
    (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 
          (Token
            id: Id.Lit_Chars
            val: 'setup of non-linear-history for dropping whole side'
            span_id: 663
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:667) 
          (Token id:Id.Lit_Chars val:'\tgit checkout gp &&\n' span_id:668) (Token id:Id.Lit_Chars val:'\ttest_merge s e &&\n' span_id:669) 
          (Token id:Id.Lit_Chars val:'\tgit checkout e &&\n' span_id:670) (Token id:Id.Lit_Chars val:'\ttest_merge t gp\n' span_id:671)
        )
      }
    )
    (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 (Token id:Id.Lit_Chars val:'setup of non-linear-history for empty commits' span_id:735))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:739) 
          (Token id:Id.Lit_Chars val:'\tgit checkout n &&\n' span_id:740) (Token id:Id.Lit_Chars val:'\tgit merge --no-commit e &&\n' span_id:741) 
          (Token id:Id.Lit_Chars val:'\tgit reset n . &&\n' span_id:742) (Token id:Id.Lit_Chars val:'\tgit commit -m r &&\n' span_id:743) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:744) (Token id:Id.Lit_Chars val:'\tgit clean -f &&\n' span_id:745) 
          (Token id:Id.Lit_Chars val:'\tgit tag r\n' span_id:746)
        )
      }
    )
    (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)})
  ]
)