3 test_description
='CRLF conversion all combinations'
7 if ! test_have_prereq EXPENSIVE
9 skip_all
="EXPENSIVE not set"
16 od -c <"$1" >"$1".expect
&&
17 od -c <"$2" >"$2".actual
&&
18 test_cmp
"$1".expect
"$2".actual
&&
19 rm "$1".expect
"$2".actual
27 od -c <"$2" >"$exp" &&
28 od -c <"$3" >"$act" &&
33 create_gitattributes
()
38 echo "*.txt text=auto" >.gitattributes
41 echo "*.txt text" >.gitattributes
44 echo "*.txt -text" >.gitattributes
56 create_gitattributes
"$txtbin" &&
57 for f
in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
59 pfx
=crlf_
${crlf}_attr_
${txtbin}_
$f.txt
&&
60 cp $f $pfx && git
-c core.autocrlf
=$crlf add
$pfx
62 git commit
-m "core.autocrlf $crlf"
74 pfx
=crlf_
${crlf}_attr_
${txtbin}_
&&
75 compare_files
$lfname ${pfx}LF.txt
&&
76 compare_files
$crlfname ${pfx}CRLF.txt
&&
77 compare_files
$lfmixcrlf ${pfx}CRLF_mix_LF.txt
&&
78 compare_files
$lfmixcr ${pfx}LF_mix_CR.txt
&&
79 compare_files
$crlfnul ${pfx}CRLF_nul.txt
93 create_gitattributes
$txtbin &&
94 git config core.autocrlf
$crlf &&
95 pfx
=eol_
${eol}_crlf_${crlf}_attr_${txtbin}_
&&
96 src
=crlf_false_attr__
&&
97 for f
in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
100 if test -z "$eol"; then
101 git checkout
$src$f.txt
103 git
-c core.eol
=$eol checkout
$src$f.txt
108 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=LF" "
109 compare_ws_file $pfx $lfname ${src}LF.txt
111 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF" "
112 compare_ws_file $pfx $crlfname ${src}CRLF.txt
114 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF_mix_LF" "
115 compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt
117 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=LF_mix_CR" "
118 compare_ws_file $pfx $lfmixcr ${src}LF_mix_CR.txt
120 test_expect_success
"checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF_nul" "
121 compare_ws_file $pfx $crlfnul ${src}CRLF_nul.txt
127 type od >/dev
/null
&&
128 printf "line1Q\r\nline2\r\nline3" | q_to_nul
>CRLF_nul
&&
129 cat >expect
<<-EOF &&
130 0000000 l i n e 1 \0 \r \n l i n e 2 \r \n l
134 od -c CRLF_nul |
sed -e "s/[ ][ ]*/ /g" -e "s/ *$//" >actual
135 test_cmp expect actual
&&
138 skip_all
="od not found or od -c not usable"
143 test_expect_success
'setup master' '
144 echo >.gitattributes &&
145 git checkout -b master &&
146 git add .gitattributes &&
147 git commit -m "add .gitattributes" "" &&
148 printf "line1\nline2\nline3" >LF &&
149 printf "line1\r\nline2\r\nline3" >CRLF &&
150 printf "line1\r\nline2\nline3" >CRLF_mix_LF &&
151 printf "line1\nline2\rline3" >LF_mix_CR &&
152 printf "line1\r\nline2\rline3" >CRLF_mix_CR &&
153 printf "line1Q\nline2\nline3" | q_to_nul >LF_nul
155 # CRLF_nul had been created above
157 test_expect_success
'create files' '
158 create_file_in_repo false "" &&
159 create_file_in_repo true "" &&
160 create_file_in_repo input "" &&
162 create_file_in_repo false "auto" &&
163 create_file_in_repo true "auto" &&
164 create_file_in_repo input "auto" &&
166 create_file_in_repo false "text" &&
167 create_file_in_repo true "text" &&
168 create_file_in_repo input "text" &&
170 create_file_in_repo false "-text" &&
171 create_file_in_repo true "-text" &&
172 create_file_in_repo input "-text" &&
177 test_expect_success
'commit empty gitattribues' '
178 check_files_in_repo false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
179 check_files_in_repo true "" LF LF LF LF_mix_CR CRLF_nul &&
180 check_files_in_repo input "" LF LF LF LF_mix_CR CRLF_nul
183 test_expect_success
'commit text=auto' '
184 check_files_in_repo false "auto" LF LF LF LF_mix_CR CRLF_nul &&
185 check_files_in_repo true "auto" LF LF LF LF_mix_CR CRLF_nul &&
186 check_files_in_repo input "auto" LF LF LF LF_mix_CR CRLF_nul
189 test_expect_success
'commit text' '
190 check_files_in_repo false "text" LF LF LF LF_mix_CR LF_nul &&
191 check_files_in_repo true "text" LF LF LF LF_mix_CR LF_nul &&
192 check_files_in_repo input "text" LF LF LF LF_mix_CR LF_nul
195 test_expect_success
'commit -text' '
196 check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
197 check_files_in_repo true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
198 check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
201 ################################################################################
202 # Check how files in the repo are changed when they are checked out
203 # How to read the table below:
204 # - check_files_in_ws will check multiple files, see below
205 # - parameter $1 : core.eol lf | crlf
206 # - parameter $2 : core.autocrlf false | true | input
207 # - parameter $3 : text in .gitattributs "" (empty) | auto | text | -text
208 # - parameter $4 : reference for a file with only LF in the repo
209 # - parameter $5 : reference for a file with only CRLF in the repo
210 # - parameter $6 : reference for a file with mixed LF and CRLF in the repo
211 # - parameter $7 : reference for a file with LF and CR in the repo (does somebody uses this ?)
212 # - parameter $8 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
214 check_files_in_ws lf false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
215 check_files_in_ws lf true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
216 check_files_in_ws lf input
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
218 check_files_in_ws lf false
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
219 check_files_in_ws lf true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
220 check_files_in_ws lf input
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
222 check_files_in_ws lf false
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
223 check_files_in_ws lf true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
224 check_files_in_ws lf input
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
226 check_files_in_ws lf false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
227 check_files_in_ws lf true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
228 check_files_in_ws lf input
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
231 #core.autocrlf=input is forbidden with core.eol=crlf
232 check_files_in_ws crlf false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
233 check_files_in_ws crlf true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
235 check_files_in_ws crlf false
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
236 check_files_in_ws crlf true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
238 check_files_in_ws crlf false
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
239 check_files_in_ws crlf true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
241 check_files_in_ws crlf false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
242 check_files_in_ws crlf true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
244 if test_have_prereq MINGW
246 check_files_in_ws
"" false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
247 check_files_in_ws
"" true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
248 check_files_in_ws
"" false
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
249 check_files_in_ws
"" true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
250 check_files_in_ws
"" false
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
251 check_files_in_ws
"" true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
252 check_files_in_ws
"" false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
253 check_files_in_ws
"" true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
255 check_files_in_ws native false
"" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
256 check_files_in_ws native true
"" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
257 check_files_in_ws native false
"auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
258 check_files_in_ws native true
"auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
259 check_files_in_ws native false
"text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
260 check_files_in_ws native true
"text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
261 check_files_in_ws native false
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
262 check_files_in_ws native true
"-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul