1#!/bin/sh
2
3test_description='CRLF conversion all combinations'
4
5. ./test-lib.sh
6
7if ! test_have_prereq EXPENSIVE
8then
9 skip_all="EXPENSIVE not set"
10 test_done
11fi
12
13
14compare_files()
15{
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
20}
21
22compare_ws_file()
23{
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
31}
32
33create_gitattributes()
34{
35 txtbin=$1
36 case "$txtbin" in
37 auto)
38 echo "*.txt text=auto" >.gitattributes
39 ;;
40 text)
41 echo "*.txt text" >.gitattributes
42 ;;
43 -text)
44 echo "*.txt -text" >.gitattributes
45 ;;
46 *)
47 echo >.gitattributes
48 ;;
49 esac
50}
51
52create_file_in_repo()
53{
54 crlf=$1
55 txtbin=$2
56 create_gitattributes "$txtbin" &&
57 for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
58 do
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"
63}
64
65check_files_in_repo()
66{
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
80}
81
82
83check_files_in_ws()
84{
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
98 do
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
104 fi
105 done
106
107
108 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=LF" "
109 compare_ws_file $pfx $lfname ${src}LF.txt
110 "
111 test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF" "
112 compare_ws_file $pfx $crlfname ${src}CRLF.txt
113 "
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
116 "
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
119 "
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
122 "
123}
124
125#######
126(
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
133EOF
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
141}
142
143test_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
154'
155# CRLF_nul had been created above
156
157test_expect_success 'create files' '
158 create_file_in_repo false "" &&
159 create_file_in_repo true "" &&
160 create_file_in_repo input "" &&
161
162 create_file_in_repo false "auto" &&
163 create_file_in_repo true "auto" &&
164 create_file_in_repo input "auto" &&
165
166 create_file_in_repo false "text" &&
167 create_file_in_repo true "text" &&
168 create_file_in_repo input "text" &&
169
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
175'
176
177test_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
181'
182
183test_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
187'
188
189test_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
193'
194
195test_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
199'
200
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)
213
214check_files_in_ws lf false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
215check_files_in_ws lf true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
216check_files_in_ws lf input "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
217
218check_files_in_ws lf false "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
219check_files_in_ws lf true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
220check_files_in_ws lf input "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
221
222check_files_in_ws lf false "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
223check_files_in_ws lf true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
224check_files_in_ws lf input "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
225
226check_files_in_ws lf false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
227check_files_in_ws lf true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
228check_files_in_ws lf input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
229
230###########
231#core.autocrlf=input is forbidden with core.eol=crlf
232check_files_in_ws crlf false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
233check_files_in_ws crlf true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
234
235check_files_in_ws crlf false "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
236check_files_in_ws crlf true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
237
238check_files_in_ws crlf false "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
239check_files_in_ws crlf true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
240
241check_files_in_ws crlf false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
242check_files_in_ws crlf true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
243
244if test_have_prereq MINGW
245then
246check_files_in_ws "" false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
247check_files_in_ws "" true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
248check_files_in_ws "" false "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
249check_files_in_ws "" true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
250check_files_in_ws "" false "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
251check_files_in_ws "" true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
252check_files_in_ws "" false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
253check_files_in_ws "" true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
254
255check_files_in_ws native false "" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
256check_files_in_ws native true "" CRLF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
257check_files_in_ws native false "auto" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
258check_files_in_ws native true "auto" CRLF CRLF CRLF LF_mix_CR CRLF_nul
259check_files_in_ws native false "text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
260check_files_in_ws native true "text" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul
261check_files_in_ws native false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
262check_files_in_ws native true "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
263fi
264
265test_done