#!/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 || break done && test_tick && git commit -m Initial && git branch side && for f in text binary union do echo Master >>$f && git add $f || break done && test_tick && git commit -m Master && git checkout side && for f in text binary union do echo Side >>$f && git add $f || break 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 ' cat >./custom-merge <<\EOF #!/bin/sh orig="$1" ours="$2" theirs="$3" exit="$4" ( echo "orig is $orig" echo "ours is $ours" echo "theirs is $theirs" 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" && 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" && 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" && 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" && sed -e 1,3d $a >check-2 && cmp check-1 check-2 && rm -f $o $a $b ' test_done