1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#!/bin/sh
test_description='test cherry-picking an empty commit'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./test-lib.sh
test_expect_success setup '
echo first > file1 &&
git add file1 &&
test_tick &&
git commit -m "first" &&
git checkout -b empty-message-branch &&
echo third >> file1 &&
git add file1 &&
test_tick &&
git commit --allow-empty-message -m "" &&
git checkout main &&
git checkout -b empty-change-branch &&
test_tick &&
git commit --allow-empty -m "empty"
'
test_expect_success 'cherry-pick an empty commit' '
git checkout main &&
test_expect_code 1 git cherry-pick empty-change-branch
'
test_expect_success 'index lockfile was removed' '
test ! -f .git/index.lock
'
test_expect_success 'cherry-pick a commit with an empty message' '
test_when_finished "git reset --hard empty-message-branch~1" &&
git checkout main &&
git cherry-pick empty-message-branch
'
test_expect_success 'index lockfile was removed' '
test ! -f .git/index.lock
'
test_expect_success 'cherry-pick a commit with an empty message with --allow-empty-message' '
git checkout -f main &&
git cherry-pick --allow-empty-message empty-message-branch
'
test_expect_success 'cherry pick an empty non-ff commit without --allow-empty' '
git checkout main &&
echo fourth >>file2 &&
git add file2 &&
git commit -m "fourth" &&
test_must_fail git cherry-pick empty-change-branch
'
test_expect_success 'cherry pick an empty non-ff commit with --allow-empty' '
git checkout main &&
git cherry-pick --allow-empty empty-change-branch
'
test_expect_success 'cherry pick with --keep-redundant-commits' '
git checkout main &&
git cherry-pick --keep-redundant-commits HEAD^
'
test_expect_success 'cherry-pick a commit that becomes no-op (prep)' '
git checkout main &&
git branch fork &&
echo foo >file2 &&
git add file2 &&
test_tick &&
git commit -m "add file2 on main" &&
git checkout fork &&
echo foo >file2 &&
git add file2 &&
test_tick &&
git commit -m "add file2 on the side"
'
test_expect_success 'cherry-pick a no-op with neither --keep-redundant nor --empty' '
git reset --hard &&
git checkout fork^0 &&
test_must_fail git cherry-pick main
'
test_expect_success 'cherry-pick a no-op with --keep-redundant' '
git reset --hard &&
git checkout fork^0 &&
git cherry-pick --keep-redundant-commits main &&
git show -s --format=%s >actual &&
echo "add file2 on main" >expect &&
test_cmp expect actual
'
test_expect_success '--keep-redundant-commits is incompatible with operations' '
test_must_fail git cherry-pick HEAD 2>output &&
test_grep "The previous cherry-pick is now empty" output &&
test_must_fail git cherry-pick --keep-redundant-commits --continue 2>output &&
test_grep "fatal: cherry-pick: --keep-redundant-commits cannot be used with --continue" output &&
test_must_fail git cherry-pick --keep-redundant-commits --skip 2>output &&
test_grep "fatal: cherry-pick: --keep-redundant-commits cannot be used with --skip" output &&
test_must_fail git cherry-pick --keep-redundant-commits --abort 2>output &&
test_grep "fatal: cherry-pick: --keep-redundant-commits cannot be used with --abort" output &&
test_must_fail git cherry-pick --keep-redundant-commits --quit 2>output &&
test_grep "fatal: cherry-pick: --keep-redundant-commits cannot be used with --quit" output &&
git cherry-pick --abort
'
test_expect_success '--empty is incompatible with operations' '
test_must_fail git cherry-pick HEAD 2>output &&
test_grep "The previous cherry-pick is now empty" output &&
test_must_fail git cherry-pick --empty=stop --continue 2>output &&
test_grep "fatal: cherry-pick: --empty cannot be used with --continue" output &&
test_must_fail git cherry-pick --empty=stop --skip 2>output &&
test_grep "fatal: cherry-pick: --empty cannot be used with --skip" output &&
test_must_fail git cherry-pick --empty=stop --abort 2>output &&
test_grep "fatal: cherry-pick: --empty cannot be used with --abort" output &&
test_must_fail git cherry-pick --empty=stop --quit 2>output &&
test_grep "fatal: cherry-pick: --empty cannot be used with --quit" output &&
git cherry-pick --abort
'
test_expect_success 'cherry-pick a no-op with --empty=stop' '
git reset --hard &&
git checkout fork^0 &&
test_must_fail git cherry-pick --empty=stop main 2>output &&
test_grep "The previous cherry-pick is now empty" output
'
test_expect_success 'cherry-pick a no-op with --empty=drop' '
git reset --hard &&
git checkout fork^0 &&
git cherry-pick --empty=drop main &&
test_commit_message HEAD -m "add file2 on the side"
'
test_expect_success 'cherry-pick a no-op with --empty=keep' '
git reset --hard &&
git checkout fork^0 &&
git cherry-pick --empty=keep main &&
test_commit_message HEAD -m "add file2 on main"
'
test_done
|