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