(command.CommandList children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:test_description) op: Equal rhs: {(SQ <'git rebase --autostash tests'>)} ) ] ) (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.FuncDef name: testrebase body: (command.BraceGroup children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:type) op: Equal rhs: {($ VSub_Number '$1')} ) ] ) (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:dotest) op: Equal rhs: {($ VSub_Number '$2')} ) ] ) (C {(test_expect_success)} {(DQ (rebase) ($ 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) ($ 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) ($ 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) ($ 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) ($ 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) ($ 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) ($ 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) ($ 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)}) ] )