1#!/bin/sh
   2test_description='Various filesystem issues'
   4. ./test-lib.sh
   6auml=$(printf '\303\244')
   8aumlcdiar=$(printf '\141\314\210')
   9case_insensitive=
  11unibad=
  12no_symlinks=
  13test_expect_success 'see what we expect' '
  14        test_case=test_expect_success &&
  16        test_unicode=test_expect_success &&
  17        mkdir junk &&
  18        echo good >junk/CamelCase &&
  19        echo bad >junk/camelcase &&
  20        if test "$(cat junk/CamelCase)" != good
  21        then
  22                test_case=test_expect_failure &&
  23                case_insensitive=t
  24        fi &&
  25        rm -fr junk &&
  26        mkdir junk &&
  27        >junk/"$auml" &&
  28        case "$(cd junk && echo *)" in
  29        "$aumlcdiar")
  30                test_unicode=test_expect_failure &&
  31                unibad=t
  32                ;;
  33        *)      ;;
  34        esac &&
  35        rm -fr junk &&
  36        {
  37                ln -s x y 2> /dev/null &&
  38                test -h y 2> /dev/null ||
  39                no_symlinks=1 &&
  40                rm -f y
  41        }
  42'
  43test "$case_insensitive" &&
  45        say "will test on a case insensitive filesystem"
  46test "$unibad" &&
  47        say "will test on a unicode corrupting filesystem"
  48test "$no_symlinks" &&
  49        say "will test on a filesystem lacking symbolic links"
  50if test "$case_insensitive"
  52then
  53test_expect_success "detection of case insensitive filesystem during repo init" '
  54        test $(git config --bool core.ignorecase) = true
  56'
  57else
  58test_expect_success "detection of case insensitive filesystem during repo init" '
  59        test_must_fail git config --bool core.ignorecase >/dev/null ||
  61        test $(git config --bool core.ignorecase) = false
  62'
  63fi
  64if test "$no_symlinks"
  66then
  67test_expect_success "detection of filesystem w/o symlink support during repo init" '
  68        v=$(git config --bool core.symlinks) &&
  70        test "$v" = false
  71'
  72else
  73test_expect_success "detection of filesystem w/o symlink support during repo init" '
  74        test_must_fail git config --bool core.symlinks ||
  76        test "$(git config --bool core.symlinks)" = true
  77'
  78fi
  79test_expect_success "setup case tests" '
  81        git config core.ignorecase true &&
  83        touch camelcase &&
  84        git add camelcase &&
  85        git commit -m "initial" &&
  86        git tag initial &&
  87        git checkout -b topic &&
  88        git mv camelcase tmp &&
  89        git mv tmp CamelCase &&
  90        git commit -m "rename" &&
  91        git checkout -f master
  92'
  94$test_case 'rename (case change)' '
  96        git mv camelcase CamelCase &&
  98        git commit -m "rename"
  99'
 101$test_case 'merge (case change)' '
 103        rm -f CamelCase &&
 105        rm -f camelcase &&
 106        git reset --hard initial &&
 107        git merge topic
 108'
 110test_expect_failure 'add (with different case)' '
 114        git reset --hard initial &&
 116        rm camelcase &&
 117        echo 1 >CamelCase &&
 118        git add CamelCase &&
 119        camel=$(git ls-files | grep -i camelcase) &&
 120        test $(echo "$camel" | wc -l) = 1 &&
 121        test "z$(git cat-file blob :$camel)" = z1
 122'
 124test_expect_success "setup unicode normalization tests" '
 126  test_create_repo unicode &&
 128  cd unicode &&
 129  touch "$aumlcdiar" &&
 130  git add "$aumlcdiar" &&
 131  git commit -m initial &&
 132  git tag initial &&
 133  git checkout -b topic &&
 134  git mv $aumlcdiar tmp &&
 135  git mv tmp "$auml" &&
 136  git commit -m rename &&
 137  git checkout -f master
 138'
 140$test_unicode 'rename (silent unicode normalization)' '
 142 git mv "$aumlcdiar" "$auml" &&
 144 git commit -m rename
 145'
 147$test_unicode 'merge (silent unicode normalization)' '
 149 git reset --hard initial &&
 151 git merge topic
 152'
 154test_done