You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
5.6 KiB
301 lines
5.6 KiB
#!/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 && |
|
test_must_be_empty actual |
|
' |
|
|
|
test_expect_success 'subdirectory ignore (l1/l2)' ' |
|
( |
|
cd top/l1/l2 && |
|
git ls-files -o --exclude-standard |
|
) >actual && |
|
test_must_be_empty actual |
|
' |
|
|
|
test_expect_success 'subdirectory ignore (l1)' ' |
|
( |
|
cd top/l1 && |
|
git ls-files -o --exclude-standard |
|
) >actual && |
|
test_must_be_empty 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 && |
|
test_must_be_empty 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 && |
|
test_must_be_empty actual |
|
' |
|
|
|
test_expect_success 'pattern matches prefix completely' ' |
|
git ls-files -i -o --exclude "/three/a.3[abc]" >actual && |
|
test_must_be_empty 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' ' |
|
git ls-files -o -i --exclude "one**a.1" >actual && |
|
test_must_be_empty actual |
|
' |
|
|
|
test_done
|
|
|