Sync with v2.0.3
[git.git] / t / t0027-auto-crlf.sh
blob72dd3e8bb4645a3c522e4c115c38a455dbe9c434
1 #!/bin/sh
3 test_description='CRLF conversion all combinations'
5 . ./test-lib.sh
7 if ! test_have_prereq EXPENSIVE
8 then
9 skip_all="EXPENSIVE not set"
10 test_done
14 compare_files()
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
22 compare_ws_file()
24 pfx=$1
25 exp=$2.expect
26 act=$pfx.actual.$3
27 od -c <"$2" >"$exp" &&
28 od -c <"$3" >"$act" &&
29 test_cmp $exp $act &&
30 rm $exp $act
33 create_gitattributes()
35 txtbin=$1
36 case "$txtbin" in
37 auto)
38 echo "*.txt text=auto" >.gitattributes
40 text)
41 echo "*.txt text" >.gitattributes
43 -text)
44 echo "*.txt -text" >.gitattributes
47 echo >.gitattributes
49 esac
52 create_file_in_repo()
54 crlf=$1
55 txtbin=$2
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
61 done &&
62 git commit -m "core.autocrlf $crlf"
65 check_files_in_repo()
67 crlf=$1
68 txtbin=$2
69 lfname=$3
70 crlfname=$4
71 lfmixcrlf=$5
72 lfmixcr=$6
73 crlfnul=$7
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
83 check_files_in_ws()
85 eol=$1
86 crlf=$2
87 txtbin=$3
88 lfname=$4
89 crlfname=$5
90 lfmixcrlf=$6
91 lfmixcr=$7
92 crlfnul=$8
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
99 rm $src$f.txt &&
100 if test -z "$eol"; then
101 git checkout $src$f.txt
102 else
103 git -c core.eol=$eol checkout $src$f.txt
105 done
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
125 #######
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
131 0000020 i n e 3
132 0000024
134 od -c CRLF_nul | sed -e "s/[ ][ ]*/ /g" -e "s/ *$//" >actual
135 test_cmp expect actual &&
136 rm expect actual
137 ) || {
138 skip_all="od not found or od -c not usable"
139 exit 0
140 test_done
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" &&
173 rm -f *.txt &&
174 git reset --hard
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
230 ###########
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
245 then
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
265 test_done