2005-07-25 00:26:09 +02:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
|
|
#
|
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
test_description='git ls-files --others --exclude
|
2005-07-25 00:26:09 +02:00
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
This test runs git ls-files --others and tests --exclude patterns.
|
2005-07-25 00:26:09 +02:00
|
|
|
'
|
|
|
|
|
2021-10-07 12:01:36 +02:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2005-07-25 00:26:09 +02:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
rm -fr one three
|
|
|
|
for dir in . one one/two three
|
|
|
|
do
|
|
|
|
mkdir -p $dir &&
|
2005-07-29 08:53:29 +02:00
|
|
|
for i in 1 2 3 4 5 6 7 8
|
2005-07-25 00:26:09 +02:00
|
|
|
do
|
|
|
|
>$dir/a.$i
|
|
|
|
done
|
|
|
|
done
|
2009-02-10 15:20:17 +01:00
|
|
|
>"#ignore1"
|
|
|
|
>"#ignore2"
|
|
|
|
>"#hidden"
|
2005-07-25 00:26:09 +02:00
|
|
|
|
|
|
|
cat >expect <<EOF
|
|
|
|
a.2
|
|
|
|
a.4
|
|
|
|
a.5
|
2005-07-29 08:53:29 +02:00
|
|
|
a.8
|
2005-07-25 00:26:09 +02:00
|
|
|
one/a.3
|
|
|
|
one/a.4
|
|
|
|
one/a.5
|
2005-07-29 08:53:29 +02:00
|
|
|
one/a.7
|
|
|
|
one/two/a.2
|
2005-07-25 00:26:09 +02:00
|
|
|
one/two/a.3
|
|
|
|
one/two/a.5
|
2005-07-29 08:53:29 +02:00
|
|
|
one/two/a.7
|
|
|
|
one/two/a.8
|
2005-07-25 00:26:09 +02:00
|
|
|
three/a.2
|
|
|
|
three/a.3
|
|
|
|
three/a.4
|
|
|
|
three/a.5
|
2005-07-29 08:53:29 +02:00
|
|
|
three/a.8
|
2005-07-25 00:26:09 +02:00
|
|
|
EOF
|
|
|
|
|
|
|
|
echo '.gitignore
|
2009-02-10 15:20:17 +01:00
|
|
|
\#ignore1
|
|
|
|
\#ignore2*
|
|
|
|
\#hid*n
|
2005-07-25 00:26:09 +02:00
|
|
|
output
|
|
|
|
expect
|
|
|
|
.gitignore
|
2005-07-29 08:53:29 +02:00
|
|
|
*.7
|
|
|
|
!*.8' >.git/ignore
|
2005-07-25 00:26:09 +02:00
|
|
|
|
|
|
|
echo '*.1
|
2005-07-29 08:53:29 +02:00
|
|
|
/*.3
|
|
|
|
!*.6' >.gitignore
|
2005-07-25 00:26:09 +02:00
|
|
|
echo '*.2
|
2005-07-29 08:53:29 +02:00
|
|
|
two/*.4
|
|
|
|
!*.7
|
|
|
|
*.8' >one/.gitignore
|
|
|
|
echo '!*.2
|
|
|
|
!*.8' >one/two/.gitignore
|
2005-07-25 00:26:09 +02:00
|
|
|
|
2009-08-20 15:47:01 +02:00
|
|
|
allignores='.gitignore one/.gitignore one/two/.gitignore'
|
|
|
|
|
2022-07-03 17:49:09 +02:00
|
|
|
test_expect_success 'git ls-files --others with various exclude options.' '
|
|
|
|
git ls-files --others \
|
2005-07-29 08:53:29 +02:00
|
|
|
--exclude=\*.6 \
|
2005-07-25 00:26:09 +02:00
|
|
|
--exclude-per-directory=.gitignore \
|
|
|
|
--exclude-from=.git/ignore \
|
2022-07-03 17:49:09 +02:00
|
|
|
>output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2005-08-11 04:15:02 +02:00
|
|
|
|
2005-11-02 14:05:45 +01:00
|
|
|
# Test \r\n (MSDOS-like systems)
|
2006-02-12 19:05:34 +01:00
|
|
|
printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore
|
2005-11-02 14:05:45 +01:00
|
|
|
|
2022-07-03 17:49:09 +02:00
|
|
|
test_expect_success 'git ls-files --others with \r\n line endings.' '
|
|
|
|
git ls-files --others \
|
2005-11-02 14:05:45 +01:00
|
|
|
--exclude=\*.6 \
|
|
|
|
--exclude-per-directory=.gitignore \
|
|
|
|
--exclude-from=.git/ignore \
|
2022-07-03 17:49:09 +02:00
|
|
|
>output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2005-11-02 14:05:45 +01:00
|
|
|
|
2009-08-20 15:47:01 +02:00
|
|
|
test_expect_success 'setup skip-worktree gitignore' '
|
|
|
|
git add $allignores &&
|
|
|
|
git update-index --skip-worktree $allignores &&
|
|
|
|
rm $allignores
|
|
|
|
'
|
|
|
|
|
2022-07-03 17:49:09 +02:00
|
|
|
test_expect_success 'git ls-files --others with various exclude options.' '
|
|
|
|
git ls-files --others \
|
2009-08-20 15:47:01 +02:00
|
|
|
--exclude=\*.6 \
|
|
|
|
--exclude-per-directory=.gitignore \
|
|
|
|
--exclude-from=.git/ignore \
|
2022-07-03 17:49:09 +02:00
|
|
|
>output &&
|
|
|
|
test_cmp expect output
|
|
|
|
'
|
2009-08-20 15:47:01 +02:00
|
|
|
|
2021-10-07 12:01:36 +02:00
|
|
|
test_expect_success !SANITIZE_LEAK 'restore gitignore' '
|
2013-04-13 01:12:08 +02:00
|
|
|
git checkout --ignore-skip-worktree-bits $allignores &&
|
2009-08-20 15:47:01 +02:00
|
|
|
rm .git/index
|
|
|
|
'
|
|
|
|
|
2009-02-10 15:20:17 +01:00
|
|
|
cat > excludes-file <<\EOF
|
2007-05-22 02:12:17 +02:00
|
|
|
*.[1-8]
|
|
|
|
e*
|
2009-02-10 15:20:17 +01:00
|
|
|
\#*
|
2007-05-22 02:12:17 +02:00
|
|
|
EOF
|
|
|
|
|
2007-07-03 07:52:14 +02:00
|
|
|
git config core.excludesFile excludes-file
|
2007-05-22 02:12:17 +02:00
|
|
|
|
2013-09-06 19:43:07 +02:00
|
|
|
git -c status.displayCommentPrefix=true status | grep "^# " > output
|
2007-05-22 02:12:17 +02:00
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
# .gitignore
|
|
|
|
# a.6
|
|
|
|
# one/
|
|
|
|
# output
|
|
|
|
# three/
|
|
|
|
EOF
|
|
|
|
|
2021-10-07 12:01:36 +02:00
|
|
|
test_expect_success !SANITIZE_LEAK 'git status honors core.excludesfile' \
|
2008-03-12 22:36:36 +01:00
|
|
|
'test_cmp expect output'
|
2007-05-22 02:12:17 +02:00
|
|
|
|
2008-01-31 10:17:48 +01:00
|
|
|
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)' '
|
|
|
|
|
2010-10-31 02:46:54 +01:00
|
|
|
>two &&
|
2008-01-31 10:17:48 +01:00
|
|
|
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
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2008-12-18 18:11:18 +01:00
|
|
|
test_expect_success 'negated exclude matches can override previous ones' '
|
|
|
|
|
|
|
|
git ls-files --others --exclude="a.*" --exclude="!a.1" >output &&
|
|
|
|
grep "^a.1" output
|
|
|
|
'
|
|
|
|
|
2016-03-18 19:06:15 +01:00
|
|
|
test_expect_success 'excluded directory overrides content patterns' '
|
2013-05-29 22:32:36 +02:00
|
|
|
|
|
|
|
git ls-files --others --exclude="one" --exclude="!one/a.1" >output &&
|
2016-03-18 19:06:15 +01:00
|
|
|
if grep "^one/a.1" output
|
|
|
|
then
|
|
|
|
false
|
|
|
|
fi
|
2013-05-29 22:32:36 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2010-01-09 08:07:17 +01:00
|
|
|
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 &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2010-01-09 08:07:17 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'subdirectory ignore (l1/l2)' '
|
|
|
|
(
|
|
|
|
cd top/l1/l2 &&
|
|
|
|
git ls-files -o --exclude-standard
|
|
|
|
) >actual &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2010-01-09 08:07:17 +01:00
|
|
|
'
|
|
|
|
|
2010-01-09 08:05:41 +01:00
|
|
|
test_expect_success 'subdirectory ignore (l1)' '
|
2010-01-09 08:07:17 +01:00
|
|
|
(
|
|
|
|
cd top/l1 &&
|
|
|
|
git ls-files -o --exclude-standard
|
|
|
|
) >actual &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2010-01-09 08:07:17 +01:00
|
|
|
'
|
|
|
|
|
2013-04-15 21:08:02 +02:00
|
|
|
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 &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2013-04-15 21:08:02 +02:00
|
|
|
'
|
|
|
|
|
2013-04-15 21:10:05 +02:00
|
|
|
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 &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2013-04-15 21:10:05 +02:00
|
|
|
'
|
|
|
|
|
2012-10-15 08:24:36 +02:00
|
|
|
test_expect_success 'pattern matches prefix completely' '
|
|
|
|
git ls-files -i -o --exclude "/three/a.3[abc]" >actual &&
|
tests: use 'test_must_be_empty' instead of 'test_cmp <empty> <out>'
Using 'test_must_be_empty' is shorter and more idiomatic than
>empty &&
test_cmp empty out
as it saves the creation of an empty file. Furthermore, sometimes the
expected empty file doesn't have such a descriptive name like 'empty',
and its creation is far away from the place where it's finally used
for comparison (e.g. in 't7600-merge.sh', where two expected empty
files are created in the 'setup' test, but are used only about 500
lines later).
These cases were found by instrumenting 'test_cmp' to error out the
test script when it's used to compare empty files, and then converted
manually.
Note that even after this patch there still remain a lot of cases
where we use 'test_cmp' to check empty files:
- Sometimes the expected output is not hard-coded in the test, but
'test_cmp' is used to ensure that two similar git commands produce
the same output, and that output happens to be empty, e.g. the
test 'submodule update --merge - ignores --merge for new
submodules' in 't7406-submodule-update.sh'.
- Repetitive common tasks, including preparing the expected results
and running 'test_cmp', are often extracted into a helper
function, and some of this helper's callsites expect no output.
- For the same reason as above, the whole 'test_expect_success'
block is within a helper function, e.g. in 't3070-wildmatch.sh'.
- Or 'test_cmp' is invoked in a loop, e.g. the test 'cvs update
(-p)' in 't9400-git-cvsserver-server.sh'.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-19 23:57:25 +02:00
|
|
|
test_must_be_empty actual
|
2012-10-15 08:24:36 +02:00
|
|
|
'
|
|
|
|
|
2012-10-15 08:26:02 +02:00
|
|
|
test_expect_success 'ls-files with "**" patterns' '
|
2022-07-03 17:49:09 +02:00
|
|
|
cat <<-\EOF >expect &&
|
|
|
|
a.1
|
|
|
|
one/a.1
|
|
|
|
one/two/a.1
|
|
|
|
three/a.1
|
|
|
|
EOF
|
2015-03-20 11:06:44 +01:00
|
|
|
git ls-files -o -i --exclude "**/a.1" >actual &&
|
2012-10-15 08:26:02 +02:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-05-12 19:28:20 +02:00
|
|
|
test_expect_success 'ls-files with "**" patterns and --directory' '
|
2021-05-12 19:28:18 +02:00
|
|
|
# Expectation same as previous test
|
|
|
|
git ls-files --directory -o -i --exclude "**/a.1" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2012-10-15 08:26:02 +02:00
|
|
|
|
|
|
|
test_expect_success 'ls-files with "**" patterns and no slashes' '
|
|
|
|
git ls-files -o -i --exclude "one**a.1" >actual &&
|
tests: use 'test_must_be_empty' instead of 'test_cmp <empty> <out>'
Using 'test_must_be_empty' is shorter and more idiomatic than
>empty &&
test_cmp empty out
as it saves the creation of an empty file. Furthermore, sometimes the
expected empty file doesn't have such a descriptive name like 'empty',
and its creation is far away from the place where it's finally used
for comparison (e.g. in 't7600-merge.sh', where two expected empty
files are created in the 'setup' test, but are used only about 500
lines later).
These cases were found by instrumenting 'test_cmp' to error out the
test script when it's used to compare empty files, and then converted
manually.
Note that even after this patch there still remain a lot of cases
where we use 'test_cmp' to check empty files:
- Sometimes the expected output is not hard-coded in the test, but
'test_cmp' is used to ensure that two similar git commands produce
the same output, and that output happens to be empty, e.g. the
test 'submodule update --merge - ignores --merge for new
submodules' in 't7406-submodule-update.sh'.
- Repetitive common tasks, including preparing the expected results
and running 'test_cmp', are often extracted into a helper
function, and some of this helper's callsites expect no output.
- For the same reason as above, the whole 'test_expect_success'
block is within a helper function, e.g. in 't3070-wildmatch.sh'.
- Or 'test_cmp' is invoked in a loop, e.g. the test 'cvs update
(-p)' in 't9400-git-cvsserver-server.sh'.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-19 23:57:25 +02:00
|
|
|
test_must_be_empty actual
|
2012-10-15 08:26:02 +02:00
|
|
|
'
|
|
|
|
|
2005-08-11 04:15:02 +02:00
|
|
|
test_done
|