(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"git rebase assorted tests\n"> <"\n"> <"This test runs git rebase and checks that the author information is not lost\n"> <"among other things.\n"> ) } spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:GIT_AUTHOR_NAME) op: Equal rhs: {(author) (Lit_Other "@") (name)} spids: [26] ) ] spids: [26] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:GIT_AUTHOR_EMAIL) op: Equal rhs: {(bogus) (Lit_Other "@") (email) (Lit_Other "@") (address)} spids: [31] ) ] spids: [31] ) (C {(export)} {(GIT_AUTHOR_NAME)} {(GIT_AUTHOR_EMAIL)}) (C {(test_expect_success)} {(SQ <"prepare repository with topic branches">)} { (SQ <"\n"> <"\tgit config core.logAllRefUpdates true &&\n"> <"\techo First >A &&\n"> <"\tgit update-index --add A &&\n"> <"\tgit commit -m \"Add A.\" &&\n"> <"\tgit checkout -b force-3way &&\n"> <"\techo Dummy >Y &&\n"> <"\tgit update-index --add Y &&\n"> <"\tgit commit -m \"Add Y.\" &&\n"> <"\tgit checkout -b filemove &&\n"> <"\tgit reset --soft master &&\n"> <"\tmkdir D &&\n"> <"\tgit mv A D/A &&\n"> <"\tgit commit -m \"Move A.\" &&\n"> <"\tgit checkout -b my-topic-branch master &&\n"> <"\techo Second >B &&\n"> <"\tgit update-index --add B &&\n"> <"\tgit commit -m \"Add B.\" &&\n"> <"\tgit checkout -f master &&\n"> <"\techo Third >>A &&\n"> <"\tgit update-index A &&\n"> <"\tgit commit -m \"Modify A.\" &&\n"> <"\tgit checkout -b side my-topic-branch &&\n"> <"\techo Side >>C &&\n"> <"\tgit add C &&\n"> <"\tgit commit -m \"Add C\" &&\n"> <"\tgit checkout -f my-topic-branch &&\n"> <"\tgit tag topic\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase on dirty worktree">)} {(SQ <"\n"> <"\techo dirty >>A &&\n"> <"\ttest_must_fail git rebase master\n">)} ) (C {(test_expect_success)} {(SQ <"rebase on dirty cache">)} {(SQ <"\n"> <"\tgit add A &&\n"> <"\ttest_must_fail git rebase master\n">)} ) (C {(test_expect_success)} {(SQ <"rebase against master">)} {(SQ <"\n"> <"\tgit reset --hard HEAD &&\n"> <"\tgit rebase master\n">)} ) (C {(test_expect_success)} {(SQ <"rebase, with <onto> and <upstream> specified as :/quuxery">)} { (SQ <"\n"> <"\ttest_when_finished \"git branch -D torebase\" &&\n"> <"\tgit checkout -b torebase my-topic-branch^ &&\n"> <"\tupstream=$(git rev-parse \":/Add B\") &&\n"> <"\tonto=$(git rev-parse \":/Add A\") &&\n"> <"\tgit rebase --onto $onto $upstream &&\n"> <"\tgit reset --hard my-topic-branch^ &&\n"> <"\tgit rebase --onto \":/Add A\" \":/Add B\" &&\n"> <"\tgit checkout my-topic-branch\n"> ) } ) (C {(test_expect_success)} {(SQ <"the rebase operation should not have destroyed author information">)} {(SQ <"\n"> <"\t! (git log | grep \"Author:\" | grep \"<>\")\n">)} ) (C {(test_expect_success)} {(SQ <"the rebase operation should not have destroyed author information (2)">)} { (DQ ("\n") ("\tgit log -1 |\n") ("\tgrep 'Author: ") ($ VSub_Name "$GIT_AUTHOR_NAME") (" <") ($ VSub_Name "$GIT_AUTHOR_EMAIL") (">'\n") ) } ) (C {(test_expect_success)} {(SQ <"HEAD was detached during rebase">)} {(SQ <"\n"> <"\ttest $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})\n">)} ) (C {(test_expect_success)} {(SQ <"rebase from ambiguous branch name">)} {(SQ <"\n"> <"\tgit checkout -b topic side &&\n"> <"\tgit rebase master\n">)} ) (C {(test_expect_success)} {(SQ <"rebase off of the previous branch using \"-\"">)} { (SQ <"\n"> <"\tgit checkout master &&\n"> <"\tgit checkout HEAD^ &&\n"> <"\tgit rebase @{-1} >expect.messages &&\n"> <"\tgit merge-base master HEAD >expect.forkpoint &&\n"> <"\n"> <"\tgit checkout master &&\n"> <"\tgit checkout HEAD^ &&\n"> <"\tgit rebase - >actual.messages &&\n"> <"\tgit merge-base master HEAD >actual.forkpoint &&\n"> <"\n"> <"\ttest_cmp expect.forkpoint actual.forkpoint &&\n"> <"\t# the next one is dubious---we may want to say \"-\",\n"> <"\t# instead of @{-1}, in the message\n"> <"\ttest_i18ncmp expect.messages actual.messages\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase a single mode change">)} { (SQ <"\n"> <"\tgit checkout master &&\n"> <"\tgit branch -D topic &&\n"> <"\techo 1 >X &&\n"> <"\tgit add X &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m prepare &&\n"> <"\tgit checkout -b modechange HEAD^ &&\n"> <"\techo 1 >X &&\n"> <"\tgit add X &&\n"> <"\ttest_chmod +x A &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m modechange &&\n"> <"\tGIT_TRACE=1 git rebase master\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase is not broken by diff.renames">)} { (SQ <"\n"> <"\ttest_config diff.renames copies &&\n"> <"\tgit checkout filemove &&\n"> <"\tGIT_TRACE=1 git rebase force-3way\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: recover">)} { (SQ <"\n"> <"\ttest_might_fail git rebase --abort &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout modechange\n"> ) } ) (C {(test_expect_success)} {(SQ <"Show verbose error when HEAD could not be detached">)} { (SQ <"\n"> <"\t>B &&\n"> <"\ttest_must_fail git rebase topic 2>output.err >output.out &&\n"> < "\ttest_i18ngrep \"The following untracked working tree files would be overwritten by checkout:\" output.err &&\n" > <"\ttest_i18ngrep B output.err\n"> ) } ) (C {(rm)} {(-f)} {(B)}) (C {(test_expect_success)} {(SQ <"fail when upstream arg is missing and not on branch">)} {(SQ <"\n"> <"\tgit checkout topic &&\n"> <"\ttest_must_fail git rebase\n">)} ) (C {(test_expect_success)} {(SQ <"fail when upstream arg is missing and not configured">)} {(SQ <"\n"> <"\tgit checkout -b no-config topic &&\n"> <"\ttest_must_fail git rebase\n">)} ) (C {(test_expect_success)} {(SQ <"default to common base in @{upstream}s reflog if no upstream arg">)} { (SQ <"\n"> <"\tgit checkout -b default-base master &&\n"> <"\tgit checkout -b default topic &&\n"> <"\tgit config branch.default.remote . &&\n"> <"\tgit config branch.default.merge refs/heads/default-base &&\n"> <"\tgit rebase &&\n"> <"\tgit rev-parse --verify default-base >expect &&\n"> <"\tgit rev-parse default~1 >actual &&\n"> <"\ttest_cmp expect actual &&\n"> <"\tgit checkout default-base &&\n"> <"\tgit reset --hard HEAD^ &&\n"> <"\tgit checkout default &&\n"> <"\tgit rebase &&\n"> <"\tgit rev-parse --verify default-base >expect &&\n"> <"\tgit rev-parse default~1 >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-picked commits and fork-point work together">)} { (SQ <"\n"> <"\tgit checkout default-base &&\n"> <"\techo Amended >A &&\n"> <"\tgit commit -a --no-edit --amend &&\n"> <"\ttest_commit B B &&\n"> <"\ttest_commit new_B B \"New B\" &&\n"> <"\ttest_commit C C &&\n"> <"\tgit checkout default &&\n"> <"\tgit reset --hard default-base@{4} &&\n"> <"\ttest_commit D D &&\n"> <"\tgit cherry-pick -2 default-base^ &&\n"> <"\ttest_commit final_B B \"Final B\" &&\n"> <"\tgit rebase &&\n"> <"\techo Amended >expect &&\n"> <"\ttest_cmp A expect &&\n"> <"\techo \"Final B\" >expect &&\n"> <"\ttest_cmp B expect &&\n"> <"\techo C >expect &&\n"> <"\ttest_cmp C expect &&\n"> <"\techo D >expect &&\n"> <"\ttest_cmp D expect\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase -q is quiet">)} { (SQ <"\n"> <"\tgit checkout -b quiet topic &&\n"> <"\tgit rebase -q master >output.out 2>&1 &&\n"> <"\ttest_must_be_empty output.out\n"> ) } ) (C {(test_expect_success)} {(SQ <"Rebase a commit that sprinkles CRs in">)} { (SQ <"\n"> <"\t(\n"> <"\t\techo \"One\"\n"> <"\t\techo \"TwoQ\"\n"> <"\t\techo \"Three\"\n"> <"\t\techo \"FQur\"\n"> <"\t\techo \"Five\"\n"> <"\t) | q_to_cr >CR &&\n"> <"\tgit add CR &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -a -m \"A file with a line with CR\" &&\n"> <"\tgit tag file-with-cr &&\n"> <"\tgit checkout HEAD^0 &&\n"> <"\tgit rebase --onto HEAD^^ HEAD^ &&\n"> <"\tgit diff --exit-code file-with-cr:CR HEAD:CR\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase can copy notes">)} { (SQ <"\n"> <"\tgit config notes.rewrite.rebase true &&\n"> <"\tgit config notes.rewriteRef \"refs/notes/*\" &&\n"> <"\ttest_commit n1 &&\n"> <"\ttest_commit n2 &&\n"> <"\ttest_commit n3 &&\n"> <"\tgit notes add -m\"a note\" n3 &&\n"> <"\tgit rebase --onto n1 n2 &&\n"> <"\ttest \"a note\" = \"$(git notes show HEAD)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase -m can copy notes">)} { (SQ <"\n"> <"\tgit reset --hard n3 &&\n"> <"\tgit rebase -m --onto n1 n2 &&\n"> <"\ttest \"a note\" = \"$(git notes show HEAD)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"rebase commit with an ancient timestamp">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\n"> <"\t>old.one && git add old.one && test_tick &&\n"> <"\tgit commit --date=\"@12345 +0400\" -m \"Old one\" &&\n"> <"\t>old.two && git add old.two && test_tick &&\n"> <"\tgit commit --date=\"@23456 +0500\" -m \"Old two\" &&\n"> <"\t>old.three && git add old.three && test_tick &&\n"> <"\tgit commit --date=\"@34567 +0600\" -m \"Old three\" &&\n"> <"\n"> <"\tgit cat-file commit HEAD^^ >actual &&\n"> <"\tgrep \"author .* 12345 +0400$\" actual &&\n"> <"\tgit cat-file commit HEAD^ >actual &&\n"> <"\tgrep \"author .* 23456 +0500$\" actual &&\n"> <"\tgit cat-file commit HEAD >actual &&\n"> <"\tgrep \"author .* 34567 +0600$\" actual &&\n"> <"\n"> <"\tgit rebase --onto HEAD^^ HEAD^ &&\n"> <"\n"> <"\tgit cat-file commit HEAD >actual &&\n"> <"\tgrep \"author .* 34567 +0600$\" actual\n"> ) } ) (C {(test_done)}) ] )