Merge branch 'ak/sh-setup-dot-source-i18n-fix'
[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>"${pfx}_$f.err"
123         done
124
125         test_expect_success "commit NNO files crlf=$crlf attr=$attr LF" '
126                 check_warning "$lfwarn" ${pfx}_LF.err
127         '
128         test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF" '
129                 check_warning "$crlfwarn" ${pfx}_CRLF.err
130         '
131
132         test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_mix_LF" '
133                 check_warning "$lfmixcrlf" ${pfx}_CRLF_mix_LF.err
134         '
135
136         test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf LF_mix_cr" '
137                 check_warning "$lfmixcr" ${pfx}_LF_mix_CR.err
138         '
139
140         test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_nul" '
141                 check_warning "$crlfnul" ${pfx}_CRLF_nul.err
142         '
143 }
144
145 stats_ascii () {
146         case "$1" in
147         LF)
148                 echo lf
149                 ;;
150         CRLF)
151                 echo crlf
152                 ;;
153         CRLF_mix_LF)
154                 echo mixed
155                 ;;
156         LF_mix_CR|CRLF_nul|LF_nul|CRLF_mix_CR)
157                 echo "-text"
158                 ;;
159         *)
160                 echo error_invalid $1
161                 ;;
162         esac
163
164 }
165
166
167 # contruct the attr/ returned by git ls-files --eol
168 # Take none (=empty), one or two args
169 # convert.c: eol=XX overrides text=auto
170 attr_ascii () {
171         case $1,$2 in
172         -text,*)   echo "-text" ;;
173         text,)     echo "text" ;;
174         text,lf)   echo "text eol=lf" ;;
175         text,crlf) echo "text eol=crlf" ;;
176         auto,)     echo "text=auto" ;;
177         auto,lf)   echo "text=auto eol=lf" ;;
178         auto,crlf) echo "text=auto eol=crlf" ;;
179         lf,)       echo "text eol=lf" ;;
180         crlf,)     echo "text eol=crlf" ;;
181         ,) echo "" ;;
182         *) echo invalid_attr "$1,$2" ;;
183         esac
184 }
185
186 check_files_in_repo () {
187         crlf=$1
188         attr=$2
189         lfname=$3
190         crlfname=$4
191         lfmixcrlf=$5
192         lfmixcr=$6
193         crlfnul=$7
194         pfx=crlf_${crlf}_attr_${attr}_ &&
195         compare_files $lfname ${pfx}LF.txt &&
196         compare_files $crlfname ${pfx}CRLF.txt &&
197         compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt &&
198         compare_files $lfmixcr ${pfx}LF_mix_CR.txt &&
199         compare_files $crlfnul ${pfx}CRLF_nul.txt
200 }
201
202 check_in_repo_NNO () {
203         attr=$1 ; shift
204         aeol=$1 ; shift
205         crlf=$1 ; shift
206         lfname=$1 ; shift
207         crlfname=$1 ; shift
208         lfmixcrlf=$1 ; shift
209         lfmixcr=$1 ; shift
210         crlfnul=$1 ; shift
211         pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
212         test_expect_success "compare_files $lfname ${pfx}_LF.txt" '
213                 compare_files $lfname ${pfx}_LF.txt
214         '
215         test_expect_success "compare_files $crlfname ${pfx}_CRLF.txt" '
216                 compare_files $crlfname ${pfx}_CRLF.txt
217         '
218         test_expect_success "compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt" '
219                 compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt
220         '
221         test_expect_success "compare_files $lfmixcr ${pfx}_LF_mix_CR.txt" '
222                 compare_files $lfmixcr ${pfx}_LF_mix_CR.txt
223         '
224         test_expect_success "compare_files $crlfnul ${pfx}_CRLF_nul.txt" '
225                 compare_files $crlfnul ${pfx}_CRLF_nul.txt
226         '
227 }
228
229 checkout_files () {
230         attr=$1 ; shift
231         ident=$1; shift
232         aeol=$1 ; shift
233         crlf=$1 ; shift
234         ceol=$1 ; shift
235         lfname=$1 ; shift
236         crlfname=$1 ; shift
237         lfmixcrlf=$1 ; shift
238         lfmixcr=$1 ; shift
239         crlfnul=$1 ; shift
240         create_gitattributes "$attr" $ident $aeol &&
241         git config core.autocrlf $crlf &&
242         pfx=eol_${ceol}_crlf_${crlf}_attr_${attr}_ &&
243         for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul
244         do
245                 rm crlf_false_attr__$f.txt &&
246                 if test -z "$ceol"; then
247                         git checkout crlf_false_attr__$f.txt
248                 else
249                         git -c core.eol=$ceol checkout crlf_false_attr__$f.txt
250                 fi
251         done
252
253         test_expect_success "ls-files --eol attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol" '
254                 test_when_finished "rm expect actual" &&
255                 sort <<-EOF >expect &&
256                 i/crlf w/$(stats_ascii $crlfname) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF.txt
257                 i/mixed w/$(stats_ascii $lfmixcrlf) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF_mix_LF.txt
258                 i/lf w/$(stats_ascii $lfname) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF.txt
259                 i/-text w/$(stats_ascii $lfmixcr) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF_mix_CR.txt
260                 i/-text w/$(stats_ascii $crlfnul) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF_nul.txt
261                 i/-text w/$(stats_ascii $crlfnul) attr/$(attr_ascii $attr $aeol) crlf_false_attr__LF_nul.txt
262                 EOF
263                 git ls-files --eol crlf_false_attr__* |
264                 sed -e "s/      / /g" -e "s/  */ /g" |
265                 sort >actual &&
266                 test_cmp expect actual
267         '
268         test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF" "
269                 compare_ws_file $pfx $lfname    crlf_false_attr__LF.txt
270         "
271         test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF" "
272                 compare_ws_file $pfx $crlfname  crlf_false_attr__CRLF.txt
273         "
274         test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF_mix_LF" "
275                 compare_ws_file $pfx $lfmixcrlf crlf_false_attr__CRLF_mix_LF.txt
276         "
277         test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_mix_CR" "
278                 compare_ws_file $pfx $lfmixcr   crlf_false_attr__LF_mix_CR.txt
279         "
280         test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_nul" "
281                 compare_ws_file $pfx $crlfnul   crlf_false_attr__LF_nul.txt
282         "
283 }
284
285 # Test control characters
286 # NUL SOH CR EOF==^Z
287 test_expect_success 'ls-files --eol -o Text/Binary' '
288         test_when_finished "rm expect actual TeBi_*" &&
289         STRT=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA &&
290         STR=$STRT$STRT$STRT$STRT &&
291         printf "${STR}BBB\001" >TeBi_127_S &&
292         printf "${STR}BBBB\001">TeBi_128_S &&
293         printf "${STR}BBB\032" >TeBi_127_E &&
294         printf "\032${STR}BBB" >TeBi_E_127 &&
295         printf "${STR}BBBB\000">TeBi_128_N &&
296         printf "${STR}BBB\012">TeBi_128_L &&
297         printf "${STR}BBB\015">TeBi_127_C &&
298         printf "${STR}BB\015\012" >TeBi_126_CL &&
299         printf "${STR}BB\015\012\015" >TeBi_126_CLC &&
300         sort <<-\EOF >expect &&
301         i/ w/-text TeBi_127_S
302         i/ w/none TeBi_128_S
303         i/ w/none TeBi_127_E
304         i/ w/-text TeBi_E_127
305         i/ w/-text TeBi_128_N
306         i/ w/lf TeBi_128_L
307         i/ w/-text TeBi_127_C
308         i/ w/crlf TeBi_126_CL
309         i/ w/-text TeBi_126_CLC
310         EOF
311         git ls-files --eol -o |
312         sed -n -e "/TeBi_/{s!attr/[     ]*!!g
313         s!      ! !g
314         s!  *! !g
315         p
316         }" | sort >actual &&
317         test_cmp expect actual
318 '
319
320 test_expect_success 'setup master' '
321         echo >.gitattributes &&
322         git checkout -b master &&
323         git add .gitattributes &&
324         git commit -m "add .gitattributes" "" &&
325         printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\nLINETWO\nLINETHREE"     >LF &&
326         printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONE\r\nLINETWO\r\nLINETHREE" >CRLF &&
327         printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\r\nLINETWO\nLINETHREE"   >CRLF_mix_LF &&
328         printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\nLINETWO\rLINETHREE"     >LF_mix_CR &&
329         printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONE\r\nLINETWO\rLINETHREE"   >CRLF_mix_CR &&
330         printf "\$Id: 0000000000000000000000000000000000000000 \$\r\nLINEONEQ\r\nLINETWO\r\nLINETHREE" | q_to_nul >CRLF_nul &&
331         printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONEQ\nLINETWO\nLINETHREE" | q_to_nul >LF_nul &&
332         create_NNO_files CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF &&
333         git -c core.autocrlf=false add NNO_*.txt &&
334         git commit -m "mixed line endings" &&
335         test_tick
336 '
337
338
339
340 warn_LF_CRLF="LF will be replaced by CRLF"
341 warn_CRLF_LF="CRLF will be replaced by LF"
342
343 # WILC stands for "Warn if (this OS) converts LF into CRLF".
344 # WICL: Warn if CRLF becomes LF
345 # WAMIX: Mixed line endings: either CRLF->LF or LF->CRLF
346 if test_have_prereq NATIVE_CRLF
347 then
348         WILC=LF_CRLF
349         WICL=
350         WAMIX=LF_CRLF
351 else
352         WILC=
353         WICL=CRLF_LF
354         WAMIX=CRLF_LF
355 fi
356
357 #                         attr   LF        CRLF      CRLFmixLF LFmixCR   CRLFNUL
358 test_expect_success 'commit files empty attr' '
359         commit_check_warn false ""     ""        ""        ""        ""        "" &&
360         commit_check_warn true  ""     "LF_CRLF" ""        "LF_CRLF" ""        "" &&
361         commit_check_warn input ""     ""        "CRLF_LF" "CRLF_LF" ""        ""
362 '
363
364 test_expect_success 'commit files attr=auto' '
365         commit_check_warn false "auto" "$WILC"   "$WICL"   "$WAMIX"  ""        "" &&
366         commit_check_warn true  "auto" "LF_CRLF" ""        "LF_CRLF" ""        "" &&
367         commit_check_warn input "auto" ""        "CRLF_LF" "CRLF_LF" ""        ""
368 '
369
370 test_expect_success 'commit files attr=text' '
371         commit_check_warn false "text" "$WILC"   "$WICL"   "$WAMIX"  "$WILC"   "$WICL"   &&
372         commit_check_warn true  "text" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""        &&
373         commit_check_warn input "text" ""        "CRLF_LF" "CRLF_LF" ""        "CRLF_LF"
374 '
375
376 test_expect_success 'commit files attr=-text' '
377         commit_check_warn false "-text" ""       ""        ""        ""        "" &&
378         commit_check_warn true  "-text" ""       ""        ""        ""        "" &&
379         commit_check_warn input "-text" ""       ""        ""        ""        ""
380 '
381
382 test_expect_success 'commit files attr=lf' '
383         commit_check_warn false "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
384         commit_check_warn true  "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
385         commit_check_warn input "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF"
386 '
387
388 test_expect_success 'commit files attr=crlf' '
389         commit_check_warn false "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "" &&
390         commit_check_warn true  "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "" &&
391         commit_check_warn input "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""
392 '
393
394 #                 attr                    LF        CRLF      CRLFmixLF   LF_mix_CR   CRLFNUL
395 commit_chk_wrnNNO ""      ""      false   ""        ""        ""          ""          ""
396 commit_chk_wrnNNO ""      ""      true    LF_CRLF   ""        ""          ""          ""
397 commit_chk_wrnNNO ""      ""      input   ""        ""        ""          ""          ""
398
399 commit_chk_wrnNNO "auto"  ""      false   "$WILC"   ""        ""          ""          ""
400 commit_chk_wrnNNO "auto"  ""      true    LF_CRLF   ""        ""          ""          ""
401 commit_chk_wrnNNO "auto"  ""      input   ""        ""        ""          ""          ""
402 for crlf in true false input
403 do
404         commit_chk_wrnNNO -text ""      $crlf   ""        ""        ""          ""          ""
405         commit_chk_wrnNNO -text lf      $crlf   ""        ""        ""          ""          ""
406         commit_chk_wrnNNO -text crlf    $crlf   ""        ""        ""          ""          ""
407         commit_chk_wrnNNO ""    lf      $crlf   ""       CRLF_LF    CRLF_LF      ""         CRLF_LF
408         commit_chk_wrnNNO ""    crlf    $crlf   LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
409         commit_chk_wrnNNO auto  lf      $crlf   ""        ""        ""          ""          ""
410         commit_chk_wrnNNO auto  crlf    $crlf   LF_CRLF   ""        ""          ""          ""
411         commit_chk_wrnNNO text  lf      $crlf   ""       CRLF_LF    CRLF_LF     ""          CRLF_LF
412         commit_chk_wrnNNO text  crlf    $crlf   LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
413 done
414
415 commit_chk_wrnNNO "text"  ""      false   "$WILC"   "$WICL"   "$WAMIX"    "$WILC"     "$WICL"
416 commit_chk_wrnNNO "text"  ""      true    LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
417 commit_chk_wrnNNO "text"  ""      input   ""        CRLF_LF   CRLF_LF     ""          CRLF_LF
418
419 test_expect_success 'commit NNO and cleanup' '
420         git commit -m "commit files on top of NNO" &&
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