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