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