t / t3001-ls-files-others-exclude.shon commit Merge branch 'pw/add-p-recount' into maint (689204c)
   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 --ignore-skip-worktree-bits $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 -c status.displayCommentPrefix=true 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 'excluded directory overrides content patterns' '
 179
 180        git ls-files --others --exclude="one" --exclude="!one/a.1" >output &&
 181        if grep "^one/a.1" output
 182        then
 183                false
 184        fi
 185'
 186
 187test_expect_success 'negated directory doesn'\''t affect content patterns' '
 188
 189        git ls-files --others --exclude="!one" --exclude="one/a.1" >output &&
 190        if grep "^one/a.1" output
 191        then
 192                false
 193        fi
 194'
 195
 196test_expect_success 'subdirectory ignore (setup)' '
 197        mkdir -p top/l1/l2 &&
 198        (
 199                cd top &&
 200                git init &&
 201                echo /.gitignore >.gitignore &&
 202                echo l1 >>.gitignore &&
 203                echo l2 >l1/.gitignore &&
 204                >l1/l2/l1
 205        )
 206'
 207
 208test_expect_success 'subdirectory ignore (toplevel)' '
 209        (
 210                cd top &&
 211                git ls-files -o --exclude-standard
 212        ) >actual &&
 213        test_must_be_empty actual
 214'
 215
 216test_expect_success 'subdirectory ignore (l1/l2)' '
 217        (
 218                cd top/l1/l2 &&
 219                git ls-files -o --exclude-standard
 220        ) >actual &&
 221        test_must_be_empty actual
 222'
 223
 224test_expect_success 'subdirectory ignore (l1)' '
 225        (
 226                cd top/l1 &&
 227                git ls-files -o --exclude-standard
 228        ) >actual &&
 229        test_must_be_empty actual
 230'
 231
 232test_expect_success 'show/hide empty ignored directory (setup)' '
 233        rm top/l1/l2/l1 &&
 234        rm top/l1/.gitignore
 235'
 236
 237test_expect_success 'show empty ignored directory with --directory' '
 238        (
 239                cd top &&
 240                git ls-files -o -i --exclude l1 --directory
 241        ) >actual &&
 242        echo l1/ >expect &&
 243        test_cmp expect actual
 244'
 245
 246test_expect_success 'hide empty ignored directory with --no-empty-directory' '
 247        (
 248                cd top &&
 249                git ls-files -o -i --exclude l1 --directory --no-empty-directory
 250        ) >actual &&
 251        test_must_be_empty actual
 252'
 253
 254test_expect_success 'show/hide empty ignored sub-directory (setup)' '
 255        > top/l1/tracked &&
 256        (
 257                cd top &&
 258                git add -f l1/tracked
 259        )
 260'
 261
 262test_expect_success 'show empty ignored sub-directory with --directory' '
 263        (
 264                cd top &&
 265                git ls-files -o -i --exclude l1 --directory
 266        ) >actual &&
 267        echo l1/l2/ >expect &&
 268        test_cmp expect actual
 269'
 270
 271test_expect_success 'hide empty ignored sub-directory with --no-empty-directory' '
 272        (
 273                cd top &&
 274                git ls-files -o -i --exclude l1 --directory --no-empty-directory
 275        ) >actual &&
 276        test_must_be_empty actual
 277'
 278
 279test_expect_success 'pattern matches prefix completely' '
 280        git ls-files -i -o --exclude "/three/a.3[abc]" >actual &&
 281        test_must_be_empty actual
 282'
 283
 284test_expect_success 'ls-files with "**" patterns' '
 285        cat <<\EOF >expect &&
 286a.1
 287one/a.1
 288one/two/a.1
 289three/a.1
 290EOF
 291        git ls-files -o -i --exclude "**/a.1" >actual &&
 292        test_cmp expect actual
 293'
 294
 295
 296test_expect_success 'ls-files with "**" patterns and no slashes' '
 297        git ls-files -o -i --exclude "one**a.1" >actual &&
 298        test_must_be_empty actual
 299'
 300
 301test_done