43957eae686203df6bda61a61fab791819b0804f
   1#!/bin/sh
   2
   3test_description=gitattributes
   4
   5. ./test-lib.sh
   6
   7attr_check () {
   8
   9        path="$1"
  10        expect="$2"
  11
  12        git check-attr test -- "$path" >actual 2>err &&
  13        echo "$path: test: $2" >expect &&
  14        test_cmp expect actual &&
  15        test_line_count = 0 err
  16
  17}
  18
  19
  20test_expect_success 'setup' '
  21
  22        mkdir -p a/b/d a/c &&
  23        (
  24                echo "[attr]notest !test"
  25                echo "f test=f"
  26                echo "a/i test=a/i"
  27                echo "onoff test -test"
  28                echo "offon -test test"
  29                echo "no notest"
  30        ) >.gitattributes &&
  31        (
  32                echo "g test=a/g" &&
  33                echo "b/g test=a/b/g"
  34        ) >a/.gitattributes &&
  35        (
  36                echo "h test=a/b/h" &&
  37                echo "d/* test=a/b/d/*"
  38                echo "d/yes notest"
  39        ) >a/b/.gitattributes &&
  40        (
  41                echo "global test=global"
  42        ) >"$HOME"/global-gitattributes &&
  43        cat <<EOF >expect-all
  44f: test: f
  45a/f: test: f
  46a/c/f: test: f
  47a/g: test: a/g
  48a/b/g: test: a/b/g
  49b/g: test: unspecified
  50a/b/h: test: a/b/h
  51a/b/d/g: test: a/b/d/*
  52onoff: test: unset
  53offon: test: set
  54no: notest: set
  55no: test: unspecified
  56a/b/d/no: notest: set
  57a/b/d/no: test: a/b/d/*
  58a/b/d/yes: notest: set
  59a/b/d/yes: test: unspecified
  60EOF
  61
  62'
  63
  64test_expect_success 'command line checks' '
  65
  66        test_must_fail git check-attr &&
  67        test_must_fail git check-attr -- &&
  68        test_must_fail git check-attr test &&
  69        test_must_fail git check-attr test -- &&
  70        test_must_fail git check-attr -- f &&
  71        echo "f" | test_must_fail git check-attr --stdin &&
  72        echo "f" | test_must_fail git check-attr --stdin -- f &&
  73        echo "f" | test_must_fail git check-attr --stdin test -- f &&
  74        test_must_fail git check-attr "" -- f
  75
  76'
  77
  78test_expect_success 'attribute test' '
  79
  80        attr_check f f &&
  81        attr_check a/f f &&
  82        attr_check a/c/f f &&
  83        attr_check a/g a/g &&
  84        attr_check a/b/g a/b/g &&
  85        attr_check b/g unspecified &&
  86        attr_check a/b/h a/b/h &&
  87        attr_check a/b/d/g "a/b/d/*" &&
  88        attr_check onoff unset &&
  89        attr_check offon set &&
  90        attr_check no unspecified &&
  91        attr_check a/b/d/no "a/b/d/*" &&
  92        attr_check a/b/d/yes unspecified
  93
  94'
  95
  96test_expect_failure 'unnormalized paths' '
  97
  98        attr_check ./f f &&
  99        attr_check ./a/g a/g &&
 100        attr_check a/./g a/g &&
 101        attr_check a/c/../b/g a/b/g
 102
 103'
 104
 105test_expect_success 'core.attributesfile' '
 106        attr_check global unspecified &&
 107        git config core.attributesfile "$HOME/global-gitattributes" &&
 108        attr_check global global &&
 109        git config core.attributesfile "~/global-gitattributes" &&
 110        attr_check global global &&
 111        echo "global test=precedence" >> .gitattributes &&
 112        attr_check global precedence
 113'
 114
 115test_expect_success 'attribute test: read paths from stdin' '
 116
 117        grep -v notest < expect-all > expect &&
 118        sed -e "s/:.*//" < expect | git check-attr --stdin test > actual &&
 119        test_cmp expect actual
 120'
 121
 122test_expect_success 'attribute test: --all option' '
 123
 124        grep -v unspecified < expect-all | sort > expect &&
 125        sed -e "s/:.*//" < expect-all | uniq |
 126                git check-attr --stdin --all | sort > actual &&
 127        test_cmp expect actual
 128'
 129
 130test_expect_success 'root subdir attribute test' '
 131
 132        attr_check a/i a/i &&
 133        attr_check subdir/a/i unspecified
 134
 135'
 136
 137test_expect_success 'setup bare' '
 138
 139        git clone --bare . bare.git &&
 140        cd bare.git
 141
 142'
 143
 144test_expect_success 'bare repository: check that .gitattribute is ignored' '
 145
 146        (
 147                echo "f test=f"
 148                echo "a/i test=a/i"
 149        ) >.gitattributes &&
 150        attr_check f unspecified &&
 151        attr_check a/f unspecified &&
 152        attr_check a/c/f unspecified &&
 153        attr_check a/i unspecified &&
 154        attr_check subdir/a/i unspecified
 155
 156'
 157
 158test_expect_success 'bare repository: test info/attributes' '
 159
 160        (
 161                echo "f test=f"
 162                echo "a/i test=a/i"
 163        ) >info/attributes &&
 164        attr_check f f &&
 165        attr_check a/f f &&
 166        attr_check a/c/f f &&
 167        attr_check a/i a/i &&
 168        attr_check subdir/a/i unspecified
 169
 170'
 171
 172test_done