5babb5bdb3
The process spawned in the hook uses the test's trash directory as CWD. As long as it is alive, the directory cannot be removed on Windows. Although the test succeeds, the 'test_done' that follows produces an error message and leaves the trash directory around. Kill the process before the test case advances. Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
200 lines
4.0 KiB
Bash
Executable File
200 lines
4.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2007 Junio C Hamano
|
|
#
|
|
|
|
test_description='per path merge controlled by merge attribute'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
|
|
for f in text binary union
|
|
do
|
|
echo Initial >$f && git add $f || return 1
|
|
done &&
|
|
test_tick &&
|
|
git commit -m Initial &&
|
|
|
|
git branch side &&
|
|
for f in text binary union
|
|
do
|
|
echo Master >>$f && git add $f || return 1
|
|
done &&
|
|
test_tick &&
|
|
git commit -m Master &&
|
|
|
|
git checkout side &&
|
|
for f in text binary union
|
|
do
|
|
echo Side >>$f && git add $f || return 1
|
|
done &&
|
|
test_tick &&
|
|
git commit -m Side &&
|
|
|
|
git tag anchor
|
|
'
|
|
|
|
test_expect_success merge '
|
|
|
|
{
|
|
echo "binary -merge"
|
|
echo "union merge=union"
|
|
} >.gitattributes &&
|
|
|
|
if git merge master
|
|
then
|
|
echo Gaah, should have conflicted
|
|
false
|
|
else
|
|
echo Ok, conflicted.
|
|
fi
|
|
'
|
|
|
|
test_expect_success 'check merge result in index' '
|
|
|
|
git ls-files -u | grep binary &&
|
|
git ls-files -u | grep text &&
|
|
! (git ls-files -u | grep union)
|
|
|
|
'
|
|
|
|
test_expect_success 'check merge result in working tree' '
|
|
|
|
git cat-file -p HEAD:binary >binary-orig &&
|
|
grep "<<<<<<<" text &&
|
|
cmp binary-orig binary &&
|
|
! grep "<<<<<<<" union &&
|
|
grep Master union &&
|
|
grep Side union
|
|
|
|
'
|
|
|
|
test_expect_success 'retry the merge with longer context' '
|
|
echo text conflict-marker-size=32 >>.gitattributes &&
|
|
git checkout -m text &&
|
|
sed -ne "/^\([<=>]\)\1\1\1*/{
|
|
s/ .*$//
|
|
p
|
|
}" >actual text &&
|
|
grep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&
|
|
grep "================================" actual &&
|
|
grep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual
|
|
'
|
|
|
|
cat >./custom-merge <<\EOF
|
|
#!/bin/sh
|
|
|
|
orig="$1" ours="$2" theirs="$3" exit="$4" path=$5
|
|
(
|
|
echo "orig is $orig"
|
|
echo "ours is $ours"
|
|
echo "theirs is $theirs"
|
|
echo "path is $path"
|
|
echo "=== orig ==="
|
|
cat "$orig"
|
|
echo "=== ours ==="
|
|
cat "$ours"
|
|
echo "=== theirs ==="
|
|
cat "$theirs"
|
|
) >"$ours+"
|
|
cat "$ours+" >"$ours"
|
|
rm -f "$ours+"
|
|
exit "$exit"
|
|
EOF
|
|
chmod +x ./custom-merge
|
|
|
|
test_expect_success 'custom merge backend' '
|
|
|
|
echo "* merge=union" >.gitattributes &&
|
|
echo "text merge=custom" >>.gitattributes &&
|
|
|
|
git reset --hard anchor &&
|
|
git config --replace-all \
|
|
merge.custom.driver "./custom-merge %O %A %B 0 %P" &&
|
|
git config --replace-all \
|
|
merge.custom.name "custom merge driver for testing" &&
|
|
|
|
git merge master &&
|
|
|
|
cmp binary union &&
|
|
sed -e 1,3d text >check-1 &&
|
|
o=$(git unpack-file master^:text) &&
|
|
a=$(git unpack-file side^:text) &&
|
|
b=$(git unpack-file master:text) &&
|
|
sh -c "./custom-merge $o $a $b 0 'text'" &&
|
|
sed -e 1,3d $a >check-2 &&
|
|
cmp check-1 check-2 &&
|
|
rm -f $o $a $b
|
|
'
|
|
|
|
test_expect_success 'custom merge backend' '
|
|
|
|
git reset --hard anchor &&
|
|
git config --replace-all \
|
|
merge.custom.driver "./custom-merge %O %A %B 1 %P" &&
|
|
git config --replace-all \
|
|
merge.custom.name "custom merge driver for testing" &&
|
|
|
|
if git merge master
|
|
then
|
|
echo "Eh? should have conflicted"
|
|
false
|
|
else
|
|
echo "Ok, conflicted"
|
|
fi &&
|
|
|
|
cmp binary union &&
|
|
sed -e 1,3d text >check-1 &&
|
|
o=$(git unpack-file master^:text) &&
|
|
a=$(git unpack-file anchor:text) &&
|
|
b=$(git unpack-file master:text) &&
|
|
sh -c "./custom-merge $o $a $b 0 'text'" &&
|
|
sed -e 1,3d $a >check-2 &&
|
|
cmp check-1 check-2 &&
|
|
sed -e 1,3d -e 4q $a >check-3 &&
|
|
echo "path is text" >expect &&
|
|
cmp expect check-3 &&
|
|
rm -f $o $a $b
|
|
'
|
|
|
|
test_expect_success 'up-to-date merge without common ancestor' '
|
|
test_create_repo repo1 &&
|
|
test_create_repo repo2 &&
|
|
test_tick &&
|
|
(
|
|
cd repo1 &&
|
|
>a &&
|
|
git add a &&
|
|
git commit -m initial
|
|
) &&
|
|
test_tick &&
|
|
(
|
|
cd repo2 &&
|
|
git commit --allow-empty -m initial
|
|
) &&
|
|
test_tick &&
|
|
(
|
|
cd repo1 &&
|
|
git fetch ../repo2 master &&
|
|
git merge --allow-unrelated-histories FETCH_HEAD
|
|
)
|
|
'
|
|
|
|
test_expect_success 'custom merge does not lock index' '
|
|
git reset --hard anchor &&
|
|
write_script sleep-one-second.sh <<-\EOF &&
|
|
sleep 1 &
|
|
echo $! >sleep.pid
|
|
EOF
|
|
test_when_finished "kill \$(cat sleep.pid)" &&
|
|
|
|
test_write_lines >.gitattributes \
|
|
"* merge=ours" "text merge=sleep-one-second" &&
|
|
test_config merge.ours.driver true &&
|
|
test_config merge.sleep-one-second.driver ./sleep-one-second.sh &&
|
|
git merge master
|
|
'
|
|
|
|
test_done
|