3 # Copyright (c) 2007 Junio C Hamano
6 test_description='per path merge controlled by merge attribute'
10 test_expect_success setup '
12 for f in text binary union
14 echo Initial >$f && git add $f || return 1
17 git commit -m Initial &&
20 for f in text binary union
22 echo Master >>$f && git add $f || return 1
25 git commit -m Master &&
28 for f in text binary union
30 echo Side >>$f && git add $f || return 1
37 cat >./custom-merge <<-\EOF &&
40 orig="$1" ours="$2" theirs="$3" exit="$4" path=$5
44 echo "theirs is $theirs"
57 chmod +x ./custom-merge
60 test_expect_success merge '
64 echo "union merge=union"
69 echo Gaah, should have conflicted
76 test_expect_success 'check merge result in index' '
78 git ls-files -u | grep binary &&
79 git ls-files -u | grep text &&
80 ! (git ls-files -u | grep union)
84 test_expect_success 'check merge result in working tree' '
86 git cat-file -p HEAD:binary >binary-orig &&
87 grep "<<<<<<<" text &&
88 cmp binary-orig binary &&
89 ! grep "<<<<<<<" union &&
95 test_expect_success 'retry the merge with longer context' '
96 echo text conflict-marker-size=32 >>.gitattributes &&
97 git checkout -m text &&
98 sed -ne "/^\([<=>]\)\1\1\1*/{
102 grep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&
103 grep "================================" actual &&
104 grep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual
107 test_expect_success 'custom merge backend' '
109 echo "* merge=union" >.gitattributes &&
110 echo "text merge=custom" >>.gitattributes &&
112 git reset --hard anchor &&
113 git config --replace-all \
114 merge.custom.driver "./custom-merge %O %A %B 0 %P" &&
115 git config --replace-all \
116 merge.custom.name "custom merge driver for testing" &&
121 sed -e 1,3d text >check-1 &&
122 o=$(git unpack-file master^:text) &&
123 a=$(git unpack-file side^:text) &&
124 b=$(git unpack-file master:text) &&
125 sh -c "./custom-merge $o $a $b 0 'text'" &&
126 sed -e 1,3d $a >check-2 &&
127 cmp check-1 check-2 &&
131 test_expect_success 'custom merge backend' '
133 git reset --hard anchor &&
134 git config --replace-all \
135 merge.custom.driver "./custom-merge %O %A %B 1 %P" &&
136 git config --replace-all \
137 merge.custom.name "custom merge driver for testing" &&
141 echo "Eh? should have conflicted"
144 echo "Ok, conflicted"
148 sed -e 1,3d text >check-1 &&
149 o=$(git unpack-file master^:text) &&
150 a=$(git unpack-file anchor:text) &&
151 b=$(git unpack-file master:text) &&
152 sh -c "./custom-merge $o $a $b 0 'text'" &&
153 sed -e 1,3d $a >check-2 &&
154 cmp check-1 check-2 &&
155 sed -e 1,3d -e 4q $a >check-3 &&
156 echo "path is text" >expect &&
157 cmp expect check-3 &&
161 test_expect_success 'up-to-date merge without common ancestor' '
162 test_create_repo repo1 &&
163 test_create_repo repo2 &&
169 git commit -m initial
174 git commit --allow-empty -m initial
179 git fetch ../repo2 master &&
180 git merge --allow-unrelated-histories FETCH_HEAD
184 test_expect_success 'custom merge does not lock index' '
185 git reset --hard anchor &&
186 write_script sleep-an-hour.sh <<-\EOF &&
191 test_write_lines >.gitattributes \
192 "* merge=ours" "text merge=sleep-an-hour" &&
193 test_config merge.ours.driver true &&
194 test_config merge.sleep-an-hour.driver ./sleep-an-hour.sh &&
196 # We are testing that the custom merge driver does not block
197 # index.lock on Windows due to an inherited file handle.
198 # To ensure that the backgrounded process ran sufficiently
199 # long (and has been started in the first place), we do not
200 # ignore the result of the kill command.
201 # By packaging the command in test_when_finished, we get both
202 # the correctness check and the clean-up.
203 test_when_finished "kill \$(cat sleep.pid)" &&