]> git.ipfire.org Git - thirdparty/git.git/blame - t/t6406-merge-attr.sh
Merge branch 'ea/blame-use-oideq'
[thirdparty/git.git] / t / t6406-merge-attr.sh
CommitLineData
47579efc
JH
1#!/bin/sh
2#
3# Copyright (c) 2007 Junio C Hamano
4#
5
6test_description='per path merge controlled by merge attribute'
7
8. ./test-lib.sh
9
10test_expect_success setup '
11
12 for f in text binary union
13 do
e6821d09 14 echo Initial >$f && git add $f || return 1
47579efc
JH
15 done &&
16 test_tick &&
17 git commit -m Initial &&
18
19 git branch side &&
20 for f in text binary union
21 do
e6821d09 22 echo Master >>$f && git add $f || return 1
47579efc
JH
23 done &&
24 test_tick &&
25 git commit -m Master &&
26
27 git checkout side &&
28 for f in text binary union
29 do
e6821d09 30 echo Side >>$f && git add $f || return 1
47579efc
JH
31 done &&
32 test_tick &&
f3ef6b6b 33 git commit -m Side &&
47579efc 34
42d180dd
EN
35 git tag anchor &&
36
37 cat >./custom-merge <<-\EOF &&
38 #!/bin/sh
39
40 orig="$1" ours="$2" theirs="$3" exit="$4" path=$5
41 (
42 echo "orig is $orig"
43 echo "ours is $ours"
44 echo "theirs is $theirs"
45 echo "path is $path"
46 echo "=== orig ==="
47 cat "$orig"
48 echo "=== ours ==="
49 cat "$ours"
50 echo "=== theirs ==="
51 cat "$theirs"
52 ) >"$ours+"
53 cat "$ours+" >"$ours"
54 rm -f "$ours+"
55 exit "$exit"
56 EOF
57 chmod +x ./custom-merge
47579efc
JH
58'
59
60test_expect_success merge '
61
62 {
63 echo "binary -merge"
64 echo "union merge=union"
65 } >.gitattributes &&
66
67 if git merge master
68 then
69 echo Gaah, should have conflicted
70 false
71 else
72 echo Ok, conflicted.
73 fi
74'
75
76test_expect_success 'check merge result in index' '
77
78 git ls-files -u | grep binary &&
79 git ls-files -u | grep text &&
80 ! (git ls-files -u | grep union)
81
82'
83
84test_expect_success 'check merge result in working tree' '
85
86 git cat-file -p HEAD:binary >binary-orig &&
87 grep "<<<<<<<" text &&
88 cmp binary-orig binary &&
89 ! grep "<<<<<<<" union &&
90 grep Master union &&
91 grep Side union
92
93'
94
4c734803
JH
95test_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*/{
99 s/ .*$//
100 p
101 }" >actual text &&
102 grep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&
103 grep "================================" actual &&
104 grep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual
105'
106
f3ef6b6b
JH
107test_expect_success 'custom merge backend' '
108
109 echo "* merge=union" >.gitattributes &&
110 echo "text merge=custom" >>.gitattributes &&
111
112 git reset --hard anchor &&
113 git config --replace-all \
ef45bb1f 114 merge.custom.driver "./custom-merge %O %A %B 0 %P" &&
153920da
JH
115 git config --replace-all \
116 merge.custom.name "custom merge driver for testing" &&
f3ef6b6b
JH
117
118 git merge master &&
119
120 cmp binary union &&
121 sed -e 1,3d text >check-1 &&
3604e7c5
NS
122 o=$(git unpack-file master^:text) &&
123 a=$(git unpack-file side^:text) &&
124 b=$(git unpack-file master:text) &&
c76b84a1 125 sh -c "./custom-merge $o $a $b 0 text" &&
f3ef6b6b
JH
126 sed -e 1,3d $a >check-2 &&
127 cmp check-1 check-2 &&
128 rm -f $o $a $b
129'
130
131test_expect_success 'custom merge backend' '
132
133 git reset --hard anchor &&
134 git config --replace-all \
ef45bb1f 135 merge.custom.driver "./custom-merge %O %A %B 1 %P" &&
153920da
JH
136 git config --replace-all \
137 merge.custom.name "custom merge driver for testing" &&
f3ef6b6b
JH
138
139 if git merge master
140 then
141 echo "Eh? should have conflicted"
142 false
143 else
144 echo "Ok, conflicted"
145 fi &&
146
147 cmp binary union &&
148 sed -e 1,3d text >check-1 &&
3604e7c5
NS
149 o=$(git unpack-file master^:text) &&
150 a=$(git unpack-file anchor:text) &&
151 b=$(git unpack-file master:text) &&
c76b84a1 152 sh -c "./custom-merge $o $a $b 0 text" &&
f3ef6b6b
JH
153 sed -e 1,3d $a >check-2 &&
154 cmp check-1 check-2 &&
ef45bb1f
JH
155 sed -e 1,3d -e 4q $a >check-3 &&
156 echo "path is text" >expect &&
157 cmp expect check-3 &&
f3ef6b6b
JH
158 rm -f $o $a $b
159'
160
42716660
MV
161test_expect_success 'up-to-date merge without common ancestor' '
162 test_create_repo repo1 &&
163 test_create_repo repo2 &&
164 test_tick &&
165 (
166 cd repo1 &&
167 >a &&
168 git add a &&
169 git commit -m initial
170 ) &&
171 test_tick &&
172 (
173 cd repo2 &&
174 git commit --allow-empty -m initial
175 ) &&
176 test_tick &&
177 (
178 cd repo1 &&
e379fdf3
JH
179 git fetch ../repo2 master &&
180 git merge --allow-unrelated-histories FETCH_HEAD
42716660
MV
181 )
182'
183
05d1ed61 184test_expect_success 'custom merge does not lock index' '
ad65f7e3 185 git reset --hard anchor &&
a7d6bcc3
JS
186 write_script sleep-an-hour.sh <<-\EOF &&
187 sleep 3600 &
5babb5bd 188 echo $! >sleep.pid
ad65f7e3
BW
189 EOF
190
191 test_write_lines >.gitattributes \
a7d6bcc3 192 "* merge=ours" "text merge=sleep-an-hour" &&
ad65f7e3 193 test_config merge.ours.driver true &&
a7d6bcc3 194 test_config merge.sleep-an-hour.driver ./sleep-an-hour.sh &&
fdf4f6c7
JS
195
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)" &&
3b03097d 204 git merge master
ad65f7e3
BW
205'
206
47579efc 207test_done