t / t3001-ls-files-others-exclude.shon commit Merge branch 'ch/add-auto-submitted-in-sample-post-receive-email' (86db746)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6test_description='git ls-files --others --exclude
   7
   8This test runs git ls-files --others and tests --exclude patterns.
   9'
  10
  11. ./test-lib.sh
  12
  13rm -fr one three
  14for dir in . one one/two three
  15do
  16  mkdir -p $dir &&
  17  for i in 1 2 3 4 5 6 7 8
  18  do
  19    >$dir/a.$i
  20  done
  21done
  22>"#ignore1"
  23>"#ignore2"
  24>"#hidden"
  25
  26cat >expect <<EOF
  27a.2
  28a.4
  29a.5
  30a.8
  31one/a.3
  32one/a.4
  33one/a.5
  34one/a.7
  35one/two/a.2
  36one/two/a.3
  37one/two/a.5
  38one/two/a.7
  39one/two/a.8
  40three/a.2
  41three/a.3
  42three/a.4
  43three/a.5
  44three/a.8
  45EOF
  46
  47echo '.gitignore
  48\#ignore1
  49\#ignore2*
  50\#hid*n
  51output
  52expect
  53.gitignore
  54*.7
  55!*.8' >.git/ignore
  56
  57echo '*.1
  58/*.3
  59!*.6' >.gitignore
  60echo '*.2
  61two/*.4
  62!*.7
  63*.8' >one/.gitignore
  64echo '!*.2
  65!*.8' >one/two/.gitignore
  66
  67allignores='.gitignore one/.gitignore one/two/.gitignore'
  68
  69test_expect_success \
  70    'git ls-files --others with various exclude options.' \
  71    'git ls-files --others \
  72       --exclude=\*.6 \
  73       --exclude-per-directory=.gitignore \
  74       --exclude-from=.git/ignore \
  75       >output &&
  76     test_cmp expect output'
  77
  78# Test \r\n (MSDOS-like systems)
  79printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore
  80
  81test_expect_success \
  82    'git ls-files --others with \r\n line endings.' \
  83    'git ls-files --others \
  84       --exclude=\*.6 \
  85       --exclude-per-directory=.gitignore \
  86       --exclude-from=.git/ignore \
  87       >output &&
  88     test_cmp expect output'
  89
  90test_expect_success 'setup skip-worktree gitignore' '
  91        git add $allignores &&
  92        git update-index --skip-worktree $allignores &&
  93        rm $allignores
  94'
  95
  96test_expect_success \
  97    'git ls-files --others with various exclude options.' \
  98    'git ls-files --others \
  99       --exclude=\*.6 \
 100       --exclude-per-directory=.gitignore \
 101       --exclude-from=.git/ignore \
 102       >output &&
 103     test_cmp expect output'
 104
 105test_expect_success 'restore gitignore' '
 106        git checkout $allignores &&
 107        rm .git/index
 108'
 109
 110cat > excludes-file <<\EOF
 111*.[1-8]
 112e*
 113\#*
 114EOF
 115
 116git config core.excludesFile excludes-file
 117
 118git status | grep "^#   " > output
 119
 120cat > expect << EOF
 121#       .gitignore
 122#       a.6
 123#       one/
 124#       output
 125#       three/
 126EOF
 127
 128test_expect_success 'git status honors core.excludesfile' \
 129        'test_cmp expect output'
 130
 131test_expect_success 'trailing slash in exclude allows directory match(1)' '
 132
 133        git ls-files --others --exclude=one/ >output &&
 134        if grep "^one/" output
 135        then
 136                echo Ooops
 137                false
 138        else
 139                : happy
 140        fi
 141
 142'
 143
 144test_expect_success 'trailing slash in exclude allows directory match (2)' '
 145
 146        git ls-files --others --exclude=one/two/ >output &&
 147        if grep "^one/two/" output
 148        then
 149                echo Ooops
 150                false
 151        else
 152                : happy
 153        fi
 154
 155'
 156
 157test_expect_success 'trailing slash in exclude forces directory match (1)' '
 158
 159        >two &&
 160        git ls-files --others --exclude=two/ >output &&
 161        grep "^two" output
 162
 163'
 164
 165test_expect_success 'trailing slash in exclude forces directory match (2)' '
 166
 167        git ls-files --others --exclude=one/a.1/ >output &&
 168        grep "^one/a.1" output
 169
 170'
 171
 172test_expect_success 'negated exclude matches can override previous ones' '
 173
 174        git ls-files --others --exclude="a.*" --exclude="!a.1" >output &&
 175        grep "^a.1" output
 176'
 177
 178test_expect_success 'subdirectory ignore (setup)' '
 179        mkdir -p top/l1/l2 &&
 180        (
 181                cd top &&
 182                git init &&
 183                echo /.gitignore >.gitignore &&
 184                echo l1 >>.gitignore &&
 185                echo l2 >l1/.gitignore &&
 186                >l1/l2/l1
 187        )
 188'
 189
 190test_expect_success 'subdirectory ignore (toplevel)' '
 191        (
 192                cd top &&
 193                git ls-files -o --exclude-standard
 194        ) >actual &&
 195        >expect &&
 196        test_cmp expect actual
 197'
 198
 199test_expect_success 'subdirectory ignore (l1/l2)' '
 200        (
 201                cd top/l1/l2 &&
 202                git ls-files -o --exclude-standard
 203        ) >actual &&
 204        >expect &&
 205        test_cmp expect actual
 206'
 207
 208test_expect_success 'subdirectory ignore (l1)' '
 209        (
 210                cd top/l1 &&
 211                git ls-files -o --exclude-standard
 212        ) >actual &&
 213        >expect &&
 214        test_cmp expect actual
 215'
 216
 217test_expect_success 'pattern matches prefix completely' '
 218        : >expect &&
 219        git ls-files -i -o --exclude "/three/a.3[abc]" >actual &&
 220        test_cmp expect actual
 221'
 222
 223test_expect_success 'ls-files with "**" patterns' '
 224        cat <<\EOF >expect &&
 225a.1
 226one/a.1
 227one/two/a.1
 228three/a.1
 229EOF
 230        git ls-files -o -i --exclude "**/a.1" >actual
 231        test_cmp expect actual
 232'
 233
 234
 235test_expect_success 'ls-files with "**" patterns and no slashes' '
 236        : >expect &&
 237        git ls-files -o -i --exclude "one**a.1" >actual &&
 238        test_cmp expect actual
 239'
 240
 241test_done