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