1#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano
4#
5
6test_description='Pathnames with funny characters.
7
8This test tries pathnames with funny characters in the working
9tree, index, and tree objects.
10'
11
12. ./test-lib.sh
13
14HT=' '
15
16test_have_prereq MINGW ||
17echo 2>/dev/null > "Name with an${HT}HT"
18if ! test -f "Name with an${HT}HT"
19then
20 # since FAT/NTFS does not allow tabs in filenames, skip this test
21 skip_all='Your filesystem does not allow tabs in filenames'
22 test_done
23fi
24
25p0='no-funny'
26p1='tabs ," (dq) and spaces'
27p2='just space'
28
29test_expect_success 'setup' '
30 cat >"$p0" <<-\EOF &&
31 1. A quick brown fox jumps over the lazy cat, oops dog.
32 2. A quick brown fox jumps over the lazy cat, oops dog.
33 3. A quick brown fox jumps over the lazy cat, oops dog.
34 EOF
35
36 { cat "$p0" >"$p1" || :; } &&
37 { echo "Foo Bar Baz" >"$p2" || :; }
38'
39
40test_expect_success 'setup: populate index and tree' '
41 git update-index --add "$p0" "$p2" &&
42 t0=$(git write-tree)
43'
44
45test_expect_success 'ls-files prints space in filename verbatim' '
46 printf "%s\n" "just space" no-funny >expected &&
47 git ls-files >current &&
48 test_cmp expected current
49'
50
51test_expect_success 'setup: add funny filename' '
52 git update-index --add "$p1" &&
53 t1=$(git write-tree)
54'
55
56test_expect_success 'ls-files quotes funny filename' '
57 cat >expected <<-\EOF &&
58 just space
59 no-funny
60 "tabs\t,\" (dq) and spaces"
61 EOF
62 git ls-files >current &&
63 test_cmp expected current
64'
65
66test_expect_success 'ls-files -z does not quote funny filename' '
67 cat >expected <<-\EOF &&
68 just space
69 no-funny
70 tabs ," (dq) and spaces
71 EOF
72 git ls-files -z >ls-files.z &&
73 perl -pe "y/\000/\012/" <ls-files.z >current &&
74 test_cmp expected current
75'
76
77test_expect_success 'ls-tree quotes funny filename' '
78 cat >expected <<-\EOF &&
79 just space
80 no-funny
81 "tabs\t,\" (dq) and spaces"
82 EOF
83 git ls-tree -r $t1 >ls-tree &&
84 sed -e "s/^[^ ]* //" <ls-tree >current &&
85 test_cmp expected current
86'
87
88test_expect_success 'diff-index --name-status quotes funny filename' '
89 cat >expected <<-\EOF &&
90 A "tabs\t,\" (dq) and spaces"
91 EOF
92 git diff-index --name-status $t0 >current &&
93 test_cmp expected current
94'
95
96test_expect_success 'diff-tree --name-status quotes funny filename' '
97 cat >expected <<-\EOF &&
98 A "tabs\t,\" (dq) and spaces"
99 EOF
100 git diff-tree --name-status $t0 $t1 >current &&
101 test_cmp expected current
102'
103
104test_expect_success 'diff-index -z does not quote funny filename' '
105 cat >expected <<-\EOF &&
106 A
107 tabs ," (dq) and spaces
108 EOF
109 git diff-index -z --name-status $t0 >diff-index.z &&
110 perl -pe "y/\000/\012/" <diff-index.z >current &&
111 test_cmp expected current
112'
113
114test_expect_success 'diff-tree -z does not quote funny filename' '
115 cat >expected <<-\EOF &&
116 A
117 tabs ," (dq) and spaces
118 EOF
119 git diff-tree -z --name-status $t0 $t1 >diff-tree.z &&
120 perl -pe y/\\000/\\012/ <diff-tree.z >current &&
121 test_cmp expected current
122'
123
124test_expect_success 'diff-tree --find-copies-harder quotes funny filename' '
125 cat >expected <<-\EOF &&
126 CNUM no-funny "tabs\t,\" (dq) and spaces"
127 EOF
128 git diff-tree -C --find-copies-harder --name-status $t0 $t1 >out &&
129 sed -e "s/^C[0-9]*/CNUM/" <out >current &&
130 test_cmp expected current
131'
132
133test_expect_success 'setup: remove unfunny index entry' '
134 git update-index --force-remove "$p0"
135'
136
137test_expect_success 'diff-tree -M quotes funny filename' '
138 cat >expected <<-\EOF &&
139 RNUM no-funny "tabs\t,\" (dq) and spaces"
140 EOF
141 git diff-index -M --name-status $t0 >out &&
142 sed -e "s/^R[0-9]*/RNUM/" <out >current &&
143 test_cmp expected current
144'
145
146test_expect_success 'diff-index -M -p quotes funny filename' '
147 cat >expected <<-\EOF &&
148 diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
149 similarity index NUM%
150 rename from no-funny
151 rename to "tabs\t,\" (dq) and spaces"
152 EOF
153 git diff-index -M -p $t0 >diff &&
154 sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
155 test_cmp expected current
156'
157
158test_expect_success 'setup: mode change' '
159 chmod +x "$p1"
160'
161
162test_expect_success 'diff-index -M -p with mode change quotes funny filename' '
163 cat >expected <<-\EOF &&
164 diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
165 old mode 100644
166 new mode 100755
167 similarity index NUM%
168 rename from no-funny
169 rename to "tabs\t,\" (dq) and spaces"
170 EOF
171 git diff-index -M -p $t0 >diff &&
172 sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
173 test_cmp expected current
174'
175
176test_expect_success 'diffstat for rename quotes funny filename' '
177 cat >expected <<-\EOF &&
178 "tabs\t,\" (dq) and spaces"
179 1 file changed, 0 insertions(+), 0 deletions(-)
180 EOF
181 git diff-index -M -p $t0 >diff &&
182 git apply --stat <diff >diffstat &&
183 sed -e "s/|.*//" -e "s/ *\$//" <diffstat >current &&
184 test_i18ncmp expected current
185'
186
187test_expect_success 'numstat for rename quotes funny filename' '
188 cat >expected <<-\EOF &&
189 0 0 "tabs\t,\" (dq) and spaces"
190 EOF
191 git diff-index -M -p $t0 >diff &&
192 git apply --numstat <diff >current &&
193 test_cmp expected current
194'
195
196test_expect_success 'numstat without -M quotes funny filename' '
197 cat >expected <<-\EOF &&
198 0 3 no-funny
199 3 0 "tabs\t,\" (dq) and spaces"
200 EOF
201 git diff-index -p $t0 >diff &&
202 git apply --numstat <diff >current &&
203 test_cmp expected current
204'
205
206test_expect_success 'numstat for non-git rename diff quotes funny filename' '
207 cat >expected <<-\EOF &&
208 0 3 no-funny
209 3 0 "tabs\t,\" (dq) and spaces"
210 EOF
211 git diff-index -p $t0 >git-diff &&
212 sed -ne "/^[-+@]/p" <git-diff >diff &&
213 git apply --numstat <diff >current &&
214 test_cmp expected current
215'
216
217test_done