1#!/bin/sh23test_description='test cherry-pick and revert with conflicts45-6+ picked: rewrites foo to c7+ base: rewrites foo to b8+ initial: writes foo as a, unrelated as unrelated910'1112. ./test-lib.sh1314test_expect_success setup '1516echo unrelated >unrelated &&17git add unrelated &&18test_commit initial foo a &&19test_commit base foo b &&20test_commit picked foo c &&21git config advice.detachedhead false2223'2425test_expect_success 'failed cherry-pick does not advance HEAD' '2627git checkout -f initial^0 &&28git read-tree -u --reset HEAD &&29git clean -d -f -f -q -x &&3031git update-index --refresh &&32git diff-index --exit-code HEAD &&3334head=$(git rev-parse HEAD) &&35test_must_fail git cherry-pick picked &&36newhead=$(git rev-parse HEAD) &&3738test "$head" = "$newhead"39'4041test_expect_success 'failed cherry-pick produces dirty index' '4243git checkout -f initial^0 &&44git read-tree -u --reset HEAD &&45git clean -d -f -f -q -x &&4647git update-index --refresh &&48git diff-index --exit-code HEAD &&4950test_must_fail git cherry-pick picked &&5152test_must_fail git update-index --refresh -q &&53test_must_fail git diff-index --exit-code HEAD54'5556test_expect_success 'failed cherry-pick registers participants in index' '5758git read-tree -u --reset HEAD &&59git clean -d -f -f -q -x &&60{61git checkout base -- foo &&62git ls-files --stage foo &&63git checkout initial -- foo &&64git ls-files --stage foo &&65git checkout picked -- foo &&66git ls-files --stage foo67} > stages &&68sed "691 s/ 0 / 1 /702 s/ 0 / 2 /713 s/ 0 / 3 /72" < stages > expected &&73git checkout -f initial^0 &&7475git update-index --refresh &&76git diff-index --exit-code HEAD &&7778test_must_fail git cherry-pick picked &&79git ls-files --stage --unmerged > actual &&8081test_cmp expected actual82'8384test_expect_success 'failed cherry-pick describes conflict in work tree' '8586git checkout -f initial^0 &&87git read-tree -u --reset HEAD &&88git clean -d -f -f -q -x &&89cat <<-EOF > expected &&90<<<<<<< HEAD91a92=======93c94>>>>>>> objid picked95EOF9697git update-index --refresh &&98git diff-index --exit-code HEAD &&99100test_must_fail git cherry-pick picked &&101102sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&103test_cmp expected actual104'105106test_expect_success 'diff3 -m style' '107108git config merge.conflictstyle diff3 &&109git checkout -f initial^0 &&110git read-tree -u --reset HEAD &&111git clean -d -f -f -q -x &&112cat <<-EOF > expected &&113<<<<<<< HEAD114a115||||||| parent of objid picked116b117=======118c119>>>>>>> objid picked120EOF121122git update-index --refresh &&123git diff-index --exit-code HEAD &&124125test_must_fail git cherry-pick picked &&126127sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&128test_cmp expected actual129'130131test_expect_success 'revert also handles conflicts sanely' '132133git config --unset merge.conflictstyle &&134git read-tree -u --reset HEAD &&135git clean -d -f -f -q -x &&136cat <<-EOF > expected &&137<<<<<<< HEAD138a139=======140b141>>>>>>> parent of objid picked142EOF143{144git checkout picked -- foo &&145git ls-files --stage foo &&146git checkout initial -- foo &&147git ls-files --stage foo &&148git checkout base -- foo &&149git ls-files --stage foo150} > stages &&151sed "1521 s/ 0 / 1 /1532 s/ 0 / 2 /1543 s/ 0 / 3 /155" < stages > expected-stages &&156git checkout -f initial^0 &&157158git update-index --refresh &&159git diff-index --exit-code HEAD &&160161head=$(git rev-parse HEAD) &&162test_must_fail git revert picked &&163newhead=$(git rev-parse HEAD) &&164git ls-files --stage --unmerged > actual-stages &&165166test "$head" = "$newhead" &&167test_must_fail git update-index --refresh -q &&168test_must_fail git diff-index --exit-code HEAD &&169test_cmp expected-stages actual-stages &&170sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&171test_cmp expected actual172'173174test_expect_success 'revert conflict, diff3 -m style' '175git config merge.conflictstyle diff3 &&176git checkout -f initial^0 &&177git read-tree -u --reset HEAD &&178git clean -d -f -f -q -x &&179cat <<-EOF > expected &&180<<<<<<< HEAD181a182||||||| objid picked183c184=======185b186>>>>>>> parent of objid picked187EOF188189git update-index --refresh &&190git diff-index --exit-code HEAD &&191192test_must_fail git revert picked &&193194sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&195test_cmp expected actual196'197198test_done