Merge branch 'ds/cvsexportcommit-force-text'
[gitweb.git] / t / t3507-cherry-pick-conflict.sh
index 0db166152ab9eafee7a34421c1100029bda485eb..9b9b4ca8d4f2a2188c206a0e1e2de763d00a1ab6 100755 (executable)
@@ -25,6 +25,11 @@ test_expect_success setup '
        test_commit base foo b &&
        test_commit picked foo c &&
        test_commit --signoff picked-signed foo d &&
+       git checkout -b topic initial &&
+       test_commit redundant-pick foo c redundant &&
+       git commit --allow-empty --allow-empty-message &&
+       git tag empty &&
+       git checkout master &&
        git config advice.detachedhead false
 
 '
@@ -88,7 +93,7 @@ test_expect_success 'cherry-pick --no-commit does not set CHERRY_PICK_HEAD' '
 
 test_expect_success 'cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD' '
        pristine_detach initial &&
-       echo foo > foo &&
+       echo foo >foo &&
        test_must_fail git cherry-pick base &&
        test_must_fail git rev-parse --verify CHERRY_PICK_HEAD
 '
@@ -96,7 +101,7 @@ test_expect_success 'cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD' '
 test_expect_success \
        'cherry-pick --strategy=resolve w/dirty tree does not set CHERRY_PICK_HEAD' '
        pristine_detach initial &&
-       echo foo > foo &&
+       echo foo >foo &&
        test_must_fail git cherry-pick --strategy=resolve base &&
        test_must_fail git rev-parse --verify CHERRY_PICK_HEAD
 '
@@ -156,6 +161,25 @@ test_expect_success 'successful commit clears CHERRY_PICK_HEAD' '
 
        test_must_fail git rev-parse --verify CHERRY_PICK_HEAD
 '
+test_expect_success 'successful final commit clears cherry-pick state' '
+       pristine_detach initial &&
+
+       test_must_fail git cherry-pick base picked-signed &&
+       echo resolved >foo &&
+       test_path_is_file .git/sequencer/todo &&
+       git commit -a &&
+       test_must_fail test_path_exists .git/sequencer
+'
+
+test_expect_success 'reset after final pick clears cherry-pick state' '
+       pristine_detach initial &&
+
+       test_must_fail git cherry-pick base picked-signed &&
+       echo resolved >foo &&
+       test_path_is_file .git/sequencer/todo &&
+       git reset &&
+       test_must_fail test_path_exists .git/sequencer
+'
 
 test_expect_success 'failed cherry-pick produces dirty index' '
        pristine_detach initial &&
@@ -175,23 +199,63 @@ test_expect_success 'failed cherry-pick registers participants in index' '
                git ls-files --stage foo &&
                git checkout picked -- foo &&
                git ls-files --stage foo
-       } > stages &&
+       } >stages &&
        sed "
                1 s/ 0  / 1     /
                2 s/ 0  / 2     /
                3 s/ 0  / 3     /
-       " < stages > expected &&
+       " stages >expected &&
        git read-tree -u --reset HEAD &&
 
        test_must_fail git cherry-pick picked &&
-       git ls-files --stage --unmerged > actual &&
+       git ls-files --stage --unmerged >actual &&
 
        test_cmp expected actual
 '
 
+test_expect_success \
+       'cherry-pick conflict, ensure commit.cleanup = scissors places scissors line properly' '
+       pristine_detach initial &&
+       git config commit.cleanup scissors &&
+       cat <<-EOF >expected &&
+               picked
+
+               # ------------------------ >8 ------------------------
+               # Do not modify or remove the line above.
+               # Everything below it will be ignored.
+               #
+               # Conflicts:
+               #       foo
+               EOF
+
+       test_must_fail git cherry-pick picked &&
+
+       test_i18ncmp expected .git/MERGE_MSG
+'
+
+test_expect_success \
+       'cherry-pick conflict, ensure cleanup=scissors places scissors line properly' '
+       pristine_detach initial &&
+       git config --unset commit.cleanup &&
+       cat <<-EOF >expected &&
+               picked
+
+               # ------------------------ >8 ------------------------
+               # Do not modify or remove the line above.
+               # Everything below it will be ignored.
+               #
+               # Conflicts:
+               #       foo
+               EOF
+
+       test_must_fail git cherry-pick --cleanup=scissors picked &&
+
+       test_i18ncmp expected .git/MERGE_MSG
+'
+
 test_expect_success 'failed cherry-pick describes conflict in work tree' '
        pristine_detach initial &&
