|  | #!/bin/sh | 
|  | # | 
|  | # Copyright (c) 2005 Junio C Hamano | 
|  | # | 
|  |  | 
|  | test_description='git ls-files --others --exclude | 
|  |  | 
|  | This test runs git ls-files --others and tests --exclude patterns. | 
|  | ' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | rm -fr one three | 
|  | for dir in . one one/two three | 
|  | do | 
|  | mkdir -p $dir && | 
|  | for i in 1 2 3 4 5 6 7 8 | 
|  | do | 
|  | >$dir/a.$i | 
|  | done | 
|  | done | 
|  | >"#ignore1" | 
|  | >"#ignore2" | 
|  | >"#hidden" | 
|  |  | 
|  | cat >expect <<EOF | 
|  | a.2 | 
|  | a.4 | 
|  | a.5 | 
|  | a.8 | 
|  | one/a.3 | 
|  | one/a.4 | 
|  | one/a.5 | 
|  | one/a.7 | 
|  | one/two/a.2 | 
|  | one/two/a.3 | 
|  | one/two/a.5 | 
|  | one/two/a.7 | 
|  | one/two/a.8 | 
|  | three/a.2 | 
|  | three/a.3 | 
|  | three/a.4 | 
|  | three/a.5 | 
|  | three/a.8 | 
|  | EOF | 
|  |  | 
|  | echo '.gitignore | 
|  | \#ignore1 | 
|  | \#ignore2* | 
|  | \#hid*n | 
|  | output | 
|  | expect | 
|  | .gitignore | 
|  | *.7 | 
|  | !*.8' >.git/ignore | 
|  |  | 
|  | echo '*.1 | 
|  | /*.3 | 
|  | !*.6' >.gitignore | 
|  | echo '*.2 | 
|  | two/*.4 | 
|  | !*.7 | 
|  | *.8' >one/.gitignore | 
|  | echo '!*.2 | 
|  | !*.8' >one/two/.gitignore | 
|  |  | 
|  | allignores='.gitignore one/.gitignore one/two/.gitignore' | 
|  |  | 
|  | test_expect_success \ | 
|  | 'git ls-files --others with various exclude options.' \ | 
|  | 'git ls-files --others \ | 
|  | --exclude=\*.6 \ | 
|  | --exclude-per-directory=.gitignore \ | 
|  | --exclude-from=.git/ignore \ | 
|  | >output && | 
|  | test_cmp expect output' | 
|  |  | 
|  | # Test \r\n (MSDOS-like systems) | 
|  | printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore | 
|  |  | 
|  | test_expect_success \ | 
|  | 'git ls-files --others with \r\n line endings.' \ | 
|  | 'git ls-files --others \ | 
|  | --exclude=\*.6 \ | 
|  | --exclude-per-directory=.gitignore \ | 
|  | --exclude-from=.git/ignore \ | 
|  | >output && | 
|  | test_cmp expect output' | 
|  |  | 
|  | test_expect_success 'setup skip-worktree gitignore' ' | 
|  | git add $allignores && | 
|  | git update-index --skip-worktree $allignores && | 
|  | rm $allignores | 
|  | ' | 
|  |  | 
|  | test_expect_success \ | 
|  | 'git ls-files --others with various exclude options.' \ | 
|  | 'git ls-files --others \ | 
|  | --exclude=\*.6 \ | 
|  | --exclude-per-directory=.gitignore \ | 
|  | --exclude-from=.git/ignore \ | 
|  | >output && | 
|  | test_cmp expect output' | 
|  |  | 
|  | test_expect_success 'restore gitignore' ' | 
|  | git checkout --ignore-skip-worktree-bits $allignores && | 
|  | rm .git/index | 
|  | ' | 
|  |  | 
|  | cat > excludes-file <<\EOF | 
|  | *.[1-8] | 
|  | e* | 
|  | \#* | 
|  | EOF | 
|  |  | 
|  | git config core.excludesFile excludes-file | 
|  |  | 
|  | git -c status.displayCommentPrefix=true status | grep "^#	" > output | 
|  |  | 
|  | cat > expect << EOF | 
|  | #	.gitignore | 
|  | #	a.6 | 
|  | #	one/ | 
|  | #	output | 
|  | #	three/ | 
|  | EOF | 
|  |  | 
|  | test_expect_success 'git status honors core.excludesfile' \ | 
|  | 'test_cmp expect output' | 
|  |  | 
|  | test_expect_success 'trailing slash in exclude allows directory match(1)' ' | 
|  |  | 
|  | git ls-files --others --exclude=one/ >output && | 
|  | if grep "^one/" output | 
|  | then | 
|  | echo Ooops | 
|  | false | 
|  | else | 
|  | : happy | 
|  | fi | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'trailing slash in exclude allows directory match (2)' ' | 
|  |  | 
|  | git ls-files --others --exclude=one/two/ >output && | 
|  | if grep "^one/two/" output | 
|  | then | 
|  | echo Ooops | 
|  | false | 
|  | else | 
|  | : happy | 
|  | fi | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'trailing slash in exclude forces directory match (1)' ' | 
|  |  | 
|  | >two && | 
|  | git ls-files --others --exclude=two/ >output && | 
|  | grep "^two" output | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'trailing slash in exclude forces directory match (2)' ' | 
|  |  | 
|  | git ls-files --others --exclude=one/a.1/ >output && | 
|  | grep "^one/a.1" output | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'negated exclude matches can override previous ones' ' | 
|  |  | 
|  | git ls-files --others --exclude="a.*" --exclude="!a.1" >output && | 
|  | grep "^a.1" output | 
|  | ' | 
|  |  | 
|  | test_expect_success 'excluded directory overrides content patterns' ' | 
|  |  | 
|  | git ls-files --others --exclude="one" --exclude="!one/a.1" >output && | 
|  | if grep "^one/a.1" output | 
|  | then | 
|  | false | 
|  | fi | 
|  | ' | 
|  |  | 
|  | test_expect_success 'negated directory doesn'\''t affect content patterns' ' | 
|  |  | 
|  | git ls-files --others --exclude="!one" --exclude="one/a.1" >output && | 
|  | if grep "^one/a.1" output | 
|  | then | 
|  | false | 
|  | fi | 
|  | ' | 
|  |  | 
|  | test_expect_success 'subdirectory ignore (setup)' ' | 
|  | mkdir -p top/l1/l2 && | 
|  | ( | 
|  | cd top && | 
|  | git init && | 
|  | echo /.gitignore >.gitignore && | 
|  | echo l1 >>.gitignore && | 
|  | echo l2 >l1/.gitignore && | 
|  | >l1/l2/l1 | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'subdirectory ignore (toplevel)' ' | 
|  | ( | 
|  | cd top && | 
|  | git ls-files -o --exclude-standard | 
|  | ) >actual && | 
|  | >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'subdirectory ignore (l1/l2)' ' | 
|  | ( | 
|  | cd top/l1/l2 && | 
|  | git ls-files -o --exclude-standard | 
|  | ) >actual && | 
|  | >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'subdirectory ignore (l1)' ' | 
|  | ( | 
|  | cd top/l1 && | 
|  | git ls-files -o --exclude-standard | 
|  | ) >actual && | 
|  | >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'show/hide empty ignored directory (setup)' ' | 
|  | rm top/l1/l2/l1 && | 
|  | rm top/l1/.gitignore | 
|  | ' | 
|  |  | 
|  | test_expect_success 'show empty ignored directory with --directory' ' | 
|  | ( | 
|  | cd top && | 
|  | git ls-files -o -i --exclude l1 --directory | 
|  | ) >actual && | 
|  | echo l1/ >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'hide empty ignored directory with --no-empty-directory' ' | 
|  | ( | 
|  | cd top && | 
|  | git ls-files -o -i --exclude l1 --directory --no-empty-directory | 
|  | ) >actual && | 
|  | >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'show/hide empty ignored sub-directory (setup)' ' | 
|  | > top/l1/tracked && | 
|  | ( | 
|  | cd top && | 
|  | git add -f l1/tracked | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'show empty ignored sub-directory with --directory' ' | 
|  | ( | 
|  | cd top && | 
|  | git ls-files -o -i --exclude l1 --directory | 
|  | ) >actual && | 
|  | echo l1/l2/ >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'hide empty ignored sub-directory with --no-empty-directory' ' | 
|  | ( | 
|  | cd top && | 
|  | git ls-files -o -i --exclude l1 --directory --no-empty-directory | 
|  | ) >actual && | 
|  | >expect && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pattern matches prefix completely' ' | 
|  | : >expect && | 
|  | git ls-files -i -o --exclude "/three/a.3[abc]" >actual && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'ls-files with "**" patterns' ' | 
|  | cat <<\EOF >expect && | 
|  | a.1 | 
|  | one/a.1 | 
|  | one/two/a.1 | 
|  | three/a.1 | 
|  | EOF | 
|  | git ls-files -o -i --exclude "**/a.1" >actual && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  |  | 
|  | test_expect_success 'ls-files with "**" patterns and no slashes' ' | 
|  | : >expect && | 
|  | git ls-files -o -i --exclude "one**a.1" >actual && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_done |