1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Junio C Hamano
4 #
6 test_description='per path merge controlled by merge attribute'
8 . ./test-lib.sh
10 test_expect_success setup '
12 for f in text binary union
13 do
14 echo Initial >$f && git add $f || break
15 done &&
16 test_tick &&
17 git commit -m Initial &&
19 git branch side &&
20 for f in text binary union
21 do
22 echo Master >>$f && git add $f || break
23 done &&
24 test_tick &&
25 git commit -m Master &&
27 git checkout side &&
28 for f in text binary union
29 do
30 echo Side >>$f && git add $f || break
31 done &&
32 test_tick &&
33 git commit -m Side &&
35 git tag anchor
36 '
38 test_expect_success merge '
40 {
41 echo "binary -merge"
42 echo "union merge=union"
43 } >.gitattributes &&
45 if git merge master
46 then
47 echo Gaah, should have conflicted
48 false
49 else
50 echo Ok, conflicted.
51 fi
52 '
54 test_expect_success 'check merge result in index' '
56 git ls-files -u | grep binary &&
57 git ls-files -u | grep text &&
58 ! (git ls-files -u | grep union)
60 '
62 test_expect_success 'check merge result in working tree' '
64 git cat-file -p HEAD:binary >binary-orig &&
65 grep "<<<<<<<" text &&
66 cmp binary-orig binary &&
67 ! grep "<<<<<<<" union &&
68 grep Master union &&
69 grep Side union
71 '
73 cat >./custom-merge <<\EOF
74 #!/bin/sh
76 orig="$1" ours="$2" theirs="$3" exit="$4"
77 (
78 echo "orig is $orig"
79 echo "ours is $ours"
80 echo "theirs is $theirs"
81 echo "=== orig ==="
82 cat "$orig"
83 echo "=== ours ==="
84 cat "$ours"
85 echo "=== theirs ==="
86 cat "$theirs"
87 ) >"$ours+"
88 cat "$ours+" >"$ours"
89 rm -f "$ours+"
90 exit "$exit"
91 EOF
92 chmod +x ./custom-merge
94 test_expect_success 'custom merge backend' '
96 echo "* merge=union" >.gitattributes &&
97 echo "text merge=custom" >>.gitattributes &&
99 git reset --hard anchor &&
100 git config --replace-all \
101 merge.custom.driver "./custom-merge %O %A %B 0" &&
102 git config --replace-all \
103 merge.custom.name "custom merge driver for testing" &&
105 git merge master &&
107 cmp binary union &&
108 sed -e 1,3d text >check-1 &&
109 o=$(git-unpack-file master^:text) &&
110 a=$(git-unpack-file side^:text) &&
111 b=$(git-unpack-file master:text) &&
112 sh -c "./custom-merge $o $a $b 0" &&
113 sed -e 1,3d $a >check-2 &&
114 cmp check-1 check-2 &&
115 rm -f $o $a $b
116 '
118 test_expect_success 'custom merge backend' '
120 git reset --hard anchor &&
121 git config --replace-all \
122 merge.custom.driver "./custom-merge %O %A %B 1" &&
123 git config --replace-all \
124 merge.custom.name "custom merge driver for testing" &&
126 if git merge master
127 then
128 echo "Eh? should have conflicted"
129 false
130 else
131 echo "Ok, conflicted"
132 fi &&
134 cmp binary union &&
135 sed -e 1,3d text >check-1 &&
136 o=$(git-unpack-file master^:text) &&
137 a=$(git-unpack-file anchor:text) &&
138 b=$(git-unpack-file master:text) &&
139 sh -c "./custom-merge $o $a $b 0" &&
140 sed -e 1,3d $a >check-2 &&
141 cmp check-1 check-2 &&
142 rm -f $o $a $b
143 '
145 test_expect_success 'up-to-date merge without common ancestor' '
146 test_create_repo repo1 &&
147 test_create_repo repo2 &&
148 test_tick &&
149 (
150 cd repo1 &&
151 >a &&
152 git add a &&
153 git commit -m initial
154 ) &&
155 test_tick &&
156 (
157 cd repo2 &&
158 git commit --allow-empty -m initial
159 ) &&
160 test_tick &&
161 (
162 cd repo1 &&
163 git pull ../repo2 master
164 )
165 '
167 test_done