(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"git rebase --autostash tests">)} spids: [13] ) ] 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"> ) } ) (FuncDef name: testrebase body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:type) op: Equal rhs: {($ VSub_Number "$1")} spids: [63] ) ] spids: [63] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dotest) op: Equal rhs: {($ VSub_Number "$2")} spids: [67] ) ] spids: [67] ) (C {(test_expect_success)} {(DQ (rebase) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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) ($ VSub_Name "$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"> ) } ) ] spids: [60] ) spids: [56 59] ) (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)}) ] )