Merge branch 'jc/hook-cleanup'
[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" >"$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\000' QN <"$2" >"$exp" &&
25         tr '\015\000' QN <"$3" >"$act" &&
26         test_cmp $exp $act &&
27         rm $exp $act
28 }
29
30 create_gitattributes () {
31         attr=$1
32         case "$attr" in
33                 auto)
34                 echo "*.txt text=auto" >.gitattributes
35                 ;;
36                 text)
37                 echo "*.txt text" >.gitattributes
38                 ;;
39                 -text)
40                 echo "*.txt -text" >.gitattributes
41                 ;;
42                 crlf)
43                 echo "*.txt eol=crlf" >.gitattributes
44                 ;;
45                 lf)
46                 echo "*.txt eol=lf" >.gitattributes
47                 ;;
48                 "")
49                 echo >.gitattributes
50                 ;;
51                 *)
52                 echo >&2 invalid attribute: $attr
53                 exit 1
54                 ;;
55         esac
56 }
57
58 create_file_in_repo () {
59         crlf=$1
60         attr=$2
61         create_gitattributes "$attr" &&
62         for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
63         do
64                 pfx=crlf_${crlf}_attr_${attr}_$f.txt &&
65                 cp $f $pfx && git -c core.autocrlf=$crlf add $pfx
66         done &&
67         git commit -m "core.autocrlf $crlf"
68 }
69
70 check_files_in_repo () {
71         crlf=$1
72         attr=$2
73         lfname=$3
74         crlfname=$4
75         lfmixcrlf=$5
76         lfmixcr=$6
77         crlfnul=$7
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
84 }
85
86
87 check_files_in_ws () {
88         eol=$1
89         crlf=$2
90         attr=$3
91         lfname=$4
92         crlfname=$5
93         lfmixcrlf=$6
94         lfmixcr=$7
95         crlfnul=$8
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
101         do
102                 rm $src$f.txt &&
103                 if test -z "$eol"; then
104                         git checkout $src$f.txt
105                 else
106                         git -c core.eol=$eol checkout $src$f.txt
107                 fi
108         done
109
110         test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF" "
111                 compare_ws_file $pfx $lfname    ${src}LF.txt
112         "
113         test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF" "
114                 compare_ws_file $pfx $crlfname  ${src}CRLF.txt
115         "
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
118         "
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
121         "
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
124         "
125 }
126
127 #######
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
140 '
141
142
143 test_expect_success 'create files' '
144         create_file_in_repo false "" &&
145         create_file_in_repo true  "" &&
146         create_file_in_repo input "" &&
147
148         create_file_in_repo false "auto" &&
149         create_file_in_repo true  "auto" &&
150         create_file_in_repo input "auto" &&
151
152         create_file_in_repo false "text" &&
153         create_file_in_repo true  "text" &&
154         create_file_in_repo input "text" &&
155
156         create_file_in_repo false "-text" &&
157         create_file_in_repo true  "-text" &&
158         create_file_in_repo input "-text" &&
159         rm -f *.txt &&
160         git reset --hard
161 '
162
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
167 '
168
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
173 '
174
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
179 '
180
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
185 '
186
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)
200
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
206 #                    eol     acrlf
207 #                                            ----------------------------------------------
208 #                                            What we want to have in the working tree:
209 if test_have_prereq MINGW
210 then
211 MIX_CRLF_LF=CRLF
212 MIX_LF_CR=CRLF_mix_CR
213 NL=CRLF
214 else
215 MIX_CRLF_LF=CRLF_mix_LF
216 MIX_LF_CR=LF_mix_CR
217 NL=LF
218 fi
219 export CRLF_MIX_LF_CR MIX NL
220
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
239
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
252
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
271
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
284
285 test_done