]> git.ipfire.org Git - thirdparty/git.git/blob - t/t0027-auto-crlf.sh
convert: unify the "auto" handling of CRLF
[thirdparty/git.git] / t / t0027-auto-crlf.sh
1 #!/bin/sh
2
3 test_description='CRLF conversion all combinations'
4
5 . ./test-lib.sh
6
7 if ! test_have_prereq EXPENSIVE
8 then
9 skip_all="EXPENSIVE not set"
10 test_done
11 fi
12
13 compare_files () {
14 tr '\015\000' QN <"$1" >"$1".expect &&
15 tr '\015\000' QN <"$2" | tr -d 'Z' >"$2".actual &&
16 test_cmp "$1".expect "$2".actual &&
17 rm "$1".expect "$2".actual
18 }
19
20 compare_ws_file () {
21 pfx=$1
22 exp=$2.expect
23 act=$pfx.actual.$3
24 tr '\015\000abcdef0123456789' QN00000000000000000 <"$2" >"$exp" &&
25 tr '\015\000abcdef0123456789' QN00000000000000000 <"$3" >"$act" &&
26 test_cmp "$exp" "$act" &&
27 rm "$exp" "$act"
28 }
29
30 create_gitattributes () {
31 {
32 while test "$#" != 0
33 do
34 case "$1" in
35 auto) echo '*.txt text=auto' ;;
36 ident) echo '*.txt ident' ;;
37 text) echo '*.txt text' ;;
38 -text) echo '*.txt -text' ;;
39 crlf) echo '*.txt eol=crlf' ;;
40 lf) echo '*.txt eol=lf' ;;
41 "") ;;
42 *)
43 echo >&2 invalid attribute: "$1"
44 exit 1
45 ;;
46 esac &&
47 shift
48 done
49 } >.gitattributes
50 }
51
52 create_NNO_files () {
53 for crlf in false true input
54 do
55 for attr in "" auto text -text
56 do
57 for aeol in "" lf crlf
58 do
59 pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
60 cp CRLF_mix_LF ${pfx}_LF.txt &&
61 cp CRLF_mix_LF ${pfx}_CRLF.txt &&
62 cp CRLF_mix_LF ${pfx}_CRLF_mix_LF.txt &&
63 cp CRLF_mix_LF ${pfx}_LF_mix_CR.txt &&
64 cp CRLF_mix_LF ${pfx}_CRLF_nul.txt
65 done
66 done
67 done
68 }
69
70 check_warning () {
71 case "$1" in
72 LF_CRLF) echo "warning: LF will be replaced by CRLF" >"$2".expect ;;
73 CRLF_LF) echo "warning: CRLF will be replaced by LF" >"$2".expect ;;
74 '') >"$2".expect ;;
75 *) echo >&2 "Illegal 1": "$1" ; return false ;;
76 esac
77 grep "will be replaced by" "$2" | sed -e "s/\(.*\) in [^ ]*$/\1/" | uniq >"$2".actual
78 test_cmp "$2".expect "$2".actual
79 }
80
81 commit_check_warn () {
82 crlf=$1
83 attr=$2
84 lfname=$3
85 crlfname=$4
86 lfmixcrlf=$5
87 lfmixcr=$6
88 crlfnul=$7
89 pfx=crlf_${crlf}_attr_${attr}
90 create_gitattributes "$attr" &&
91 for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul CRLF_nul
92 do
93 fname=${pfx}_$f.txt &&
94 cp $f $fname &&
95 git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err"
96 done &&
97 git commit -m "core.autocrlf $crlf" &&
98 check_warning "$lfname" ${pfx}_LF.err &&
99 check_warning "$crlfname" ${pfx}_CRLF.err &&
100 check_warning "$lfmixcrlf" ${pfx}_CRLF_mix_LF.err &&
101 check_warning "$lfmixcr" ${pfx}_LF_mix_CR.err &&
102 check_warning "$crlfnul" ${pfx}_CRLF_nul.err
103 }
104
105 commit_chk_wrnNNO () {
106 attr=$1 ; shift
107 aeol=$1 ; shift
108 crlf=$1 ; shift
109 lfwarn=$1 ; shift
110 crlfwarn=$1 ; shift
111 lfmixcrlf=$1 ; shift
112 lfmixcr=$1 ; shift
113 crlfnul=$1 ; shift
114 pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
115 #Commit files on top of existing file
116 create_gitattributes "$attr" $aeol &&
117 for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
118 do
119 fname=${pfx}_$f.txt &&
120 cp $f $fname &&
121 printf Z >>"$fname" &&
122 git -c core.autocrlf=$crlf add $fname 2>/dev/null &&
123 git -c core.autocrlf=$crlf commit -m "commit_$fname" $fname >"${pfx}_$f.err" 2>&1
124 done
125
126 test_expect_success "commit NNO files crlf=$crlf attr=$attr LF" '
127 check_warning "$lfwarn" ${pfx}_LF.err
128 '
129 test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF" '
130 check_warning "$crlfwarn" ${pfx}_CRLF.err
131 '
132
133 test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_mix_LF" '
134 check_warning "$lfmixcrlf" ${pfx}_CRLF_mix_LF.err
135 '
136
137 test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf LF_mix_cr" '
138 check_warning "$lfmixcr" ${pfx}_LF_mix_CR.err
139 '
140
141 test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_nul" '
142 check_warning "$crlfnul" ${pfx}_CRLF_nul.err
143 '
144 }
145
146 stats_ascii () {
147 case "$1" in
148 LF)
149 echo lf
150 ;;
151 CRLF)
152 echo crlf
153 ;;
154 CRLF_mix_LF)
155 echo mixed
156 ;;
157 LF_mix_CR|CRLF_nul|LF_nul|CRLF_mix_CR)
158 echo "-text"
159 ;;
160 *)
161 echo error_invalid $1
162 ;;
163 esac
164
165 }
166
167
168 # contruct the attr/ returned by git ls-files --eol
169 # Take none (=empty), one or two args
170 # convert.c: eol=XX overrides text=auto
171 attr_ascii () {
172 case $1,$2 in
173 -text,*) echo "-text" ;;
174 text,) echo "text" ;;
175 text,lf) echo "text eol=lf" ;;
176 text,crlf) echo "text eol=crlf" ;;
177 auto,) echo "text=auto" ;;
178 auto,lf) echo "text=auto eol=lf" ;;
179 auto,crlf) echo "text=auto eol=crlf" ;;
180 lf,) echo "text eol=lf" ;;
181 crlf,) echo "text eol=crlf" ;;
182 ,) echo "" ;;
183 *) echo invalid_attr "$1,$2" ;;
184 esac
185 }
186
187 check_files_in_repo () {
188 crlf=$1
189 attr=$2
190 lfname=$3
191 crlfname=$4
192 lfmixcrlf=$5
193 lfmixcr=$6
194 crlfnul=$7
195 pfx=crlf_${crlf}_attr_${attr}_ &&
196 compare_files $lfname ${pfx}LF.txt &&
197 compare_files $crlfname ${pfx}CRLF.txt &&
198 compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt &&
199 compare_files $lfmixcr ${pfx}LF_mix_CR.txt &&
200 compare_files $crlfnul ${pfx}CRLF_nul.txt
201 }
202
203 check_in_repo_NNO () {
204 attr=$1 ; shift
205 aeol=$1 ; shift
206 crlf=$1 ; shift
207 lfname=$1 ; shift
208 crlfname=$1 ; shift
209 lfmixcrlf=$1 ; shift
210 lfmixcr=$1 ; shift
211 crlfnul=$1 ; shift
212 pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
213 test_expect_success "compare_files $lfname ${pfx}_LF.txt" '
214 compare_files $lfname ${pfx}_LF.txt
215 '
216 test_expect_success "compare_files $crlfname ${pfx}_CRLF.txt" '
217 compare_files $crlfname ${pfx}_CRLF.txt
218 '
219 test_expect_success "compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt" '
220 compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt
221 '
222 test_expect_success "compare_files $lfmixcr ${pfx}_LF_mix_CR.txt" '
223 compare_files $lfmixcr ${pfx}_LF_mix_CR.txt
224 '
225 test_expect_success "compare_files $crlfnul ${pfx}_CRLF_nul.txt" '
226 compare_files $crlfnul ${pfx}_CRLF_nul.txt
227 '
228 }
229
230 checkout_files () {
231 attr=$1 ; shift
232 ident=$1; shift
233 aeol=$1 ; shift
234 crlf=$1 ; shift
235 ceol=$1 ; shift
236 lfname=$1 ; shift
237 crlfname=$1 ; shift
238 lfmixcrlf=$1 ; shift
239 lfmixcr=$1 ; shift
240 crlfnul=$1 ; shift
241 create_gitattributes "$attr" $ident $aeol &&
242 git config core.autocrlf $crlf &&
243 pfx=eol_${ceol}_crlf_${crlf}_attr_${attr}_ &&
244 for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul
245 do
246 rm crlf_false_attr__$f.txt &&
247 if test -z "$ceol"; then
248 git checkout crlf_false_attr__$f.txt
249 else
250 git -c core.eol=$ceol checkout crlf_false_attr__$f.txt
251 fi
252 done
253
254 test_expect_success "ls-files --eol attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol" '
255 test_when_finished "rm expect actual" &&
256 sort <<-EOF >expect &&
257 i/crlf w/$(stats_ascii $crlfname) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF.txt
258 i/mixed w/$(stats_ascii $lfmixcrlf) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF_mix_LF.txt
259 i/lf w/$(stats_ascii $lfname) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF.txt
260 i/-text w/$(stats_ascii $lfmixcr) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF_mix_CR.txt
261 i/-text w/$(stats_ascii $crlfnul) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF_nul.txt
262 i/-text w/$(stats_ascii $crlfnul) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF_nul.txt
263 EOF
264 git ls-files --eol crlf_false_attr__* |
265 sed -e "s/ / /g" -e "s/ */ /g" |
266 sort >actual &&
267 test_cmp expect actual
268 '
269 test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF" "
270 compare_ws_file $pfx $lfname crlf_false_attr__LF.txt
271 "
272 test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF" "
273 compare_ws_file $pfx $crlfname crlf_false_attr__CRLF.txt
274 "
275 test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF_mix_LF" "
276 compare_ws_file $pfx $lfmixcrlf crlf_false_attr__CRLF_mix_LF.txt
277 "
278 test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_mix_CR" "
279 compare_ws_file $pfx $lfmixcr crlf_false_attr__LF_mix_CR.txt
280 "
281 test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_nul" "
282 compare_ws_file $pfx $crlfnul crlf_false_attr__LF_nul.txt
283 "
284 }
285
286 # Test control characters
287 # NUL SOH CR EOF==^Z
288 test_expect_success 'ls-files --eol -o Text/Binary' '
289 test_when_finished "rm expect actual TeBi_*" &&
290 STRT=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA &&
291 STR=$STRT$STRT$STRT$STRT &&
292 printf "${STR}BBB\001" >TeBi_127_S &&
293 printf "${STR}BBBB\001">TeBi_128_S &&
294 printf "${STR}BBB\032" >TeBi_127_E &&
295 printf "\032${STR}BBB" >TeBi_E_127 &&
296 printf "${STR}BBBB\000">TeBi_128_N &&
297 printf "${STR}BBB\012">TeBi_128_L &&
298 printf "${STR}BBB\015">TeBi_127_C &&
299 printf "${STR}BB\015\012" >TeBi_126_CL &&
300 printf "${STR}BB\015\012\015" >TeBi_126_CLC &&
301 sort <<-\EOF >expect &&
302 i/ w/-text TeBi_127_S
303 i/ w/none TeBi_128_S
304 i/ w/none TeBi_127_E
305 i/ w/-text TeBi_E_127
306 i/ w/-text TeBi_128_N
307 i/ w/lf TeBi_128_L
308 i/ w/-text TeBi_127_C
309 i/ w/crlf TeBi_126_CL
310 i/ w/-text TeBi_126_CLC
311 EOF
312 git ls-files --eol -o |
313 sed -n -e "/TeBi_/{s!attr/[ ]*!!g
314 s! ! !g
315 s! *! !g
316 p
317 }" | sort >actual &&
318 test_cmp expect actual
319 '
320
321 test_expect_success 'setup master' '
322 echo >.gitattributes &&
323 git checkout -b master &&
324 git add .gitattributes &&
325 git commit -m "add .gitattributes" "" &&
326 printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\nLINETWO\nLINETHREE" >LF &&
327 printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONE\r\nLINETWO\r\nLINETHREE" >CRLF &&
328 printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\r\nLINETWO\nLINETHREE" >CRLF_mix_LF &&
329 printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\nLINETWO\rLINETHREE" >LF_mix_CR &&
330 printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONE\r\nLINETWO\rLINETHREE" >CRLF_mix_CR &&
331 printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONEQ\r\nLINETWO\r\nLINETHREE" | q_to_nul >CRLF_nul &&
332 printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONEQ\nLINETWO\nLINETHREE" | q_to_nul >LF_nul &&
333 create_NNO_files CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF &&
334 git -c core.autocrlf=false add NNO_*.txt &&
335 git commit -m "mixed line endings" &&
336 test_tick
337 '
338
339
340
341 warn_LF_CRLF="LF will be replaced by CRLF"
342 warn_CRLF_LF="CRLF will be replaced by LF"
343
344 # WILC stands for "Warn if (this OS) converts LF into CRLF".
345 # WICL: Warn if CRLF becomes LF
346 # WAMIX: Mixed line endings: either CRLF->LF or LF->CRLF
347 if test_have_prereq NATIVE_CRLF
348 then
349 WILC=LF_CRLF
350 WICL=
351 WAMIX=LF_CRLF
352 else
353 WILC=
354 WICL=CRLF_LF
355 WAMIX=CRLF_LF
356 fi
357
358 # attr LF CRLF CRLFmixLF LFmixCR CRLFNUL
359 test_expect_success 'commit files empty attr' '
360 commit_check_warn false "" "" "" "" "" "" &&
361 commit_check_warn true "" "LF_CRLF" "" "LF_CRLF" "" "" &&
362 commit_check_warn input "" "" "CRLF_LF" "CRLF_LF" "" ""
363 '
364
365 test_expect_success 'commit files attr=auto' '
366 commit_check_warn false "auto" "$WILC" "$WICL" "$WAMIX" "" "" &&
367 commit_check_warn true "auto" "LF_CRLF" "" "LF_CRLF" "" "" &&
368 commit_check_warn input "auto" "" "CRLF_LF" "CRLF_LF" "" ""
369 '
370
371 test_expect_success 'commit files attr=text' '
372 commit_check_warn false "text" "$WILC" "$WICL" "$WAMIX" "$WILC" "$WICL" &&
373 commit_check_warn true "text" "LF_CRLF" "" "LF_CRLF" "LF_CRLF" "" &&
374 commit_check_warn input "text" "" "CRLF_LF" "CRLF_LF" "" "CRLF_LF"
375 '
376
377 test_expect_success 'commit files attr=-text' '
378 commit_check_warn false "-text" "" "" "" "" "" &&
379 commit_check_warn true "-text" "" "" "" "" "" &&
380 commit_check_warn input "-text" "" "" "" "" ""
381 '
382
383 test_expect_success 'commit files attr=lf' '
384 commit_check_warn false "lf" "" "CRLF_LF" "CRLF_LF" "" "CRLF_LF" &&
385 commit_check_warn true "lf" "" "CRLF_LF" "CRLF_LF" "" "CRLF_LF" &&
386 commit_check_warn input "lf" "" "CRLF_LF" "CRLF_LF" "" "CRLF_LF"
387 '
388
389 test_expect_success 'commit files attr=crlf' '
390 commit_check_warn false "crlf" "LF_CRLF" "" "LF_CRLF" "LF_CRLF" "" &&
391 commit_check_warn true "crlf" "LF_CRLF" "" "LF_CRLF" "LF_CRLF" "" &&
392 commit_check_warn input "crlf" "LF_CRLF" "" "LF_CRLF" "LF_CRLF" ""
393 '
394
395 # attr LF CRLF CRLFmixLF LF_mix_CR CRLFNUL
396 commit_chk_wrnNNO "" "" false "" "" "" "" ""
397 commit_chk_wrnNNO "" "" true LF_CRLF "" "" "" ""
398 commit_chk_wrnNNO "" "" input "" "" "" "" ""
399
400 commit_chk_wrnNNO "auto" "" false "$WILC" "" "" "" ""
401 commit_chk_wrnNNO "auto" "" true LF_CRLF "" "" "" ""
402 commit_chk_wrnNNO "auto" "" input "" "" "" "" ""
403 for crlf in true false input
404 do
405 commit_chk_wrnNNO -text "" $crlf "" "" "" "" ""
406 commit_chk_wrnNNO -text lf $crlf "" "" "" "" ""
407 commit_chk_wrnNNO -text crlf $crlf "" "" "" "" ""
408 commit_chk_wrnNNO "" lf $crlf "" CRLF_LF CRLF_LF "" CRLF_LF
409 commit_chk_wrnNNO "" crlf $crlf LF_CRLF "" LF_CRLF LF_CRLF ""
410 commit_chk_wrnNNO auto lf $crlf "" "" "" "" ""
411 commit_chk_wrnNNO auto crlf $crlf LF_CRLF "" "" "" ""
412 commit_chk_wrnNNO text lf $crlf "" CRLF_LF CRLF_LF "" CRLF_LF
413 commit_chk_wrnNNO text crlf $crlf LF_CRLF "" LF_CRLF LF_CRLF ""
414 done
415
416 commit_chk_wrnNNO "text" "" false "$WILC" "$WICL" "$WAMIX" "$WILC" "$WICL"
417 commit_chk_wrnNNO "text" "" true LF_CRLF "" LF_CRLF LF_CRLF ""
418 commit_chk_wrnNNO "text" "" input "" CRLF_LF CRLF_LF "" CRLF_LF
419
420 test_expect_success 'create files cleanup' '
421 rm -f *.txt &&
422 git -c core.autocrlf=false reset --hard
423 '
424
425 test_expect_success 'commit empty gitattribues' '
426 check_files_in_repo false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
427 check_files_in_repo true "" LF LF LF LF_mix_CR CRLF_nul &&
428 check_files_in_repo input "" LF LF LF LF_mix_CR CRLF_nul
429 '
430
431 test_expect_success 'commit text=auto' '
432 check_files_in_repo false "auto" LF LF LF LF_mix_CR CRLF_nul &&
433 check_files_in_repo true "auto" LF LF LF LF_mix_CR CRLF_nul &&
434 check_files_in_repo input "auto" LF LF LF LF_mix_CR CRLF_nul
435 '
436
437 test_expect_success 'commit text' '
438 check_files_in_repo false "text" LF LF LF LF_mix_CR LF_nul &&
439 check_files_in_repo true "text" LF LF LF LF_mix_CR LF_nul &&
440 check_files_in_repo input "text" LF LF LF LF_mix_CR LF_nul
441 '
442
443 test_expect_success 'commit -text' '
444 check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
445 check_files_in_repo true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
446 check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
447 '
448
449 for crlf in true false input
450 do
451 # attr aeol LF CRLF CRLF_mix_LF LF_mix_CR CRLFNUL
452 check_in_repo_NNO "" "" $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
453 check_in_repo_NNO -text "" $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
454 check_in_repo_NNO -text lf $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
455 check_in_repo_NNO -text crlf $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
456 check_in_repo_NNO auto "" $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
457 check_in_repo_NNO auto lf $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
458 check_in_repo_NNO auto crlf $crlf LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
459 check_in_repo_NNO text "" $crlf LF LF LF LF_mix_CR LF_nul
460 check_in_repo_NNO text lf $crlf LF LF LF LF_mix_CR LF_nul
461 check_in_repo_NNO text crlf $crlf LF LF LF LF_mix_CR LF_nul
462 done
463 ################################################################################
464 # Check how files in the repo are changed when they are checked out
465 # How to read the table below:
466 # - checkout_files will check multiple files with a combination of settings
467 # and attributes (core.autocrlf=input is forbidden with core.eol=crlf)
468 #
469 # - parameter $1 : text in .gitattributs "" (empty) | auto | text | -text
470 # - parameter $2 : ident "" | i (i == ident)
471 # - parameter $3 : eol in .gitattributs "" (empty) | lf | crlf
472 # - parameter $4 : core.autocrlf false | true | input
473 # - parameter $5 : core.eol "" | lf | crlf | "native"
474 # - parameter $6 : reference for a file with only LF in the repo
475 # - parameter $7 : reference for a file with only CRLF in the repo
476 # - parameter $8 : reference for a file with mixed LF and CRLF in the repo
477 # - parameter $9 : reference for a file with LF and CR in the repo
478 # - parameter $10 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
479
480 if test_have_prereq NATIVE_CRLF
481 then
482 MIX_CRLF_LF=CRLF
483 MIX_LF_CR=CRLF_mix_CR
484 NL=CRLF
485 LFNUL=CRLF_nul
486 else
487 MIX_CRLF_LF=CRLF_mix_LF
488 MIX_LF_CR=LF_mix_CR
489 NL=LF
490 LFNUL=LF_nul
491 fi
492 export CRLF_MIX_LF_CR MIX NL
493
494 # Same handling with and without ident
495 for id in "" ident
496 do
497 for ceol in lf crlf native
498 do
499 for crlf in true false input
500 do
501 # -text overrides core.autocrlf and core.eol
502 # text and eol=crlf or eol=lf override core.autocrlf and core.eol
503 checkout_files -text "$id" "" "$crlf" "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
504 checkout_files -text "$id" "lf" "$crlf" "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
505 checkout_files -text "$id" "crlf" "$crlf" "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
506 # text
507 checkout_files text "$id" "lf" "$crlf" "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
508 checkout_files text "$id" "crlf" "$crlf" "$ceol" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
509 # currently the same as text, eol=XXX
510 checkout_files auto "$id" "lf" "$crlf" "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
511 checkout_files auto "$id" "crlf" "$crlf" "$ceol" CRLF CRLF CRLF_mix_LF LF_mix_CR LF_nul
512 done
513
514 # core.autocrlf false, different core.eol
515 checkout_files "" "$id" "" false "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
516 # core.autocrlf true
517 checkout_files "" "$id" "" true "$ceol" CRLF CRLF CRLF_mix_LF LF_mix_CR LF_nul
518 # text: core.autocrlf = true overrides core.eol
519 checkout_files auto "$id" "" true "$ceol" CRLF CRLF CRLF_mix_LF LF_mix_CR LF_nul
520 checkout_files text "$id" "" true "$ceol" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
521 # text: core.autocrlf = input overrides core.eol
522 checkout_files text "$id" "" input "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
523 checkout_files auto "$id" "" input "$ceol" LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
524 # text=auto + eol=XXX
525 done
526 # text: core.autocrlf=false uses core.eol
527 checkout_files text "$id" "" false crlf CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
528 checkout_files text "$id" "" false lf LF CRLF CRLF_mix_LF LF_mix_CR LF_nul
529 # text: core.autocrlf=false and core.eol unset(or native) uses native eol
530 checkout_files text "$id" "" false "" $NL CRLF $MIX_CRLF_LF $MIX_LF_CR $LFNUL
531 checkout_files text "$id" "" false native $NL CRLF $MIX_CRLF_LF $MIX_LF_CR $LFNUL
532 # auto: core.autocrlf=false and core.eol unset(or native) uses native eol
533 checkout_files auto "$id" "" false "" $NL CRLF CRLF_mix_LF LF_mix_CR LF_nul
534 checkout_files auto "$id" "" false native $NL CRLF CRLF_mix_LF LF_mix_CR LF_nul
535 done
536
537 # Should be the last test case: remove some files from the worktree
538 test_expect_success 'ls-files --eol -d -z' '
539 rm crlf_false_attr__CRLF.txt crlf_false_attr__CRLF_mix_LF.txt crlf_false_attr__LF.txt .gitattributes &&
540 cat >expect <<-\EOF &&
541 i/crlf w/ crlf_false_attr__CRLF.txt
542 i/lf w/ .gitattributes
543 i/lf w/ crlf_false_attr__LF.txt
544 i/mixed w/ crlf_false_attr__CRLF_mix_LF.txt
545 EOF
546 git ls-files --eol -d |
547 sed -e "s!attr/[^ ]*!!g" -e "s/ / /g" -e "s/ */ /g" |
548 sort >actual &&
549 test_cmp expect actual
550 '
551
552 test_done