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