Merge branch 'jc/sha1-name-more'
[git] / t / t3300-funny-names.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Junio C Hamano
4 #
5
6 test_description='Pathnames with funny characters.
7
8 This test tries pathnames with funny characters in the working
9 tree, index, and tree objects.
10 '
11
12 . ./test-lib.sh
13
14 p0='no-funny'
15 p1='tabs        ," (dq) and spaces'
16 p2='just space'
17
18 test_expect_success 'setup' '
19         cat >"$p0" <<-\EOF &&
20         1. A quick brown fox jumps over the lazy cat, oops dog.
21         2. A quick brown fox jumps over the lazy cat, oops dog.
22         3. A quick brown fox jumps over the lazy cat, oops dog.
23         EOF
24
25         { cat "$p0" >"$p1" || :; } &&
26         { echo "Foo Bar Baz" >"$p2" || :; } &&
27
28         if test -f "$p1" && cmp "$p0" "$p1"
29         then
30                 test_set_prereq TABS_IN_FILENAMES
31         fi
32 '
33
34 if ! test_have_prereq TABS_IN_FILENAMES
35 then
36         # since FAT/NTFS does not allow tabs in filenames, skip this test
37         skip_all='Your filesystem does not allow tabs in filenames'
38         test_done
39 fi
40
41 test_expect_success 'setup: populate index and tree' '
42         git update-index --add "$p0" "$p2" &&
43         t0=$(git write-tree)
44 '
45
46 test_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
52 test_expect_success 'setup: add funny filename' '
53         git update-index --add "$p1" &&
54         t1=$(git write-tree)
55 '
56
57 test_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
67 test_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_PATH" -pe "y/\000/\012/" <ls-files.z >current &&
75         test_cmp expected current
76 '
77
78 test_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
89 test_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
97 test_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
105 test_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_PATH" -pe "y/\000/\012/" <diff-index.z >current &&
112         test_cmp expected current
113 '
114
115 test_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_PATH" -pe y/\\000/\\012/ <diff-tree.z >current &&
122         test_cmp expected current
123 '
124
125 test_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
134 test_expect_success 'setup: remove unfunny index entry' '
135         git update-index --force-remove "$p0"
136 '
137
138 test_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
147 test_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
159 test_expect_success 'setup: mode change' '
160         chmod +x "$p1"
161 '
162
163 test_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
177 test_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_i18ncmp expected current
186 '
187
188 test_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
197 test_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
207 test_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
218 test_done