Skip to content

Commit

Permalink
checkout -m path: fix recreating conflicts
Browse files Browse the repository at this point in the history
We should tell ll_merge() that the 3-way merge between stages #2 and #3 is
an outermost merge, not a virtual-ancestor creation.

Back when this code was originally written, users couldn't write custom
merge drivers easily, so the bug didn't matter, but these days it does.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Jan 6, 2010
1 parent 3273ebc commit 6d6f9ac
Showing 2 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion builtin-checkout.c
Original file line number Diff line number Diff line change
@@ -179,7 +179,7 @@ static int checkout_merged(int pos, struct checkout *state)
fill_mm(active_cache[pos+2]->sha1, &theirs);

status = ll_merge(&result_buf, path, &ancestor,
&ours, "ours", &theirs, "theirs", 1);
&ours, "ours", &theirs, "theirs", 0);
free(ancestor.ptr);
free(ours.ptr);
free(theirs.ptr);
57 changes: 57 additions & 0 deletions t/t7201-co.sh
Original file line number Diff line number Diff line change
@@ -534,4 +534,61 @@ test_expect_success 'failing checkout -b should not break working tree' '
'

(
echo "#!$SHELL_PATH"
cat <<\EOF
O=$1 A=$2 B=$3
cat "$A" >.tmp
exec >"$A"
echo '<<<<<<< filfre-theirs'
cat "$B"
echo '||||||| filfre-common'
cat "$O"
echo '======='
cat ".tmp"
echo '>>>>>>> filfre-ours'
rm -f .tmp
exit 1
EOF
) >filfre.sh
chmod +x filfre.sh

test_expect_success 'custom merge driver with checkout -m' '
git reset --hard &&
git config merge.filfre.driver "./filfre.sh %O %A %B" &&
git config merge.filfre.name "Feel-free merge driver" &&
git config merge.filfre.recursive binary &&
echo "arm merge=filfre" >.gitattributes &&
git checkout -b left &&
echo neutral >arm &&
git add arm .gitattributes &&
test_tick &&
git commit -m neutral &&
git branch right &&
echo left >arm &&
test_tick &&
git commit -a -m left &&
git checkout right &&
echo right >arm &&
test_tick &&
git commit -a -m right &&
test_must_fail git merge left &&
(
for t in filfre-common left right
do
grep $t arm || exit 1
done
exit 0
) &&
mv arm expect &&
git checkout -m arm &&
test_cmp expect arm
'

test_done

0 comments on commit 6d6f9ac

Please sign in to comment.