#!/bin/sh global test_description := ''test cherry-picking many commits'' source ./test-lib.sh proc check_head_differs_from { ! test_cmp_rev HEAD $1 } proc check_head_equals { test_cmp_rev HEAD $1 } test_expect_success setup ' echo first > file1 && git add file1 && test_tick && git commit -m "first" && git tag first && git checkout -b other && for val in second third fourth do echo $val >> file1 && git add file1 && test_tick && git commit -m "$val" && git tag $val done ' test_expect_success 'cherry-pick first..fourth works' ' git checkout -f master && git reset --hard first && test_tick && git cherry-pick first..fourth && git diff --quiet other && git diff --quiet HEAD other && check_head_differs_from fourth ' test_expect_success 'cherry-pick three one two works' ' git checkout -f first && test_commit one && test_commit two && test_commit three && git checkout -f master && git reset --hard first && git cherry-pick three one two && git diff --quiet three && git diff --quiet HEAD three && test "$(git log --reverse --format=%s first..)" = "three one two" ' test_expect_success 'cherry-pick three one two: fails' ' git checkout -f master && git reset --hard first && test_must_fail git cherry-pick three one two: ' test_expect_success 'output to keep user entertained during multi-pick' ' cat <<-\EOF >expected && [master OBJID] second Author: A U Thor Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) [master OBJID] third Author: A U Thor Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) [master OBJID] fourth Author: A U Thor Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF git checkout -f master && git reset --hard first && test_tick && git cherry-pick first..fourth >actual && sed -e "s/$_x05[0-9a-f][0-9a-f]/OBJID/" actual.fuzzy && test_line_count -ge 3 actual.fuzzy && test_i18ncmp expected actual.fuzzy ' test_expect_success 'cherry-pick --strategy resolve first..fourth works' ' git checkout -f master && git reset --hard first && test_tick && git cherry-pick --strategy resolve first..fourth && git diff --quiet other && git diff --quiet HEAD other && check_head_differs_from fourth ' test_expect_success 'output during multi-pick indicates merge strategy' ' cat <<-\EOF >expected && Trying simple merge. [master OBJID] second Author: A U Thor Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. [master OBJID] third Author: A U Thor Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. [master OBJID] fourth Author: A U Thor Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF git checkout -f master && git reset --hard first && test_tick && git cherry-pick --strategy resolve first..fourth >actual && sed -e "s/$_x05[0-9a-f][0-9a-f]/OBJID/" actual.fuzzy && test_i18ncmp expected actual.fuzzy ' test_expect_success 'cherry-pick --ff first..fourth works' ' git checkout -f master && git reset --hard first && test_tick && git cherry-pick --ff first..fourth && git diff --quiet other && git diff --quiet HEAD other && check_head_equals fourth ' test_expect_success 'cherry-pick -n first..fourth works' ' git checkout -f master && git reset --hard first && test_tick && git cherry-pick -n first..fourth && git diff --quiet other && git diff --cached --quiet other && git diff --quiet HEAD first ' test_expect_success 'revert first..fourth works' ' git checkout -f master && git reset --hard fourth && test_tick && git revert first..fourth && git diff --quiet first && git diff --cached --quiet first && git diff --quiet HEAD first ' test_expect_success 'revert ^first fourth works' ' git checkout -f master && git reset --hard fourth && test_tick && git revert ^first fourth && git diff --quiet first && git diff --cached --quiet first && git diff --quiet HEAD first ' test_expect_success 'revert fourth fourth~1 fourth~2 works' ' git checkout -f master && git reset --hard fourth && test_tick && git revert fourth fourth~1 fourth~2 && git diff --quiet first && git diff --cached --quiet first && git diff --quiet HEAD first ' test_expect_success 'cherry-pick -3 fourth works' ' git checkout -f master && git reset --hard first && test_tick && git cherry-pick -3 fourth && git diff --quiet other && git diff --quiet HEAD other && check_head_differs_from fourth ' test_expect_success 'cherry-pick --stdin works' ' git checkout -f master && git reset --hard first && test_tick && git rev-list --reverse first..fourth | git cherry-pick --stdin && git diff --quiet other && git diff --quiet HEAD other && check_head_differs_from fourth ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"test cherry-picking many commits">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: check_head_differs_from body: (BraceGroup children: [ (Pipeline children: [(C {(test_cmp_rev)} {(HEAD)} {(DQ ($ VSub_Number "$1"))})] negated: True ) ] spids: [19] ) spids: [15 18] ) (FuncDef name: check_head_equals body: (BraceGroup children: [(C {(test_cmp_rev)} {(HEAD)} {(DQ ($ VSub_Number "$1"))})] spids: [39] ) spids: [35 38] ) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\techo first > file1 &&\n"> <"\tgit add file1 &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"first\" &&\n"> <"\tgit tag first &&\n"> <"\n"> <"\tgit checkout -b other &&\n"> <"\tfor val in second third fourth\n"> <"\tdo\n"> <"\t\techo $val >> file1 &&\n"> <"\t\tgit add file1 &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -m \"$val\" &&\n"> <"\t\tgit tag $val\n"> <"\tdone\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick first..fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick first..fourth &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --quiet HEAD other &&\n"> <"\tcheck_head_differs_from fourth\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick three one two works">)} { (SQ <"\n"> <"\tgit checkout -f first &&\n"> <"\ttest_commit one &&\n"> <"\ttest_commit two &&\n"> <"\ttest_commit three &&\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\tgit cherry-pick three one two &&\n"> <"\tgit diff --quiet three &&\n"> <"\tgit diff --quiet HEAD three &&\n"> <"\ttest \"$(git log --reverse --format=%s first..)\" = \"three\n"> <"one\n"> <"two\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick three one two: fails">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_must_fail git cherry-pick three one two:\n"> ) } ) (C {(test_expect_success)} {(SQ <"output to keep user entertained during multi-pick">)} { (SQ <"\n"> <"\tcat <<-\\EOF >expected &&\n"> <"\t[master OBJID] second\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:14:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\t[master OBJID] third\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:15:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\t[master OBJID] fourth\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:16:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\tEOF\n"> <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick first..fourth >actual &&\n"> <"\tsed -e \"s/$_x05[0-9a-f][0-9a-f]/OBJID/\" actual.fuzzy &&\n"> <"\ttest_line_count -ge 3 actual.fuzzy &&\n"> <"\ttest_i18ncmp expected actual.fuzzy\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick --strategy resolve first..fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick --strategy resolve first..fourth &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --quiet HEAD other &&\n"> <"\tcheck_head_differs_from fourth\n"> ) } ) (C {(test_expect_success)} {(SQ <"output during multi-pick indicates merge strategy">)} { (SQ <"\n"> <"\tcat <<-\\EOF >expected &&\n"> <"\tTrying simple merge.\n"> <"\t[master OBJID] second\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:14:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\tTrying simple merge.\n"> <"\t[master OBJID] third\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:15:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\tTrying simple merge.\n"> <"\t[master OBJID] fourth\n"> <"\t Author: A U Thor \n"> <"\t Date: Thu Apr 7 15:16:13 2005 -0700\n"> <"\t 1 file changed, 1 insertion(+)\n"> <"\tEOF\n"> <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick --strategy resolve first..fourth >actual &&\n"> <"\tsed -e \"s/$_x05[0-9a-f][0-9a-f]/OBJID/\" actual.fuzzy &&\n"> <"\ttest_i18ncmp expected actual.fuzzy\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick --ff first..fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick --ff first..fourth &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --quiet HEAD other &&\n"> <"\tcheck_head_equals fourth\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick -n first..fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick -n first..fourth &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --cached --quiet other &&\n"> <"\tgit diff --quiet HEAD first\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert first..fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard fourth &&\n"> <"\ttest_tick &&\n"> <"\tgit revert first..fourth &&\n"> <"\tgit diff --quiet first &&\n"> <"\tgit diff --cached --quiet first &&\n"> <"\tgit diff --quiet HEAD first\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert ^first fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard fourth &&\n"> <"\ttest_tick &&\n"> <"\tgit revert ^first fourth &&\n"> <"\tgit diff --quiet first &&\n"> <"\tgit diff --cached --quiet first &&\n"> <"\tgit diff --quiet HEAD first\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert fourth fourth~1 fourth~2 works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard fourth &&\n"> <"\ttest_tick &&\n"> <"\tgit revert fourth fourth~1 fourth~2 &&\n"> <"\tgit diff --quiet first &&\n"> <"\tgit diff --cached --quiet first &&\n"> <"\tgit diff --quiet HEAD first\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick -3 fourth works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit cherry-pick -3 fourth &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --quiet HEAD other &&\n"> <"\tcheck_head_differs_from fourth\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick --stdin works">)} { (SQ <"\n"> <"\tgit checkout -f master &&\n"> <"\tgit reset --hard first &&\n"> <"\ttest_tick &&\n"> <"\tgit rev-list --reverse first..fourth | git cherry-pick --stdin &&\n"> <"\tgit diff --quiet other &&\n"> <"\tgit diff --quiet HEAD other &&\n"> <"\tcheck_head_differs_from fourth\n"> ) } ) (C {(test_done)}) ] )