-       cat <<-EOF > expected &&
+       cat <<-EOF >expected &&
        <<<<<<< HEAD
        a
        =======
@@ -201,14 +265,14 @@ test_expect_success 'failed cherry-pick describes conflict in work tree' '
 
        test_must_fail git cherry-pick picked &&
 
-       sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
+       sed "s/[a-f0-9]*\.\.\./objid/" foo >actual &&
        test_cmp expected actual
 '
 
 test_expect_success 'diff3 -m style' '
        pristine_detach initial &&
        git config merge.conflictstyle diff3 &&
-       cat <<-EOF > expected &&
+       cat <<-EOF >expected &&
        <<<<<<< HEAD
        a
        ||||||| parent of objid picked
@@ -220,14 +284,14 @@ test_expect_success 'diff3 -m style' '
 
        test_must_fail git cherry-pick picked &&
 
-       sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
+       sed "s/[a-f0-9]*\.\.\./objid/" foo >actual &&
        test_cmp expected actual
 '
 
 test_expect_success 'revert also handles conflicts sanely' '
        git config --unset merge.conflictstyle &&
        pristine_detach initial &&
-       cat <<-EOF > expected &&
+       cat <<-EOF >expected &&
        <<<<<<< HEAD
        a
        =======
@@ -241,24 +305,24 @@ test_expect_success 'revert also handles conflicts sanely' '
                git ls-files --stage foo &&
                git checkout base -- foo &&
                git ls-files --stage foo
-       } > stages &&
+       } >stages &&
        sed "
                1 s/ 0  / 1     /
                2 s/ 0  / 2     /
                3 s/ 0  / 3     /
-       " < stages > expected-stages &&
+       " stages >expected-stages &&
        git read-tree -u --reset HEAD &&
 
        head=$(git rev-parse HEAD) &&
        test_must_fail git revert picked &&
        newhead=$(git rev-parse HEAD) &&
-       git ls-files --stage --unmerged > actual-stages &&
+       git ls-files --stage --unmerged >actual-stages &&
 
        test "$head" = "$newhead" &&
        test_must_fail git update-index --refresh -q &&
        test_must_fail git diff-index --exit-code HEAD &&
        test_cmp expected-stages actual-stages &&
-       sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
+       sed "s/[a-f0-9]*\.\.\./objid/" foo >actual &&
        test_cmp expected actual
 '
 
@@ -284,7 +348,7 @@ test_expect_success 'revert --no-commit sets REVERT_HEAD' '
 
 test_expect_success 'revert w/dirty tree does not set REVERT_HEAD' '
        pristine_detach base &&
-       echo foo > foo &&
+       echo foo >foo &&
        test_must_fail git revert base &&
        test_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&
        test_must_fail git rev-parse --verify REVERT_HEAD
@@ -316,10 +380,30 @@ test_expect_success 'failed commit does not clear REVERT_HEAD' '
        test_cmp_rev picked REVERT_HEAD
 '
 
+test_expect_success 'successful final commit clears revert state' '
+       pristine_detach picked-signed &&
+
+       test_must_fail git revert picked-signed base &&
+       echo resolved >foo &&
+       test_path_is_file .git/sequencer/todo &&
+       git commit -a &&
+       test_must_fail test_path_exists .git/sequencer
+'
+
+test_expect_success 'reset after final pick clears revert state' '
+       pristine_detach picked-signed &&
+
+       test_must_fail git revert picked-signed base &&
+       echo resolved >foo &&
+       test_path_is_file .git/sequencer/todo &&
+       git reset &&
+       test_must_fail test_path_exists .git/sequencer
+'
+
 test_expect_success 'revert conflict, diff3 -m style' '
        pristine_detach initial &&
        git config merge.conflictstyle diff3 &&
-       cat <<-EOF > expected &&
+       cat <<-EOF >expected &&
        <<<<<<< HEAD
        a
        ||||||| objid picked
@@ -331,10 +415,56 @@ test_expect_success 'revert conflict, diff3 -m style' '
 
        test_must_fail git revert picked &&
 
-       sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
+       sed "s/[a-f0-9]*\.\.\./objid/" foo >actual &&
        test_cmp expected actual
 '
 
