1f35e55ee3be1b2bbdb8aa9f3248f6fe5ebf46cb
   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
  18test_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
  34if ! test_have_prereq TABS_IN_FILENAMES
  35then
  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
  39fi
  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_PATH" -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_PATH" -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_PATH" -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_i18ncmp 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