#!/bin/sh test_description='test cherry-picking many commits' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh check_head_differs_from() { test_cmp_rev ! HEAD "$1" } 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 || return 1 done ' test_expect_success 'cherry-pick first..fourth works' ' git checkout -f main && 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 main && 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 main && 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 && [main OBJID] second Author: A U Thor Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) [main OBJID] third Author: A U Thor Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) [main OBJID] fourth Author: A U Thor Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF git checkout -f main && 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_cmp expected actual.fuzzy ' test_expect_success 'cherry-pick --strategy resolve first..fourth works' ' git checkout -f main && 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. [main OBJID] second Author: A U Thor Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. [main OBJID] third Author: A U Thor Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. [main OBJID] fourth Author: A U Thor Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF git checkout -f main && 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_cmp expected actual.fuzzy ' test_expect_success 'cherry-pick --ff first..fourth works' ' git checkout -f main && 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 main && 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 main && 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 main && 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 main && 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 main && 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 main && 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