3 test_description
='CRLF conversion all combinations'
7 if ! test_have_prereq EXPENSIVE
9 skip_all
="EXPENSIVE not set"
14 tr '\015\000' QN
<"$1" >"$1".expect
&&
15 tr '\015\000' QN
<"$2" >"$2".actual
&&
16 test_cmp
"$1".expect
"$2".actual
&&
17 rm "$1".expect
"$2".actual
24 tr '\015\000' QN
<"$2" >"$exp" &&
25 tr '\015\000' QN
<"$3" >"$act" &&
30 create_gitattributes
() {
34 echo "*.txt text=auto" >.gitattributes
37 echo "*.txt text" >.gitattributes
40 echo "*.txt -text" >.gitattributes
43 echo "*.txt eol=crlf" >.gitattributes
46 echo "*.txt eol=lf" >.gitattributes
52 echo >&2 invalid attribute
: $attr
58 create_file_in_repo
() {
61 create_gitattributes
"$attr" &&
62 for f
in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
64 pfx
=crlf_
${crlf}_attr_
${attr}_
$f.txt
&&
65 cp $f $pfx && git
-c core.autocrlf
=$crlf add
$pfx
67 git commit
-m "core.autocrlf $crlf"
70 check_files_in_repo
() {
78 pfx
=crlf_
${crlf}_attr_
${attr}_
&&
79 compare_files
$lfname ${pfx}LF.txt
&&
80 compare_files
$crlfname ${pfx}CRLF.txt
&&
81 compare_files
$lfmixcrlf ${pfx}CRLF_mix_LF.txt
&&
82 compare_files
$lfmixcr ${pfx}LF_mix_CR.txt
&&
83 compare_files
$crlfnul ${pfx}CRLF_nul.txt
87 check_files_in_ws
() {
96 create_gitattributes
$attr &&
97 git config core.autocrlf
$crlf &&
98 pfx
=eol_
${eol}_crlf_${crlf}_attr_${attr}_
&&
99 src
=crlf_false_attr__
&&
100 for f
in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
103 if test -z "$eol"; then
104 git checkout
$src$f.txt
106 git
-c core.eol
=$eol checkout
$src$f.txt
110 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF" "
111 compare_ws_file $pfx $lfname ${src}LF.txt
113 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF" "
114 compare_ws_file $pfx $crlfname ${src}CRLF.txt
116 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_mix_LF" "
117 compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt
119 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF_mix_CR" "
120 compare_ws_file $pfx $lfmixcr ${src}LF_mix_CR.txt
122 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_nul" "
123 compare_ws_file $pfx $crlfnul ${src}CRLF_nul.txt
128 test_expect_success
'setup master' '
129 echo >.gitattributes &&
130 git checkout -b master &&
131 git add .gitattributes &&
132 git commit -m "add .gitattributes" "" &&
133 printf "line1\nline2\nline3" >LF &&
134 printf "line1\r\nline2\r\nline3" >CRLF &&
135 printf "line1\r\nline2\nline3" >CRLF_mix_LF &&
136 printf "line1\nline2\rline3" >LF_mix_CR &&
137 printf "line1\r\nline2\rline3" >CRLF_mix_CR &&
138 printf "line1Q\r\nline2\r\nline3" | q_to_nul >CRLF_nul &&
139 printf "line1Q\nline2\nline3" | q_to_nul >LF_nul
143 test_expect_success
'create files' '
144 create_file_in_repo false "" &&
145 create_file_in_repo true "" &&
146 create_file_in_repo input "" &&
148 create_file_in_repo false "auto" &&
149 create_file_in_repo true "auto" &&
150 create_file_in_repo input "auto" &&
152 create_file_in_repo false "text" &&
153 create_file_in_repo true "text" &&
154 create_file_in_repo input "text" &&
156 create_file_in_repo false "-text" &&
157 create_file_in_repo true "-text" &&
158 create_file_in_repo input "-text" &&
163 test_expect_success
'commit empty gitattribues' '
164 check_files_in_repo false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
165 check_files_in_repo true "" LF LF LF LF_mix_CR CRLF_nul &&
166 check_files_in_repo input "" LF LF LF LF_mix_CR CRLF_nul
169 test_expect_success
'commit text=auto' '
170 check_files_in_repo false "auto" LF LF LF LF_mix_CR CRLF_nul &&
171 check_files_in_repo true "auto" LF LF LF LF_mix_CR CRLF_nul &&
172 check_files_in_repo input "auto" LF LF LF LF_mix_CR CRLF_nul
175 test_expect_success
'commit text' '
176 check_files_in_repo false "text" LF LF LF LF_mix_CR LF_nul &&
177 check_files_in_repo true "text" LF LF LF LF_mix_CR LF_nul &&
178 check_files_in_repo input "text" LF LF LF LF_mix_CR LF_nul
181 test_expect_success
'commit -text' '
182 check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
183 check_files_in_repo true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
184 check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
187 ################################################################################
188 # Check how files in the repo are changed when they are checked out
189 # How to read the table below:
190 # - check_files_in_ws will check multiple files with a combination of settings
191 # and attributes (core.autocrlf=input is forbidden with core.eol=crlf)
192 # - parameter $1 : core.eol lf | crlf
193 # - parameter $2 : core.autocrlf false | true | input
194 # - parameter $3 : text in .gitattributs "" (empty) | auto | text | -text
195 # - parameter $4 : reference for a file with only LF in the repo
196 # - parameter $5 : reference for a file with only CRLF in the repo
197 # - parameter $6 : reference for a file with mixed LF and CRLF in the repo
198 # - parameter $7 : reference for a file with LF and CR in the repo (does somebody uses this ?)
199 # - parameter $8 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
201 # What we have in the repo:
202 # ----------------- EOL in repo ----------------
203 # LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
204 # settings with checkout:
205 # core. core. .gitattr
207 # ----------------------------------------------
208 # What we want to have in the working tree:
209 if test_have_prereq MINGW
212 MIX_LF_CR
=CRLF_mix_CR
215 MIX_CRLF_LF
=CRLF_mix_LF
219 export CRLF_MIX_LF_CR MIX NL
221 check_files_in_ws lf false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
222 check_files_in_ws lf true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
223 check_files_in_ws lf input
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
224 check_files_in_ws lf false
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
225 check_files_in_ws lf true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
226 check_files_in_ws lf input
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
227 check_files_in_ws lf false
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
228 check_files_in_ws lf true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
229 check_files_in_ws lf input
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
230 check_files_in_ws lf false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
231 check_files_in_ws lf true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
232 check_files_in_ws lf input
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
233 check_files_in_ws lf false
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
234 check_files_in_ws lf true
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
235 check_files_in_ws lf input
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
236 check_files_in_ws lf false
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
237 check_files_in_ws lf true
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
238 check_files_in_ws lf input
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
240 check_files_in_ws crlf false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
241 check_files_in_ws crlf true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
242 check_files_in_ws crlf false
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
243 check_files_in_ws crlf true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
244 check_files_in_ws crlf false
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
245 check_files_in_ws crlf true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
246 check_files_in_ws crlf false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
247 check_files_in_ws crlf true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
248 check_files_in_ws crlf false
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
249 check_files_in_ws crlf true
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
250 check_files_in_ws crlf false
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
251 check_files_in_ws crlf true
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
253 check_files_in_ws
"" false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
254 check_files_in_ws
"" true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
255 check_files_in_ws
"" input
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
256 check_files_in_ws
"" false
"auto" $NL CRLF
$MIX_CRLF_LF LF_mix_CR CRLF_nul
257 check_files_in_ws
"" true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
258 check_files_in_ws
"" input
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
259 check_files_in_ws
"" false
"text" $NL CRLF
$MIX_CRLF_LF $MIX_LF_CR CRLF_nul
260 check_files_in_ws
"" true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
261 check_files_in_ws
"" input
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
262 check_files_in_ws
"" false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
263 check_files_in_ws
"" true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
264 check_files_in_ws
"" input
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
265 check_files_in_ws
"" false
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
266 check_files_in_ws
"" true
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
267 check_files_in_ws
"" input
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
268 check_files_in_ws
"" false
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
269 check_files_in_ws
"" true
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
270 check_files_in_ws
"" input
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
272 check_files_in_ws native false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
273 check_files_in_ws native true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
274 check_files_in_ws native false
"auto" $NL CRLF
$MIX_CRLF_LF LF_mix_CR CRLF_nul
275 check_files_in_ws native true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
276 check_files_in_ws native false
"text" $NL CRLF
$MIX_CRLF_LF $MIX_LF_CR CRLF_nul
277 check_files_in_ws native true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
278 check_files_in_ws native false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
279 check_files_in_ws native true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
280 check_files_in_ws native false
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
281 check_files_in_ws native true
"lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
282 check_files_in_ws native false
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
283 check_files_in_ws native true
"crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul