(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'git rebase --autostash tests'>)}
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\techo hello-world >file0 &&\n'> <'\tgit add . &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m "initial commit" &&\n'> <'\tgit checkout -b feature-branch &&\n'> <'\techo another-hello >file1 &&\n'> 
          <'\techo goodbye >file2 &&\n'> <'\tgit add . &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "second commit" &&\n'> 
          <'\techo final-goodbye >file3 &&\n'> <'\tgit add . &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "third commit" &&\n'> 
          <'\tgit checkout -b unrelated-onto-branch master &&\n'> <'\techo unrelated >file4 &&\n'> <'\tgit add . &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m "unrelated commit" &&\n'> <'\tgit checkout -b related-onto-branch master &&\n'> <'\techo conflicting-change >file2 &&\n'> 
          <'\tgit add . &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "related commit"\n'>
        )
      }
    )
    (command.ShFunction
      name: testrebase
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:type)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [63]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dotest)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [67]
                )
              ]
            )
            (C {<test_expect_success>} 
              {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': dirty worktree, --no-autostash'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> 
                  <'\t\ttest_when_finished git checkout feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\ttest_must_fail git rebase$type --no-autostash unrelated-onto-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <rebase> ($ Id.VSub_DollarName '$type') 
                  <': dirty worktree, non-conflicting rebase'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\tgit rebase$type unrelated-onto-branch &&\n'> <'\t\tgrep unrelated file4 &&\n'> <'\t\tgrep dirty file3 &&\n'> <'\t\tgit checkout feature-branch\n'> 
                  <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': dirty index, non-conflicting rebase'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\tgit add file3 &&\n'> <'\t\tgit rebase$type unrelated-onto-branch &&\n'> <'\t\tgrep unrelated file4 &&\n'> 
                  <'\t\tgrep dirty file3 &&\n'> <'\t\tgit checkout feature-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': conflicting rebase'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\ttest_must_fail git rebase$type related-onto-branch &&\n'> <'\t\ttest_path_is_file $dotest/autostash &&\n'> <'\t\t! grep dirty file3 &&\n'> 
                  <'\t\trm -rf $dotest &&\n'> <'\t\tgit reset --hard &&\n'> <'\t\tgit checkout feature-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': --continue'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\ttest_must_fail git rebase$type related-onto-branch &&\n'> <'\t\ttest_path_is_file $dotest/autostash &&\n'> <'\t\t! grep dirty file3 &&\n'> 
                  <'\t\techo "conflicting-plus-goodbye" >file2 &&\n'> <'\t\tgit add file2 &&\n'> <'\t\tgit rebase --continue &&\n'> 
                  <'\t\ttest_path_is_missing $dotest/autostash &&\n'> <'\t\tgrep dirty file3 &&\n'> <'\t\tgit checkout feature-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': --skip'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\ttest_must_fail git rebase$type related-onto-branch &&\n'> <'\t\ttest_path_is_file $dotest/autostash &&\n'> <'\t\t! grep dirty file3 &&\n'> 
                  <'\t\tgit rebase --skip &&\n'> <'\t\ttest_path_is_missing $dotest/autostash &&\n'> <'\t\tgrep dirty file3 &&\n'> 
                  <'\t\tgit checkout feature-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} {(DQ <rebase> ($ Id.VSub_DollarName '$type') <': --abort'>)} 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >>file3 &&\n'> 
                  <'\t\ttest_must_fail git rebase$type related-onto-branch &&\n'> <'\t\ttest_path_is_file $dotest/autostash &&\n'> <'\t\t! grep dirty file3 &&\n'> 
                  <'\t\tgit rebase --abort &&\n'> <'\t\ttest_path_is_missing $dotest/autostash &&\n'> <'\t\tgrep dirty file3 &&\n'> 
                  <'\t\tgit checkout feature-branch\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <rebase> ($ Id.VSub_DollarName '$type') 
                  <': non-conflicting rebase, conflicting stash'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttest_config rebase.autostash true &&\n'> <'\t\tgit reset --hard &&\n'> 
                  <'\t\tgit checkout -b rebased-feature-branch feature-branch &&\n'> <'\t\ttest_when_finished git branch -D rebased-feature-branch &&\n'> <'\t\techo dirty >file4 &&\n'> 
                  <'\t\tgit add file4 &&\n'> <'\t\tgit rebase$type unrelated-onto-branch &&\n'> <'\t\ttest_path_is_missing $dotest &&\n'> 
                  <'\t\tgit reset --hard &&\n'> <'\t\tgrep unrelated file4 &&\n'> <'\t\t! grep dirty file4 &&\n'> 
                  <'\t\tgit checkout feature-branch &&\n'> <'\t\tgit stash pop &&\n'> <'\t\tgrep dirty file4\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<test_expect_success>} {(DQ <'rebase: fast-forward rebase'>)} 
      {
        (SQ <'\n'> <'\ttest_config rebase.autostash true &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout -b behind-feature-branch feature-branch~1 &&\n'> <'\ttest_when_finished git branch -D behind-feature-branch &&\n'> <'\techo dirty >>file1 &&\n'> 
          <'\tgit rebase feature-branch &&\n'> <'\tgrep dirty file1 &&\n'> <'\tgit checkout feature-branch\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'rebase: noop rebase'>)} 
      {
        (SQ <'\n'> <'\ttest_config rebase.autostash true &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout -b same-feature-branch feature-branch &&\n'> <'\ttest_when_finished git branch -D same-feature-branch &&\n'> <'\techo dirty >>file1 &&\n'> 
          <'\tgit rebase feature-branch &&\n'> <'\tgrep dirty file1 &&\n'> <'\tgit checkout feature-branch\n'>
        )
      }
    )
    (C {<testrebase>} {(DQ )} {<'.git/rebase-apply'>})
    (C {<testrebase>} {(DQ <' --merge'>)} {<'.git/rebase-merge'>})
    (C {<testrebase>} {(DQ <' --interactive'>)} {<'.git/rebase-merge'>})
    (C {<test_expect_success>} {(SQ <'abort rebase -i with --autostash'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git reset --hard" &&\n'> 
          <'\techo uncommitted-content >file0 &&\n'> <'\t(\n'> <'\t\twrite_script abort-editor.sh <<-\\EOF &&\n'> <'\t\t\techo >"$1"\n'> <'\t\tEOF\n'> 
          <'\t\ttest_set_editor "$(pwd)/abort-editor.sh" &&\n'> <'\t\ttest_must_fail git rebase -i --autostash HEAD^ &&\n'> <'\t\trm -f abort-editor.sh\n'> 
          <'\t) &&\n'> <'\techo uncommitted-content >expected &&\n'> <'\ttest_cmp expected file0\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'restore autostash on editor failure'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git reset --hard" &&\n'> 
          <'\techo uncommitted-content >file0 &&\n'> <'\t(\n'> <'\t\ttest_set_editor "false" &&\n'> <'\t\ttest_must_fail git rebase -i --autostash HEAD^\n'> 
          <'\t) &&\n'> <'\techo uncommitted-content >expected &&\n'> <'\ttest_cmp expected file0\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'autostash is saved on editor failure with conflict'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git reset --hard" &&\n'> 
          <'\techo uncommitted-content >file0 &&\n'> <'\t(\n'> <'\t\twrite_script abort-editor.sh <<-\\EOF &&\n'> 
          <'\t\t\techo conflicting-content >file0\n'> <'\t\t\texit 1\n'> <'\t\tEOF\n'> <'\t\ttest_set_editor "$(pwd)/abort-editor.sh" &&\n'> 
          <'\t\ttest_must_fail git rebase -i --autostash HEAD^ &&\n'> <'\t\trm -f abort-editor.sh\n'> <'\t) &&\n'> <'\techo conflicting-content >expected &&\n'> 
          <'\ttest_cmp expected file0 &&\n'> <'\tgit checkout file0 &&\n'> <'\tgit stash pop &&\n'> <'\techo uncommitted-content >expected &&\n'> 
          <'\ttest_cmp expected file0\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)