#!/bin/sh global test_description := ''test cherry-pick and revert with conflicts - + picked: rewrites foo to c + base: rewrites foo to b + initial: writes foo as a, unrelated as unrelated '' source ./test-lib.sh proc pristine_detach { git checkout -f "$1^0" && git read-tree -u --reset HEAD && git clean -d -f -f -q -x } test_expect_success setup ' echo unrelated >unrelated && git add unrelated && test_commit initial foo a && test_commit base foo b && test_commit picked foo c && test_commit --signoff picked-signed foo d && git config advice.detachedhead false ' test_expect_success 'failed cherry-pick does not advance HEAD' ' pristine_detach initial && head=$(git rev-parse HEAD) && test_must_fail git cherry-pick picked && newhead=$(git rev-parse HEAD) && test "$head" = "$newhead" ' test_expect_success 'advice from failed cherry-pick' " pristine_detach initial && picked=\$(git rev-parse --short picked) && cat <<-EOF >expected && error: could not apply \$picked... picked hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' hint: and commit the result with 'git commit' EOF test_must_fail git cherry-pick picked 2>actual && test_i18ncmp expected actual " test_expect_success 'advice from failed cherry-pick --no-commit' " pristine_detach initial && picked=\$(git rev-parse --short picked) && cat <<-EOF >expected && error: could not apply \$picked... picked hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' EOF test_must_fail git cherry-pick --no-commit picked 2>actual && test_i18ncmp expected actual " test_expect_success 'failed cherry-pick sets CHERRY_PICK_HEAD' ' pristine_detach initial && test_must_fail git cherry-pick picked && test_cmp_rev picked CHERRY_PICK_HEAD ' test_expect_success 'successful cherry-pick does not set CHERRY_PICK_HEAD' ' pristine_detach initial && git cherry-pick base && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'cherry-pick --no-commit does not set CHERRY_PICK_HEAD' ' pristine_detach initial && git cherry-pick --no-commit base && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD' ' pristine_detach initial && echo foo > foo && test_must_fail git cherry-pick base && test_must_fail git rev-parse --verify 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 && test_must_fail git cherry-pick --strategy=resolve base && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'GIT_CHERRY_PICK_HELP suppresses CHERRY_PICK_HEAD' ' pristine_detach initial && ( GIT_CHERRY_PICK_HELP="and then do something else" && export GIT_CHERRY_PICK_HELP && test_must_fail git cherry-pick picked ) && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'git reset clears CHERRY_PICK_HEAD' ' pristine_detach initial && test_must_fail git cherry-pick picked && git reset && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'failed commit does not clear CHERRY_PICK_HEAD' ' pristine_detach initial && test_must_fail git cherry-pick picked && test_must_fail git commit && test_cmp_rev picked CHERRY_PICK_HEAD ' test_expect_success 'cancelled commit does not clear CHERRY_PICK_HEAD' ' pristine_detach initial && test_must_fail git cherry-pick picked && echo resolved >foo && git add foo && git update-index --refresh -q && test_must_fail git diff-index --exit-code HEAD && ( GIT_EDITOR=false && export GIT_EDITOR && test_must_fail git commit ) && test_cmp_rev picked CHERRY_PICK_HEAD ' test_expect_success 'successful commit clears CHERRY_PICK_HEAD' ' pristine_detach initial && test_must_fail git cherry-pick picked && echo resolved >foo && git add foo && git commit && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD ' test_expect_success 'failed cherry-pick produces dirty index' ' pristine_detach initial && test_must_fail git cherry-pick picked && test_must_fail git update-index --refresh -q && test_must_fail git diff-index --exit-code HEAD ' test_expect_success 'failed cherry-pick registers participants in index' ' pristine_detach initial && { git checkout base -- foo && git ls-files --stage foo && git checkout initial -- foo && git ls-files --stage foo && git checkout picked -- foo && git ls-files --stage foo } > stages && sed " 1 s/ 0 / 1 / 2 s/ 0 / 2 / 3 s/ 0 / 3 / " < stages > expected && git read-tree -u --reset HEAD && test_must_fail git cherry-pick picked && git ls-files --stage --unmerged > actual && test_cmp expected actual ' test_expect_success 'failed cherry-pick describes conflict in work tree' ' pristine_detach initial && cat <<-EOF > expected && <<<<<<< HEAD a ======= c >>>>>>> objid picked EOF test_must_fail git cherry-pick picked && 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 && <<<<<<< HEAD a ||||||| parent of objid picked b ======= c >>>>>>> objid picked EOF test_must_fail git cherry-pick picked && 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 && <<<<<<< HEAD a ======= b >>>>>>> parent of objid picked EOF { git checkout picked -- foo && git ls-files --stage foo && git checkout initial -- foo && git ls-files --stage foo && git checkout base -- foo && git ls-files --stage foo } > stages && sed " 1 s/ 0 / 1 / 2 s/ 0 / 2 / 3 s/ 0 / 3 / " < 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 && 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 && test_cmp expected actual ' test_expect_success 'failed revert sets REVERT_HEAD' ' pristine_detach initial && test_must_fail git revert picked && test_cmp_rev picked REVERT_HEAD ' test_expect_success 'successful revert does not set REVERT_HEAD' ' pristine_detach base && git revert base && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD && test_must_fail git rev-parse --verify REVERT_HEAD ' test_expect_success 'revert --no-commit sets REVERT_HEAD' ' pristine_detach base && git revert --no-commit base && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD && test_cmp_rev base REVERT_HEAD ' test_expect_success 'revert w/dirty tree does not set REVERT_HEAD' ' pristine_detach base && 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 ' test_expect_success 'GIT_CHERRY_PICK_HELP does not suppress REVERT_HEAD' ' pristine_detach initial && ( GIT_CHERRY_PICK_HELP="and then do something else" && GIT_REVERT_HELP="and then do something else, again" && export GIT_CHERRY_PICK_HELP GIT_REVERT_HELP && test_must_fail git revert picked ) && test_must_fail git rev-parse --verify CHERRY_PICK_HEAD && test_cmp_rev picked REVERT_HEAD ' test_expect_success 'git reset clears REVERT_HEAD' ' pristine_detach initial && test_must_fail git revert picked && git reset && test_must_fail git rev-parse --verify REVERT_HEAD ' test_expect_success 'failed commit does not clear REVERT_HEAD' ' pristine_detach initial && test_must_fail git revert picked && test_must_fail git commit && test_cmp_rev picked REVERT_HEAD ' test_expect_success 'revert conflict, diff3 -m style' ' pristine_detach initial && git config merge.conflictstyle diff3 && cat <<-EOF > expected && <<<<<<< HEAD a ||||||| objid picked c ======= b >>>>>>> parent of objid picked EOF test_must_fail git revert picked && sed "s/[a-f0-9]*\.\.\./objid/" foo > actual && test_cmp expected actual ' test_expect_success 'failed cherry-pick does not forget -s' ' pristine_detach initial && test_must_fail git cherry-pick -s picked && test_i18ngrep -e "Signed-off-by" .git/MERGE_MSG ' 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_expect_success 'commit after failed cherry-pick adds -s at the right place' ' pristine_detach initial && test_must_fail git cherry-pick picked && git commit -a -s && # Do S-o-b and Conflicts appear in the right order? cat <<-\EOF >expect && Signed-off-by: C O Mitter # Conflicts: EOF grep -e "^# Conflicts:" -e '^Signed-off-by' <.git/COMMIT_EDITMSG >actual && test_cmp expect actual && cat <<-\EOF >expected && picked Signed-off-by: C O Mitter EOF git show -s --pretty=format:%B >actual && test_cmp expected actual ' test_expect_success 'commit --amend -s places the sign-off at the right place' ' pristine_detach initial && test_must_fail git cherry-pick picked && # emulate old-style conflicts block mv .git/MERGE_MSG .git/MERGE_MSG+ && sed -e "/^# Conflicts:/,\$s/^# *//" <.git/MERGE_MSG+ >.git/MERGE_MSG && git commit -a && git commit --amend -s && # Do S-o-b and Conflicts appear in the right order? cat <<-\EOF >expect && Signed-off-by: C O Mitter Conflicts: EOF grep -e "^Conflicts:" -e '^Signed-off-by' <.git/COMMIT_EDITMSG >actual && test_cmp expect actual ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"test cherry-pick and revert with conflicts\n"> <"\n"> <" -\n"> <" + picked: rewrites foo to c\n"> <" + base: rewrites foo to b\n"> <" + initial: writes foo as a, unrelated as unrelated\n"> <"\n"> ) } spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: pristine_detach body: (BraceGroup children: [ (AndOr children: [ (C {(git)} {(checkout)} {(-f)} {(DQ ($ VSub_Number "$1") ("^0"))}) (AndOr children: [ (C {(git)} {(read-tree)} {(-u)} {(--reset)} {(HEAD)}) (C {(git)} {(clean)} {(-d)} {(-f)} {(-f)} {(-q)} {(-x)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [26] ) spids: [21 25] ) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\n"> <"\techo unrelated >unrelated &&\n"> <"\tgit add unrelated &&\n"> <"\ttest_commit initial foo a &&\n"> <"\ttest_commit base foo b &&\n"> <"\ttest_commit picked foo c &&\n"> <"\ttest_commit --signoff picked-signed foo d &&\n"> <"\tgit config advice.detachedhead false\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick does not advance HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\thead=$(git rev-parse HEAD) &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tnewhead=$(git rev-parse HEAD) &&\n"> <"\n"> <"\ttest \"$head\" = \"$newhead\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"advice from failed cherry-pick">)} { (DQ ("\n") ("\tpristine_detach initial &&\n") ("\n") ("\tpicked=") (EscapedLiteralPart token:) ("(git rev-parse --short picked) &&\n") ("\tcat <<-EOF >expected &&\n") ("\terror: could not apply ") (EscapedLiteralPart token:) ("picked... picked\n") ("\thint: after resolving the conflicts, mark the corrected paths\n") ("\thint: with 'git add ' or 'git rm '\n") ("\thint: and commit the result with 'git commit'\n") ("\tEOF\n") ("\ttest_must_fail git cherry-pick picked 2>actual &&\n") ("\n") ("\ttest_i18ncmp expected actual\n") ) } ) (C {(test_expect_success)} {(SQ <"advice from failed cherry-pick --no-commit">)} { (DQ ("\n") ("\tpristine_detach initial &&\n") ("\n") ("\tpicked=") (EscapedLiteralPart token:) ("(git rev-parse --short picked) &&\n") ("\tcat <<-EOF >expected &&\n") ("\terror: could not apply ") (EscapedLiteralPart token:) ("picked... picked\n") ("\thint: after resolving the conflicts, mark the corrected paths\n") ("\thint: with 'git add ' or 'git rm '\n") ("\tEOF\n") ("\ttest_must_fail git cherry-pick --no-commit picked 2>actual &&\n") ("\n") ("\ttest_i18ncmp expected actual\n") ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick sets CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"successful cherry-pick does not set CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit cherry-pick base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick --no-commit does not set CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit cherry-pick --no-commit base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\techo foo > foo &&\n"> <"\ttest_must_fail git cherry-pick base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"cherry-pick --strategy=resolve w/dirty tree does not set CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\techo foo > foo &&\n"> <"\ttest_must_fail git cherry-pick --strategy=resolve base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"GIT_CHERRY_PICK_HELP suppresses CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t(\n"> <"\t\tGIT_CHERRY_PICK_HELP=\"and then do something else\" &&\n"> <"\t\texport GIT_CHERRY_PICK_HELP &&\n"> <"\t\ttest_must_fail git cherry-pick picked\n"> <"\t) &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"git reset clears CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tgit reset &&\n"> <"\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed commit does not clear CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\ttest_must_fail git commit &&\n"> <"\n"> <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"cancelled commit does not clear CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\techo resolved >foo &&\n"> <"\tgit add foo &&\n"> <"\tgit update-index --refresh -q &&\n"> <"\ttest_must_fail git diff-index --exit-code HEAD &&\n"> <"\t(\n"> <"\t\tGIT_EDITOR=false &&\n"> <"\t\texport GIT_EDITOR &&\n"> <"\t\ttest_must_fail git commit\n"> <"\t) &&\n"> <"\n"> <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"successful commit clears CHERRY_PICK_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\techo resolved >foo &&\n"> <"\tgit add foo &&\n"> <"\tgit commit &&\n"> <"\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick produces dirty index">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\ttest_must_fail git update-index --refresh -q &&\n"> <"\ttest_must_fail git diff-index --exit-code HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick registers participants in index">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t{\n"> <"\t\tgit checkout base -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout initial -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout picked -- foo &&\n"> <"\t\tgit ls-files --stage foo\n"> <"\t} > stages &&\n"> <"\tsed \"\n"> <"\t\t1 s/ 0\t/ 1\t/\n"> <"\t\t2 s/ 0\t/ 2\t/\n"> <"\t\t3 s/ 0\t/ 3\t/\n"> <"\t\" < stages > expected &&\n"> <"\tgit read-tree -u --reset HEAD &&\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tgit ls-files --stage --unmerged > actual &&\n"> <"\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick describes conflict in work tree">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t=======\n"> <"\tc\n"> <"\t>>>>>>> objid picked\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff3 -m style">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit config merge.conflictstyle diff3 &&\n"> <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t||||||| parent of objid picked\n"> <"\tb\n"> <"\t=======\n"> <"\tc\n"> <"\t>>>>>>> objid picked\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert also handles conflicts sanely">)} { (SQ <"\n"> <"\tgit config --unset merge.conflictstyle &&\n"> <"\tpristine_detach initial &&\n"> <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t=======\n"> <"\tb\n"> <"\t>>>>>>> parent of objid picked\n"> <"\tEOF\n"> <"\t{\n"> <"\t\tgit checkout picked -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout initial -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout base -- foo &&\n"> <"\t\tgit ls-files --stage foo\n"> <"\t} > stages &&\n"> <"\tsed \"\n"> <"\t\t1 s/ 0\t/ 1\t/\n"> <"\t\t2 s/ 0\t/ 2\t/\n"> <"\t\t3 s/ 0\t/ 3\t/\n"> <"\t\" < stages > expected-stages &&\n"> <"\tgit read-tree -u --reset HEAD &&\n"> <"\n"> <"\thead=$(git rev-parse HEAD) &&\n"> <"\ttest_must_fail git revert picked &&\n"> <"\tnewhead=$(git rev-parse HEAD) &&\n"> <"\tgit ls-files --stage --unmerged > actual-stages &&\n"> <"\n"> <"\ttest \"$head\" = \"$newhead\" &&\n"> <"\ttest_must_fail git update-index --refresh -q &&\n"> <"\ttest_must_fail git diff-index --exit-code HEAD &&\n"> <"\ttest_cmp expected-stages actual-stages &&\n"> <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed revert sets REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> <"\ttest_cmp_rev picked REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"successful revert does not set REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\tgit revert base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert --no-commit sets REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\tgit revert --no-commit base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_cmp_rev base REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert w/dirty tree does not set REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\techo foo > foo &&\n"> <"\ttest_must_fail git revert base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"GIT_CHERRY_PICK_HELP does not suppress REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t(\n"> <"\t\tGIT_CHERRY_PICK_HELP=\"and then do something else\" &&\n"> <"\t\tGIT_REVERT_HELP=\"and then do something else, again\" &&\n"> <"\t\texport GIT_CHERRY_PICK_HELP GIT_REVERT_HELP &&\n"> <"\t\ttest_must_fail git revert picked\n"> <"\t) &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_cmp_rev picked REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"git reset clears REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> <"\tgit reset &&\n"> <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed commit does not clear REVERT_HEAD">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> <"\ttest_must_fail git commit &&\n"> <"\ttest_cmp_rev picked REVERT_HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"revert conflict, diff3 -m style">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit config merge.conflictstyle diff3 &&\n"> <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t||||||| objid picked\n"> <"\tc\n"> <"\t=======\n"> <"\tb\n"> <"\t>>>>>>> parent of objid picked\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git revert picked &&\n"> <"\n"> <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"failed cherry-pick does not forget -s">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick -s picked &&\n"> <"\ttest_i18ngrep -e \"Signed-off-by\" .git/MERGE_MSG\n"> ) } ) (C {(test_expect_success)} {(SQ <"commit after failed cherry-pick does not add duplicated -s">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick -s picked-signed &&\n"> <"\tgit commit -a -s &&\n"> <"\ttest $(git show -s |grep -c \"Signed-off-by\") = 1\n"> ) } ) (C {(test_expect_success)} {(SQ <"commit after failed cherry-pick adds -s at the right place">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\tgit commit -a -s &&\n"> <"\n"> <"\t# Do S-o-b and Conflicts appear in the right order?\n"> <"\tcat <<-\\EOF >expect &&\n"> <"\tSigned-off-by: C O Mitter \n"> <"\t# Conflicts:\n"> <"\tEOF\n"> <"\tgrep -e \"^# Conflicts:\" -e "> ) (Lit_Other "^") (Signed-off-by) (SQ <" <.git/COMMIT_EDITMSG >actual &&\n"> <"\ttest_cmp expect actual &&\n"> <"\n"> <"\tcat <<-\\EOF >expected &&\n"> <"\tpicked\n"> <"\n"> <"\tSigned-off-by: C O Mitter \n"> <"\tEOF\n"> <"\n"> <"\tgit show -s --pretty=format:%B >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"commit --amend -s places the sign-off at the right place">)} { (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\t# emulate old-style conflicts block\n"> <"\tmv .git/MERGE_MSG .git/MERGE_MSG+ &&\n"> <"\tsed -e \"/^# Conflicts:/,\\$s/^# *//\" <.git/MERGE_MSG+ >.git/MERGE_MSG &&\n"> <"\n"> <"\tgit commit -a &&\n"> <"\tgit commit --amend -s &&\n"> <"\n"> <"\t# Do S-o-b and Conflicts appear in the right order?\n"> <"\tcat <<-\\EOF >expect &&\n"> <"\tSigned-off-by: C O Mitter \n"> <"\tConflicts:\n"> <"\tEOF\n"> <"\tgrep -e \"^Conflicts:\" -e "> ) (Lit_Other "^") (Signed-off-by) (SQ <" <.git/COMMIT_EDITMSG >actual &&\n"> <"\ttest_cmp expect actual\n">) } ) (C {(test_done)}) ] )