+test_expect_success \
+       'revert conflict, ensure commit.cleanup = scissors places scissors line properly' '
+       pristine_detach initial &&
+       git config commit.cleanup scissors &&
+       cat >expected <<-EOF &&
+               Revert "picked"
+
+               This reverts commit OBJID.
+
+               # ------------------------ >8 ------------------------
+               # Do not modify or remove the line above.
+               # Everything below it will be ignored.
+               #
+               # Conflicts:
+               #       foo
+               EOF
+
+       test_must_fail git revert picked &&
+
+       sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual &&
+       test_i18ncmp expected actual
+'
+
+test_expect_success \
+       'revert conflict, ensure cleanup=scissors places scissors line properly' '
+       pristine_detach initial &&
+       git config --unset commit.cleanup &&
+       cat >expected <<-EOF &&
+               Revert "picked"
+
+               This reverts commit OBJID.
+
+               # ------------------------ >8 ------------------------
+               # Do not modify or remove the line above.
+               # Everything below it will be ignored.
+               #
+               # Conflicts:
+               #       foo
+               EOF
+
+       test_must_fail git revert --cleanup=scissors picked &&
+
+       sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual &&
+       test_i18ncmp expected actual
+'
+
 test_expect_success 'failed cherry-pick does not forget -s' '
        pristine_detach initial &&
        test_must_fail git cherry-pick -s picked &&
@@ -345,7 +475,7 @@ test_expect_success 'commit after failed cherry-pick does not add duplicated -s'
        pristine_detach initial &&
        test_must_fail git cherry-pick -s picked-signed &&
        git commit -a -s &&
-       test $(git show -s |grep -c "Signed-off-by") = 1
+       test $(git show -s >tmp && grep -c "Signed-off-by" tmp && rm tmp) = 1
 '
 
 test_expect_success 'commit after failed cherry-pick adds -s at the right place' '
@@ -359,7 +489,7 @@ test_expect_success 'commit after failed cherry-pick adds -s at the right place'
        Signed-off-by: C O Mitter <committer@example.com>
        # Conflicts:
        EOF
-       grep -e "^# Conflicts:" -e '^Signed-off-by' <.git/COMMIT_EDITMSG >actual &&
+       grep -e "^# Conflicts:" -e '^Signed-off-by' .git/COMMIT_EDITMSG >actual &&
        test_cmp expect actual &&
 
        cat <<-\EOF >expected &&
@@ -378,7 +508,7 @@ test_expect_success 'commit --amend -s places the sign-off at the right place' '
 
        # emulate old-style conflicts block
        mv .git/MERGE_MSG .git/MERGE_MSG+ &&
-       sed -e "/^# Conflicts:/,\$s/^# *//" <.git/MERGE_MSG+ >.git/MERGE_MSG &&
+       sed -e "/^# Conflicts:/,\$s/^# *//" .git/MERGE_MSG+ >.git/MERGE_MSG &&
 
        git commit -a &&
        git commit --amend -s &&
@@ -388,7 +518,7 @@ test_expect_success 'commit --amend -s places the sign-off at the right place' '
        Signed-off-by: C O Mitter <committer@example.com>
        Conflicts:
        EOF
-       grep -e "^Conflicts:" -e '^Signed-off-by' <.git/COMMIT_EDITMSG >actual &&
+       grep -e "^Conflicts:" -e '^Signed-off-by' .git/COMMIT_EDITMSG >actual &&
        test_cmp expect actual
 '
 
@@ -405,4 +535,23 @@ test_expect_success 'cherry-pick preserves sparse-checkout' '
        test_i18ngrep ! "Changes not staged for commit:" actual
 '
 
+test_expect_success 'cherry-pick --continue remembers --keep-redundant-commits' '
+       test_when_finished "git cherry-pick --abort || :" &&
+       pristine_detach initial &&
+       test_must_fail git cherry-pick --keep-redundant-commits picked redundant &&
+       echo c >foo &&
+       git add foo &&
+       git cherry-pick --continue
+'
+
+test_expect_success 'cherry-pick --continue remembers --allow-empty and --allow-empty-message' '
+       test_when_finished "git cherry-pick --abort || :" &&
+       pristine_detach initial &&
+       test_must_fail git cherry-pick --allow-empty --allow-empty-message \
+                                      picked empty &&
+       echo c >foo &&
+       git add foo &&
+       git cherry-pick --continue
+'
+
 test_done