Merge branch 'bc/clone-bare-with-conflicting-config'
[git] / t / t4048-diff-combined-binary.sh
1 #!/bin/sh
2
3 test_description='combined and merge diff handle binary files and textconv'
4 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
5 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
6
7 . ./test-lib.sh
8
9 test_expect_success 'setup binary merge conflict' '
10         echo oneQ1 | q_to_nul >binary &&
11         git add binary &&
12         git commit -m one &&
13         echo twoQ2 | q_to_nul >binary &&
14         git commit -a -m two &&
15         two=$(git rev-parse --short HEAD:binary) &&
16         git checkout -b branch-binary HEAD^ &&
17         echo threeQ3 | q_to_nul >binary &&
18         git commit -a -m three &&
19         three=$(git rev-parse --short HEAD:binary) &&
20         test_must_fail git merge main &&
21         echo resolvedQhooray | q_to_nul >binary &&
22         git commit -a -m resolved &&
23         res=$(git rev-parse --short HEAD:binary)
24 '
25
26 cat >expect <<EOF
27 resolved
28
29 diff --git a/binary b/binary
30 index $three..$res 100644
31 Binary files a/binary and b/binary differ
32 resolved
33
34 diff --git a/binary b/binary
35 index $two..$res 100644
36 Binary files a/binary and b/binary differ
37 EOF
38 test_expect_success 'diff -m indicates binary-ness' '
39         git show --format=%s -m >actual &&
40         test_cmp expect actual
41 '
42
43 cat >expect <<EOF
44 resolved
45
46 diff --combined binary
47 index $three,$two..$res
48 Binary files differ
49 EOF
50 test_expect_success 'diff -c indicates binary-ness' '
51         git show --format=%s -c >actual &&
52         test_cmp expect actual
53 '
54
55 cat >expect <<EOF
56 resolved
57
58 diff --cc binary
59 index $three,$two..$res
60 Binary files differ
61 EOF
62 test_expect_success 'diff --cc indicates binary-ness' '
63         git show --format=%s --cc >actual &&
64         test_cmp expect actual
65 '
66
67 test_expect_success 'setup non-binary with binary attribute' '
68         git checkout main &&
69         test_commit one text &&
70         test_commit two text &&
71         two=$(git rev-parse --short HEAD:text) &&
72         git checkout -b branch-text HEAD^ &&
73         test_commit three text &&
74         three=$(git rev-parse --short HEAD:text) &&
75         test_must_fail git merge main &&
76         test_commit resolved text &&
77         res=$(git rev-parse --short HEAD:text) &&
78         echo text -diff >.gitattributes
79 '
80
81 cat >expect <<EOF
82 resolved
83
84 diff --git a/text b/text
85 index $three..$res 100644
86 Binary files a/text and b/text differ
87 resolved
88
89 diff --git a/text b/text
90 index $two..$res 100644
91 Binary files a/text and b/text differ
92 EOF
93 test_expect_success 'diff -m respects binary attribute' '
94         git show --format=%s -m >actual &&
95         test_cmp expect actual
96 '
97
98 cat >expect <<EOF
99 resolved
100
101 diff --combined text
102 index $three,$two..$res
103 Binary files differ
104 EOF
105 test_expect_success 'diff -c respects binary attribute' '
106         git show --format=%s -c >actual &&
107         test_cmp expect actual
108 '
109
110 cat >expect <<EOF
111 resolved
112
113 diff --cc text
114 index $three,$two..$res
115 Binary files differ
116 EOF
117 test_expect_success 'diff --cc respects binary attribute' '
118         git show --format=%s --cc >actual &&
119         test_cmp expect actual
120 '
121
122 test_expect_success 'setup textconv attribute' '
123         echo "text diff=upcase" >.gitattributes &&
124         git config diff.upcase.textconv "tr a-z A-Z <"
125 '
126
127 cat >expect <<EOF
128 resolved
129
130 diff --git a/text b/text
131 index $three..$res 100644
132 --- a/text
133 +++ b/text
134 @@ -1 +1 @@
135 -THREE
136 +RESOLVED
137 resolved
138
139 diff --git a/text b/text
140 index $two..$res 100644
141 --- a/text
142 +++ b/text
143 @@ -1 +1 @@
144 -TWO
145 +RESOLVED
146 EOF
147 test_expect_success 'diff -m respects textconv attribute' '
148         git show --format=%s -m >actual &&
149         test_cmp expect actual
150 '
151
152 cat >expect <<EOF
153 resolved
154
155 diff --combined text
156 index $three,$two..$res
157 --- a/text
158 +++ b/text
159 @@@ -1,1 -1,1 +1,1 @@@
160 - THREE
161  -TWO
162 ++RESOLVED
163 EOF
164 test_expect_success 'diff -c respects textconv attribute' '
165         git show --format=%s -c >actual &&
166         test_cmp expect actual
167 '
168
169 cat >expect <<EOF
170 resolved
171
172 diff --cc text
173 index $three,$two..$res
174 --- a/text
175 +++ b/text
176 @@@ -1,1 -1,1 +1,1 @@@
177 - THREE
178  -TWO
179 ++RESOLVED
180 EOF
181 test_expect_success 'diff --cc respects textconv attribute' '
182         git show --format=%s --cc >actual &&
183         test_cmp expect actual
184 '
185
186 cat >expect <<EOF
187 diff --combined text
188 index $three,$two..$res
189 --- a/text
190 +++ b/text
191 @@@ -1,1 -1,1 +1,1 @@@
192 - three
193  -two
194 ++resolved
195 EOF
196 test_expect_success 'diff-tree plumbing does not respect textconv' '
197         git diff-tree HEAD -c -p >full &&
198         tail -n +2 full >actual &&
199         test_cmp expect actual
200 '
201
202 cat >expect <<EOF
203 diff --cc text
204 index $three,$two..0000000
205 --- a/text
206 +++ b/text
207 @@@ -1,1 -1,1 +1,5 @@@
208 ++<<<<<<< HEAD
209  +THREE
210 ++=======
211 + TWO
212 ++>>>>>>> MAIN
213 EOF
214 test_expect_success 'diff --cc respects textconv on worktree file' '
215         git reset --hard HEAD^ &&
216         test_must_fail git merge main &&
217         git diff >actual &&
218         test_cmp expect actual
219 '
220
221 test_done