3 test_description='CRLF conversion all combinations'
7 if ! test_have_prereq EXPENSIVE
9 skip_all="EXPENSIVE not set"
14 tr '\015\000' QN <"$1" >"$1".expect &&
15 tr '\015\000' QN <"$2" >"$2".actual &&
16 test_cmp "$1".expect "$2".actual &&
17 rm "$1".expect "$2".actual
24 tr '\015\000' QN <"$2" >"$exp" &&
25 tr '\015\000' QN <"$3" >"$act" &&
30 create_gitattributes () {
34 echo "*.txt text=auto" >.gitattributes
37 echo "*.txt text" >.gitattributes
40 echo "*.txt -text" >.gitattributes
43 echo "*.txt eol=crlf" >.gitattributes
46 echo "*.txt eol=lf" >.gitattributes
52 echo >&2 invalid attribute: $attr
58 create_file_in_repo () {
61 create_gitattributes "$attr" &&
62 for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
64 pfx=crlf_${crlf}_attr_${attr}_$f.txt &&
65 cp $f $pfx && git -c core.autocrlf=$crlf add $pfx
67 git commit -m "core.autocrlf $crlf"
70 check_files_in_repo () {
78 pfx=crlf_${crlf}_attr_${attr}_ &&
79 compare_files $lfname ${pfx}LF.txt &&
80 compare_files $crlfname ${pfx}CRLF.txt &&
81 compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt &&
82 compare_files $lfmixcr ${pfx}LF_mix_CR.txt &&
83 compare_files $crlfnul ${pfx}CRLF_nul.txt
87 check_files_in_ws () {
96 create_gitattributes $attr &&
97 git config core.autocrlf $crlf &&
98 pfx=eol_${eol}_crlf_${crlf}_attr_${attr}_ &&
99 src=crlf_false_attr__ &&
100 for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
103 if test -z "$eol"; then
104 git checkout $src$f.txt
106 git -c core.eol=$eol checkout $src$f.txt
110 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF" "
111 compare_ws_file $pfx $lfname ${src}LF.txt
113 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF" "
114 compare_ws_file $pfx $crlfname ${src}CRLF.txt
116 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_mix_LF" "
117 compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt
119 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF_mix_CR" "
120 compare_ws_file $pfx $lfmixcr ${src}LF_mix_CR.txt
122 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_nul" "
123 compare_ws_file $pfx $crlfnul ${src}CRLF_nul.txt
128 test_expect_success 'setup master' '
129 echo >.gitattributes &&
130 git checkout -b master &&
131 git add .gitattributes &&
132 git commit -m "add .gitattributes" "" &&
133 printf "line1\nline2\nline3" >LF &&
134 printf "line1\r\nline2\r\nline3" >CRLF &&
135 printf "line1\r\nline2\nline3" >CRLF_mix_LF &&
136 printf "line1\nline2\rline3" >LF_mix_CR &&
137 printf "line1\r\nline2\rline3" >CRLF_mix_CR &&
138 printf "line1Q\r\nline2\r\nline3" | q_to_nul >CRLF_nul &&
139 printf "line1Q\nline2\nline3" | q_to_nul >LF_nul
143 test_expect_success 'create files' '
144 create_file_in_repo false "" &&
145 create_file_in_repo true "" &&
146 create_file_in_repo input "" &&
148 create_file_in_repo false "auto" &&
149 create_file_in_repo true "auto" &&
150 create_file_in_repo input "auto" &&
152 create_file_in_repo false "text" &&
153 create_file_in_repo true "text" &&
154 create_file_in_repo input "text" &&
156 create_file_in_repo false "-text" &&
157 create_file_in_repo true "-text" &&
158 create_file_in_repo input "-text" &&
163 test_expect_success 'commit empty gitattribues' '
164 check_files_in_repo false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
165 check_files_in_repo true "" LF LF LF LF_mix_CR CRLF_nul &&
166 check_files_in_repo input "" LF LF LF LF_mix_CR CRLF_nul
169 test_expect_success 'commit text=auto' '
170 check_files_in_repo false "auto" LF LF LF LF_mix_CR CRLF_nul &&
171 check_files_in_repo true "auto" LF LF LF LF_mix_CR CRLF_nul &&
172 check_files_in_repo input "auto" LF LF LF LF_mix_CR CRLF_nul
175 test_expect_success 'commit text' '
176 check_files_in_repo false "text" LF LF LF LF_mix_CR LF_nul &&
177 check_files_in_repo true "text" LF LF LF LF_mix_CR LF_nul &&
178 check_files_in_repo input "text" LF LF LF LF_mix_CR LF_nul
181 test_expect_success 'commit -text' '
182 check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
183 check_files_in_repo true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
184 check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
187 ################################################################################
188 # Check how files in the repo are changed when they are checked out
189 # How to read the table below:
190 # - check_files_in_ws will check multiple files with a combination of settings
191 # and attributes (core.autocrlf=input is forbidden with core.eol=crlf)
192 # - parameter $1 : core.eol lf | crlf
193 # - parameter $2 : core.autocrlf false | true | input
194 # - parameter $3 : text in .gitattributs "" (empty) | auto | text | -text
195 # - parameter $4 : reference for a file with only LF in the repo
196 # - parameter $5 : reference for a file with only CRLF in the repo
197 # - parameter $6 : reference for a file with mixed LF and CRLF in the repo
198 # - parameter $7 : reference for a file with LF and CR in the repo (does somebody uses this ?)
199 # - parameter $8 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
201 # What we have in the repo:
202 # ----------------- EOL in repo ----------------
203 # LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
204 # settings with checkout:
205 # core. core. .gitattr
207 # ----------------------------------------------
208 # What we want to have in the working tree:
209 if test_have_prereq MINGW
212 MIX_LF_CR=CRLF_mix_CR
215 MIX_CRLF_LF=CRLF_mix_LF
219 export CRLF_MIX_LF_CR MIX NL
221 check_files_in_ws lf false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
222 check_files_in_ws lf true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
223 check_files_in_ws lf input "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
224 check_files_in_ws lf false "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
225 check_files_in_ws lf true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
226 check_files_in_ws lf input "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
227 check_files_in_ws lf false "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
228 check_files_in_ws lf true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
229 check_files_in_ws lf input "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
230 check_files_in_ws lf false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
231 check_files_in_ws lf true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
232 check_files_in_ws lf input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
233 check_files_in_ws lf false "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
234 check_files_in_ws lf true "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
235 check_files_in_ws lf input "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
236 check_files_in_ws lf false "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
237 check_files_in_ws lf true "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
238 check_files_in_ws lf input "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
240 check_files_in_ws crlf false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
241 check_files_in_ws crlf true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
242 check_files_in_ws crlf false "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
243 check_files_in_ws crlf true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
244 check_files_in_ws crlf false "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
245 check_files_in_ws crlf true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
246 check_files_in_ws crlf false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
247 check_files_in_ws crlf true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
248 check_files_in_ws crlf false "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
249 check_files_in_ws crlf true "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
250 check_files_in_ws crlf false "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
251 check_files_in_ws crlf true "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
253 check_files_in_ws "" false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
254 check_files_in_ws "" true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
255 check_files_in_ws "" input "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
256 check_files_in_ws "" false "auto" $NL CRLF $MIX_CRLF_LF LF_mix_CR CRLF_nul
257 check_files_in_ws "" true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
258 check_files_in_ws "" input "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
259 check_files_in_ws "" false "text" $NL CRLF $MIX_CRLF_LF $MIX_LF_CR CRLF_nul
260 check_files_in_ws "" true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
261 check_files_in_ws "" input "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
262 check_files_in_ws "" false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
263 check_files_in_ws "" true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
264 check_files_in_ws "" input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
265 check_files_in_ws "" false "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
266 check_files_in_ws "" true "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
267 check_files_in_ws "" input "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
268 check_files_in_ws "" false "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
269 check_files_in_ws "" true "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
270 check_files_in_ws "" input "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
272 check_files_in_ws native false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
273 check_files_in_ws native true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
274 check_files_in_ws native false "auto" $NL CRLF $MIX_CRLF_LF LF_mix_CR CRLF_nul
275 check_files_in_ws native true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
276 check_files_in_ws native false "text" $NL CRLF $MIX_CRLF_LF $MIX_LF_CR CRLF_nul
277 check_files_in_ws native true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
278 check_files_in_ws native false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
279 check_files_in_ws native true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
280 check_files_in_ws native false "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
281 check_files_in_ws native true "lf" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
282 check_files_in_ws native false "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
283 check_files_in_ws native true "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul