Sync with 2.44.1
[git/gitster.git] / t / t3300-funny-names.sh
blobd3ac826283e1a16315bb158754224067d5b0afe4
1 #!/bin/sh
3 # Copyright (c) 2005 Junio C Hamano
6 test_description='Pathnames with funny characters.
8 This test tries pathnames with funny characters in the working
9 tree, index, and tree objects.
12 TEST_PASSES_SANITIZE_LEAK=true
13 . ./test-lib.sh
15 HT=' '
17 test_have_prereq MINGW ||
18 echo 2>/dev/null > "Name with an${HT}HT"
19 if ! test -f "Name with an${HT}HT"
20 then
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
26 p0='no-funny'
27 p1='tabs ," (dq) and spaces'
28 p2='just space'
30 test_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
37 { cat "$p0" >"$p1" || :; } &&
38 { echo "Foo Bar Baz" >"$p2" || :; }
41 test_expect_success 'setup: populate index and tree' '
42 git update-index --add "$p0" "$p2" &&
43 t0=$(git write-tree)
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
52 test_expect_success 'setup: add funny filename' '
53 git update-index --add "$p1" &&
54 t1=$(git write-tree)
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
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 -pe "y/\000/\012/" <ls-files.z >current &&
75 test_cmp expected current
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
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
97 test_expect_success 'diff-tree --name-status quotes funny filename' '
98 cat >expected <<-\EOF &&
99 A "tabs\t,\" (dq) and spaces"
101 git diff-tree --name-status $t0 $t1 >current &&
102 test_cmp expected current
105 test_expect_success 'diff-index -z does not quote funny filename' '
106 cat >expected <<-\EOF &&
108 tabs ," (dq) and spaces
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
115 test_expect_success 'diff-tree -z does not quote funny filename' '
116 cat >expected <<-\EOF &&
118 tabs ," (dq) and spaces
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
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"
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
134 test_expect_success 'setup: remove unfunny index entry' '
135 git update-index --force-remove "$p0"
138 test_expect_success 'diff-tree -M quotes funny filename' '
139 cat >expected <<-\EOF &&
140 RNUM no-funny "tabs\t,\" (dq) and spaces"
142 git diff-index -M --name-status $t0 >out &&
143 sed -e "s/^R[0-9]*/RNUM/" <out >current &&
144 test_cmp expected current
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"
154 git diff-index -M -p $t0 >diff &&
155 sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
156 test_cmp expected current
159 test_expect_success 'setup: mode change' '
160 chmod +x "$p1"
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"
172 git diff-index -M -p $t0 >diff &&
173 sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
174 test_cmp expected current
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(-)
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
188 test_expect_success 'numstat for rename quotes funny filename' '
189 cat >expected <<-\EOF &&
190 0 0 "tabs\t,\" (dq) and spaces"
192 git diff-index -M -p $t0 >diff &&
193 git apply --numstat <diff >current &&
194 test_cmp expected current
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"
202 git diff-index -p $t0 >diff &&
203 git apply --numstat <diff >current &&
204 test_cmp expected current
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"
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
218 test_done