From a4a136f56ebd16113269c48863e456ed0a4ef776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:15 +0000 Subject: [PATCH 01/10] wildmatch test: indent with tabs, not spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the 4-width mixed space & tab indentation in this file with indentation with tabs as we do in most of the rest of our tests. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 54 ++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 163a14a1c2..27fa878f6e 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -5,39 +5,39 @@ test_description='wildmatch tests' . ./test-lib.sh match() { - if [ $1 = 1 ]; then - test_expect_success "wildmatch: match '$3' '$4'" " - test-wildmatch wildmatch '$3' '$4' - " - else - test_expect_success "wildmatch: no match '$3' '$4'" " - ! test-wildmatch wildmatch '$3' '$4' - " - fi + if [ $1 = 1 ]; then + test_expect_success "wildmatch: match '$3' '$4'" " + test-wildmatch wildmatch '$3' '$4' + " + else + test_expect_success "wildmatch: no match '$3' '$4'" " + ! test-wildmatch wildmatch '$3' '$4' + " + fi } imatch() { - if [ $1 = 1 ]; then - test_expect_success "iwildmatch: match '$2' '$3'" " - test-wildmatch iwildmatch '$2' '$3' - " - else - test_expect_success "iwildmatch: no match '$2' '$3'" " - ! test-wildmatch iwildmatch '$2' '$3' - " - fi + if [ $1 = 1 ]; then + test_expect_success "iwildmatch: match '$2' '$3'" " + test-wildmatch iwildmatch '$2' '$3' + " + else + test_expect_success "iwildmatch: no match '$2' '$3'" " + ! test-wildmatch iwildmatch '$2' '$3' + " + fi } pathmatch() { - if [ $1 = 1 ]; then - test_expect_success "pathmatch: match '$2' '$3'" " - test-wildmatch pathmatch '$2' '$3' - " - else - test_expect_success "pathmatch: no match '$2' '$3'" " - ! test-wildmatch pathmatch '$2' '$3' - " - fi + if [ $1 = 1 ]; then + test_expect_success "pathmatch: match '$2' '$3'" " + test-wildmatch pathmatch '$2' '$3' + " + else + test_expect_success "pathmatch: no match '$2' '$3'" " + ! test-wildmatch pathmatch '$2' '$3' + " + fi } # Basic wildmat features From 5008ba8c5e2bbb87a35a25440f9e920c511de674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:16 +0000 Subject: [PATCH 02/10] wildmatch test: use more standard shell style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the wildmatch test to use more standard shell style, usually we use "if test" not "if [". Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 27fa878f6e..4d589d1f9a 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -5,7 +5,8 @@ test_description='wildmatch tests' . ./test-lib.sh match() { - if [ $1 = 1 ]; then + if test "$1" = 1 + then test_expect_success "wildmatch: match '$3' '$4'" " test-wildmatch wildmatch '$3' '$4' " @@ -17,7 +18,8 @@ match() { } imatch() { - if [ $1 = 1 ]; then + if test "$1" = 1 + then test_expect_success "iwildmatch: match '$2' '$3'" " test-wildmatch iwildmatch '$2' '$3' " @@ -29,7 +31,8 @@ imatch() { } pathmatch() { - if [ $1 = 1 ]; then + if test "$1" = 1 + then test_expect_success "pathmatch: match '$2' '$3'" " test-wildmatch pathmatch '$2' '$3' " From f5ebe8f3f1d481fb25fd71a80b0909987fcb2884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:17 +0000 Subject: [PATCH 03/10] wildmatch test: don't try to vertically align our output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't try to vertically align the test output, which is futile anyway under the TAP output where we're going to be emitting a number for each test without aligning the test count. This makes subsequent changes of mine where I'm not going to be aligning this output as I add new tests easier. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 4d589d1f9a..19ea64bba9 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -7,11 +7,11 @@ test_description='wildmatch tests' match() { if test "$1" = 1 then - test_expect_success "wildmatch: match '$3' '$4'" " + test_expect_success "wildmatch: match '$3' '$4'" " test-wildmatch wildmatch '$3' '$4' " else - test_expect_success "wildmatch: no match '$3' '$4'" " + test_expect_success "wildmatch: no match '$3' '$4'" " ! test-wildmatch wildmatch '$3' '$4' " fi @@ -20,7 +20,7 @@ match() { imatch() { if test "$1" = 1 then - test_expect_success "iwildmatch: match '$2' '$3'" " + test_expect_success "iwildmatch: match '$2' '$3'" " test-wildmatch iwildmatch '$2' '$3' " else @@ -33,11 +33,11 @@ imatch() { pathmatch() { if test "$1" = 1 then - test_expect_success "pathmatch: match '$2' '$3'" " + test_expect_success "pathmatch: match '$2' '$3'" " test-wildmatch pathmatch '$2' '$3' " else - test_expect_success "pathmatch: no match '$2' '$3'" " + test_expect_success "pathmatch: no match '$2' '$3'" " ! test-wildmatch pathmatch '$2' '$3' " fi From 5684c2bc69d6b06cca708a859843c9b2468068d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:18 +0000 Subject: [PATCH 04/10] wildmatch test: use a paranoia pattern from nul_match() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a pattern from the nul_match() function in t7008-grep-binary.sh to make sure that we don't just fall through to the "else" if there's an unknown parameter. This is something I added in commit 77f6f4406f ("grep: add a test helper function for less verbose -f \0 tests", 2017-05-20) to grep tests, which were modeled on these wildmatch tests, and I'm now porting back to the original wildmatch tests. I am not using the "say '...'; exit 1" pattern from t0000-basic.sh because if I fail I want to run the rest of the tests (unless under -i), and doing this makes sure we do that and don't exit right away without fully reporting our errors. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 19ea64bba9..9691d8eda3 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -10,10 +10,13 @@ match() { test_expect_success "wildmatch: match '$3' '$4'" " test-wildmatch wildmatch '$3' '$4' " - else + elif test "$1" = 0 + then test_expect_success "wildmatch: no match '$3' '$4'" " ! test-wildmatch wildmatch '$3' '$4' " + else + test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' fi } @@ -23,10 +26,13 @@ imatch() { test_expect_success "iwildmatch: match '$2' '$3'" " test-wildmatch iwildmatch '$2' '$3' " - else + elif test "$1" = 0 + then test_expect_success "iwildmatch: no match '$2' '$3'" " ! test-wildmatch iwildmatch '$2' '$3' " + else + test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' fi } @@ -36,10 +42,13 @@ pathmatch() { test_expect_success "pathmatch: match '$2' '$3'" " test-wildmatch pathmatch '$2' '$3' " - else + elif test "$1" = 0 + then test_expect_success "pathmatch: no match '$2' '$3'" " ! test-wildmatch pathmatch '$2' '$3' " + else + test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' fi } From 50eafb1a278d20a55280880ac6a24f5981eac6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:19 +0000 Subject: [PATCH 05/10] wildmatch test: remove dead fnmatch() test code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the unused fnmatch() test parameter from the wildmatch test. The code that used to test this was removed in 70a8fc999d ("stop using fnmatch (either native or compat)", 2014-02-15). As a --word-diff shows the only change to the body of the tests is the removal of the second out of four parameters passed to match(). Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 356 +++++++++++++++++++++---------------------- 1 file changed, 178 insertions(+), 178 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 9691d8eda3..2f8a681c72 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -7,13 +7,13 @@ test_description='wildmatch tests' match() { if test "$1" = 1 then - test_expect_success "wildmatch: match '$3' '$4'" " - test-wildmatch wildmatch '$3' '$4' + test_expect_success "wildmatch: match '$2' '$3'" " + test-wildmatch wildmatch '$2' '$3' " elif test "$1" = 0 then - test_expect_success "wildmatch: no match '$3' '$4'" " - ! test-wildmatch wildmatch '$3' '$4' + test_expect_success "wildmatch: no match '$2' '$3'" " + ! test-wildmatch wildmatch '$2' '$3' " else test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' @@ -53,176 +53,176 @@ pathmatch() { } # Basic wildmat features -match 1 1 foo foo -match 0 0 foo bar -match 1 1 '' "" -match 1 1 foo '???' -match 0 0 foo '??' -match 1 1 foo '*' -match 1 1 foo 'f*' -match 0 0 foo '*f' -match 1 1 foo '*foo*' -match 1 1 foobar '*ob*a*r*' -match 1 1 aaaaaaabababab '*ab' -match 1 1 'foo*' 'foo\*' -match 0 0 foobar 'foo\*bar' -match 1 1 'f\oo' 'f\\oo' -match 1 1 ball '*[al]?' -match 0 0 ten '[ten]' -match 0 1 ten '**[!te]' -match 0 0 ten '**[!ten]' -match 1 1 ten 't[a-g]n' -match 0 0 ten 't[!a-g]n' -match 1 1 ton 't[!a-g]n' -match 1 1 ton 't[^a-g]n' -match 1 x 'a]b' 'a[]]b' -match 1 x a-b 'a[]-]b' -match 1 x 'a]b' 'a[]-]b' -match 0 x aab 'a[]-]b' -match 1 x aab 'a[]a-]b' -match 1 1 ']' ']' +match 1 foo foo +match 0 foo bar +match 1 '' "" +match 1 foo '???' +match 0 foo '??' +match 1 foo '*' +match 1 foo 'f*' +match 0 foo '*f' +match 1 foo '*foo*' +match 1 foobar '*ob*a*r*' +match 1 aaaaaaabababab '*ab' +match 1 'foo*' 'foo\*' +match 0 foobar 'foo\*bar' +match 1 'f\oo' 'f\\oo' +match 1 ball '*[al]?' +match 0 ten '[ten]' +match 0 ten '**[!te]' +match 0 ten '**[!ten]' +match 1 ten 't[a-g]n' +match 0 ten 't[!a-g]n' +match 1 ton 't[!a-g]n' +match 1 ton 't[^a-g]n' +match 1 'a]b' 'a[]]b' +match 1 a-b 'a[]-]b' +match 1 'a]b' 'a[]-]b' +match 0 aab 'a[]-]b' +match 1 aab 'a[]a-]b' +match 1 ']' ']' # Extended slash-matching features -match 0 0 'foo/baz/bar' 'foo*bar' -match 0 0 'foo/baz/bar' 'foo**bar' -match 0 1 'foobazbar' 'foo**bar' -match 1 1 'foo/baz/bar' 'foo/**/bar' -match 1 0 'foo/baz/bar' 'foo/**/**/bar' -match 1 0 'foo/b/a/z/bar' 'foo/**/bar' -match 1 0 'foo/b/a/z/bar' 'foo/**/**/bar' -match 1 0 'foo/bar' 'foo/**/bar' -match 1 0 'foo/bar' 'foo/**/**/bar' -match 0 0 'foo/bar' 'foo?bar' -match 0 0 'foo/bar' 'foo[/]bar' -match 0 0 'foo/bar' 'foo[^a-z]bar' -match 0 0 'foo/bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' -match 1 1 'foo-bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' -match 1 0 'foo' '**/foo' -match 1 x 'XXX/foo' '**/foo' -match 1 0 'bar/baz/foo' '**/foo' -match 0 0 'bar/baz/foo' '*/foo' -match 0 0 'foo/bar/baz' '**/bar*' -match 1 0 'deep/foo/bar/baz' '**/bar/*' -match 0 0 'deep/foo/bar/baz/' '**/bar/*' -match 1 0 'deep/foo/bar/baz/' '**/bar/**' -match 0 0 'deep/foo/bar' '**/bar/*' -match 1 0 'deep/foo/bar/' '**/bar/**' -match 0 0 'foo/bar/baz' '**/bar**' -match 1 0 'foo/bar/baz/x' '*/bar/**' -match 0 0 'deep/foo/bar/baz/x' '*/bar/**' -match 1 0 'deep/foo/bar/baz/x' '**/bar/*/*' +match 0 'foo/baz/bar' 'foo*bar' +match 0 'foo/baz/bar' 'foo**bar' +match 0 'foobazbar' 'foo**bar' +match 1 'foo/baz/bar' 'foo/**/bar' +match 1 'foo/baz/bar' 'foo/**/**/bar' +match 1 'foo/b/a/z/bar' 'foo/**/bar' +match 1 'foo/b/a/z/bar' 'foo/**/**/bar' +match 1 'foo/bar' 'foo/**/bar' +match 1 'foo/bar' 'foo/**/**/bar' +match 0 'foo/bar' 'foo?bar' +match 0 'foo/bar' 'foo[/]bar' +match 0 'foo/bar' 'foo[^a-z]bar' +match 0 'foo/bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' +match 1 'foo-bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' +match 1 'foo' '**/foo' +match 1 'XXX/foo' '**/foo' +match 1 'bar/baz/foo' '**/foo' +match 0 'bar/baz/foo' '*/foo' +match 0 'foo/bar/baz' '**/bar*' +match 1 'deep/foo/bar/baz' '**/bar/*' +match 0 'deep/foo/bar/baz/' '**/bar/*' +match 1 'deep/foo/bar/baz/' '**/bar/**' +match 0 'deep/foo/bar' '**/bar/*' +match 1 'deep/foo/bar/' '**/bar/**' +match 0 'foo/bar/baz' '**/bar**' +match 1 'foo/bar/baz/x' '*/bar/**' +match 0 'deep/foo/bar/baz/x' '*/bar/**' +match 1 'deep/foo/bar/baz/x' '**/bar/*/*' # Various additional tests -match 0 0 'acrt' 'a[c-c]st' -match 1 1 'acrt' 'a[c-c]rt' -match 0 0 ']' '[!]-]' -match 1 x 'a' '[!]-]' -match 0 0 '' '\' -match 0 x '\' '\' -match 0 x 'XXX/\' '*/\' -match 1 x 'XXX/\' '*/\\' -match 1 1 'foo' 'foo' -match 1 1 '@foo' '@foo' -match 0 0 'foo' '@foo' -match 1 1 '[ab]' '\[ab]' -match 1 1 '[ab]' '[[]ab]' -match 1 x '[ab]' '[[:]ab]' -match 0 x '[ab]' '[[::]ab]' -match 1 x '[ab]' '[[:digit]ab]' -match 1 x '[ab]' '[\[:]ab]' -match 1 1 '?a?b' '\??\?b' -match 1 1 'abc' '\a\b\c' -match 0 0 'foo' '' -match 1 0 'foo/bar/baz/to' '**/t[o]' +match 0 'acrt' 'a[c-c]st' +match 1 'acrt' 'a[c-c]rt' +match 0 ']' '[!]-]' +match 1 'a' '[!]-]' +match 0 '' '\' +match 0 '\' '\' +match 0 'XXX/\' '*/\' +match 1 'XXX/\' '*/\\' +match 1 'foo' 'foo' +match 1 '@foo' '@foo' +match 0 'foo' '@foo' +match 1 '[ab]' '\[ab]' +match 1 '[ab]' '[[]ab]' +match 1 '[ab]' '[[:]ab]' +match 0 '[ab]' '[[::]ab]' +match 1 '[ab]' '[[:digit]ab]' +match 1 '[ab]' '[\[:]ab]' +match 1 '?a?b' '\??\?b' +match 1 'abc' '\a\b\c' +match 0 'foo' '' +match 1 'foo/bar/baz/to' '**/t[o]' # Character class tests -match 1 x 'a1B' '[[:alpha:]][[:digit:]][[:upper:]]' -match 0 x 'a' '[[:digit:][:upper:][:space:]]' -match 1 x 'A' '[[:digit:][:upper:][:space:]]' -match 1 x '1' '[[:digit:][:upper:][:space:]]' -match 0 x '1' '[[:digit:][:upper:][:spaci:]]' -match 1 x ' ' '[[:digit:][:upper:][:space:]]' -match 0 x '.' '[[:digit:][:upper:][:space:]]' -match 1 x '.' '[[:digit:][:punct:][:space:]]' -match 1 x '5' '[[:xdigit:]]' -match 1 x 'f' '[[:xdigit:]]' -match 1 x 'D' '[[:xdigit:]]' -match 1 x '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]' -match 1 x '.' '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]' -match 1 x '5' '[a-c[:digit:]x-z]' -match 1 x 'b' '[a-c[:digit:]x-z]' -match 1 x 'y' '[a-c[:digit:]x-z]' -match 0 x 'q' '[a-c[:digit:]x-z]' +match 1 'a1B' '[[:alpha:]][[:digit:]][[:upper:]]' +match 0 'a' '[[:digit:][:upper:][:space:]]' +match 1 'A' '[[:digit:][:upper:][:space:]]' +match 1 '1' '[[:digit:][:upper:][:space:]]' +match 0 '1' '[[:digit:][:upper:][:spaci:]]' +match 1 ' ' '[[:digit:][:upper:][:space:]]' +match 0 '.' '[[:digit:][:upper:][:space:]]' +match 1 '.' '[[:digit:][:punct:][:space:]]' +match 1 '5' '[[:xdigit:]]' +match 1 'f' '[[:xdigit:]]' +match 1 'D' '[[:xdigit:]]' +match 1 '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]' +match 1 '.' '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]' +match 1 '5' '[a-c[:digit:]x-z]' +match 1 'b' '[a-c[:digit:]x-z]' +match 1 'y' '[a-c[:digit:]x-z]' +match 0 'q' '[a-c[:digit:]x-z]' # Additional tests, including some malformed wildmats -match 1 x ']' '[\\-^]' -match 0 0 '[' '[\\-^]' -match 1 x '-' '[\-_]' -match 1 x ']' '[\]]' -match 0 0 '\]' '[\]]' -match 0 0 '\' '[\]]' -match 0 0 'ab' 'a[]b' -match 0 x 'a[]b' 'a[]b' -match 0 x 'ab[' 'ab[' -match 0 0 'ab' '[!' -match 0 0 'ab' '[-' -match 1 1 '-' '[-]' -match 0 0 '-' '[a-' -match 0 0 '-' '[!a-' -match 1 x '-' '[--A]' -match 1 x '5' '[--A]' -match 1 1 ' ' '[ --]' -match 1 1 '$' '[ --]' -match 1 1 '-' '[ --]' -match 0 0 '0' '[ --]' -match 1 x '-' '[---]' -match 1 x '-' '[------]' -match 0 0 'j' '[a-e-n]' -match 1 x '-' '[a-e-n]' -match 1 x 'a' '[!------]' -match 0 0 '[' '[]-a]' -match 1 x '^' '[]-a]' -match 0 0 '^' '[!]-a]' -match 1 x '[' '[!]-a]' -match 1 1 '^' '[a^bc]' -match 1 x '-b]' '[a-]b]' -match 0 0 '\' '[\]' -match 1 1 '\' '[\\]' -match 0 0 '\' '[!\\]' -match 1 1 'G' '[A-\\]' -match 0 0 'aaabbb' 'b*a' -match 0 0 'aabcaa' '*ba*' -match 1 1 ',' '[,]' -match 1 1 ',' '[\\,]' -match 1 1 '\' '[\\,]' -match 1 1 '-' '[,-.]' -match 0 0 '+' '[,-.]' -match 0 0 '-.]' '[,-.]' -match 1 1 '2' '[\1-\3]' -match 1 1 '3' '[\1-\3]' -match 0 0 '4' '[\1-\3]' -match 1 1 '\' '[[-\]]' -match 1 1 '[' '[[-\]]' -match 1 1 ']' '[[-\]]' -match 0 0 '-' '[[-\]]' +match 1 ']' '[\\-^]' +match 0 '[' '[\\-^]' +match 1 '-' '[\-_]' +match 1 ']' '[\]]' +match 0 '\]' '[\]]' +match 0 '\' '[\]]' +match 0 'ab' 'a[]b' +match 0 'a[]b' 'a[]b' +match 0 'ab[' 'ab[' +match 0 'ab' '[!' +match 0 'ab' '[-' +match 1 '-' '[-]' +match 0 '-' '[a-' +match 0 '-' '[!a-' +match 1 '-' '[--A]' +match 1 '5' '[--A]' +match 1 ' ' '[ --]' +match 1 '$' '[ --]' +match 1 '-' '[ --]' +match 0 '0' '[ --]' +match 1 '-' '[---]' +match 1 '-' '[------]' +match 0 'j' '[a-e-n]' +match 1 '-' '[a-e-n]' +match 1 'a' '[!------]' +match 0 '[' '[]-a]' +match 1 '^' '[]-a]' +match 0 '^' '[!]-a]' +match 1 '[' '[!]-a]' +match 1 '^' '[a^bc]' +match 1 '-b]' '[a-]b]' +match 0 '\' '[\]' +match 1 '\' '[\\]' +match 0 '\' '[!\\]' +match 1 'G' '[A-\\]' +match 0 'aaabbb' 'b*a' +match 0 'aabcaa' '*ba*' +match 1 ',' '[,]' +match 1 ',' '[\\,]' +match 1 '\' '[\\,]' +match 1 '-' '[,-.]' +match 0 '+' '[,-.]' +match 0 '-.]' '[,-.]' +match 1 '2' '[\1-\3]' +match 1 '3' '[\1-\3]' +match 0 '4' '[\1-\3]' +match 1 '\' '[[-\]]' +match 1 '[' '[[-\]]' +match 1 ']' '[[-\]]' +match 0 '-' '[[-\]]' # Test recursion and the abort code (use "wildtest -i" to see iteration counts) -match 1 1 '-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 0 0 '-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 0 0 '-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 1 1 'XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' -match 0 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' -match 1 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t' -match 0 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t' -match 0 x foo '*/*/*' -match 0 x foo/bar '*/*/*' -match 1 x foo/bba/arr '*/*/*' -match 0 x foo/bb/aa/rr '*/*/*' -match 1 x foo/bb/aa/rr '**/**/**' -match 1 x abcXdefXghi '*X*i' -match 0 x ab/cXd/efXg/hi '*X*i' -match 1 x ab/cXd/efXg/hi '*/*X*/*/*i' -match 1 x ab/cXd/efXg/hi '**/*X*/**/*i' +match 1 '-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 0 '-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 0 '-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 1 'XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' +match 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' +match 1 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t' +match 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t' +match 0 foo '*/*/*' +match 0 foo/bar '*/*/*' +match 1 foo/bba/arr '*/*/*' +match 0 foo/bb/aa/rr '*/*/*' +match 1 foo/bb/aa/rr '**/**/**' +match 1 abcXdefXghi '*X*i' +match 0 ab/cXd/efXg/hi '*X*i' +match 1 ab/cXd/efXg/hi '*/*X*/*/*i' +match 1 ab/cXd/efXg/hi '**/*X*/**/*i' pathmatch 1 foo foo pathmatch 0 foo fo @@ -248,20 +248,20 @@ pathmatch 1 ab/cXd/efXg/hi '*/*X*/*/*i' pathmatch 1 ab/cXd/efXg/hi '*Xg*i' # Case-sensitivity features -match 0 x 'a' '[A-Z]' -match 1 x 'A' '[A-Z]' -match 0 x 'A' '[a-z]' -match 1 x 'a' '[a-z]' -match 0 x 'a' '[[:upper:]]' -match 1 x 'A' '[[:upper:]]' -match 0 x 'A' '[[:lower:]]' -match 1 x 'a' '[[:lower:]]' -match 0 x 'A' '[B-Za]' -match 1 x 'a' '[B-Za]' -match 0 x 'A' '[B-a]' -match 1 x 'a' '[B-a]' -match 0 x 'z' '[Z-y]' -match 1 x 'Z' '[Z-y]' +match 0 'a' '[A-Z]' +match 1 'A' '[A-Z]' +match 0 'A' '[a-z]' +match 1 'a' '[a-z]' +match 0 'a' '[[:upper:]]' +match 1 'A' '[[:upper:]]' +match 0 'A' '[[:lower:]]' +match 1 'a' '[[:lower:]]' +match 0 'A' '[B-Za]' +match 1 'a' '[B-Za]' +match 0 'A' '[B-a]' +match 1 'a' '[B-a]' +match 0 'z' '[Z-y]' +match 1 'Z' '[Z-y]' imatch 1 'a' '[A-Z]' imatch 1 'A' '[A-Z]' From 4bc280f25098c60c7e6eef4b0277a94925ed4c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:20 +0000 Subject: [PATCH 06/10] wildmatch test: use test_must_fail, not ! for test-wildmatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use of ! should be reserved for non-git programs that are assumed not to fail, see README. With this change only t/t0110-urlmatch-normalization.sh is still using this anti-pattern. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 2f8a681c72..fe0e5103a3 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -13,7 +13,7 @@ match() { elif test "$1" = 0 then test_expect_success "wildmatch: no match '$2' '$3'" " - ! test-wildmatch wildmatch '$2' '$3' + test_must_fail test-wildmatch wildmatch '$2' '$3' " else test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' @@ -29,7 +29,7 @@ imatch() { elif test "$1" = 0 then test_expect_success "iwildmatch: no match '$2' '$3'" " - ! test-wildmatch iwildmatch '$2' '$3' + test_must_fail test-wildmatch iwildmatch '$2' '$3' " else test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' @@ -45,7 +45,7 @@ pathmatch() { elif test "$1" = 0 then test_expect_success "pathmatch: no match '$2' '$3'" " - ! test-wildmatch pathmatch '$2' '$3' + test_must_fail test-wildmatch pathmatch '$2' '$3' " else test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' From 91061c444a245b967a97b84b01a11bbe077c3477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:21 +0000 Subject: [PATCH 07/10] wildmatch test: perform all tests under all wildmatch() modes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rewrite the wildmatch() test suite so that each test now tests all combinations of the wildmatch() WM_CASEFOLD and WM_PATHNAME flags. Before this change some test inputs were not tested on e.g. WM_PATHNAME. Now the function is stress tested on all possible inputs, and for each input we declare what the result should be if the mode is case-insensitive, or pathname matching, or case-sensitive or not matching pathnames. Also before this change, nothing was testing case-insensitive non-pathname matching, so I've added that to test-wildmatch.c and made use of it. This yields a rather scary patch, but there are no functional changes here, just more test coverage. Some now-redundant tests were deleted as a result of this change, since they were now duplicating an earlier test. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/helper/test-wildmatch.c | 2 + t/t3070-wildmatch.sh | 494 ++++++++++++++++++-------------------- 2 files changed, 236 insertions(+), 260 deletions(-) diff --git a/t/helper/test-wildmatch.c b/t/helper/test-wildmatch.c index 921d7b3e7e..66d33dfcfd 100644 --- a/t/helper/test-wildmatch.c +++ b/t/helper/test-wildmatch.c @@ -16,6 +16,8 @@ int cmd_main(int argc, const char **argv) return !!wildmatch(argv[3], argv[2], WM_PATHNAME | WM_CASEFOLD); else if (!strcmp(argv[1], "pathmatch")) return !!wildmatch(argv[3], argv[2], 0); + else if (!strcmp(argv[1], "ipathmatch")) + return !!wildmatch(argv[3], argv[2], WM_CASEFOLD); else return 1; } diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index fe0e5103a3..3e75cb0cbe 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -4,278 +4,252 @@ test_description='wildmatch tests' . ./test-lib.sh +match_with_function() { + text=$1 + pattern=$2 + match_expect=$3 + match_function=$4 + + if test "$match_expect" = 1 + then + test_expect_success "$match_function: match '$text' '$pattern'" " + test-wildmatch $match_function '$text' '$pattern' + " + elif test "$match_expect" = 0 + then + test_expect_success "$match_function: no match '$text' '$pattern'" " + test_must_fail test-wildmatch $match_function '$text' '$pattern' + " + else + test_expect_success "PANIC: Test framework error. Unknown matches value $match_expect" 'false' + fi + +} + match() { - if test "$1" = 1 - then - test_expect_success "wildmatch: match '$2' '$3'" " - test-wildmatch wildmatch '$2' '$3' - " - elif test "$1" = 0 - then - test_expect_success "wildmatch: no match '$2' '$3'" " - test_must_fail test-wildmatch wildmatch '$2' '$3' - " - else - test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' - fi + match_glob=$1 + match_iglob=$2 + match_pathmatch=$3 + match_pathmatchi=$4 + text=$5 + pattern=$6 + + # $1: Case sensitive glob match: test-wildmatch & ls-files + match_with_function "$text" "$pattern" $match_glob "wildmatch" + + # $2: Case insensitive glob match: test-wildmatch & ls-files + match_with_function "$text" "$pattern" $match_iglob "iwildmatch" + + # $3: Case sensitive path match: test-wildmatch & ls-files + match_with_function "$text" "$pattern" $match_pathmatch "pathmatch" + + # $4: Case insensitive path match: test-wildmatch & ls-files + match_with_function "$text" "$pattern" $match_pathmatchi "ipathmatch" } -imatch() { - if test "$1" = 1 - then - test_expect_success "iwildmatch: match '$2' '$3'" " - test-wildmatch iwildmatch '$2' '$3' - " - elif test "$1" = 0 - then - test_expect_success "iwildmatch: no match '$2' '$3'" " - test_must_fail test-wildmatch iwildmatch '$2' '$3' - " - else - test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' - fi -} - -pathmatch() { - if test "$1" = 1 - then - test_expect_success "pathmatch: match '$2' '$3'" " - test-wildmatch pathmatch '$2' '$3' - " - elif test "$1" = 0 - then - test_expect_success "pathmatch: no match '$2' '$3'" " - test_must_fail test-wildmatch pathmatch '$2' '$3' - " - else - test_expect_success "PANIC: Test framework error. Unknown matches value $1" 'false' - fi -} - -# Basic wildmat features -match 1 foo foo -match 0 foo bar -match 1 '' "" -match 1 foo '???' -match 0 foo '??' -match 1 foo '*' -match 1 foo 'f*' -match 0 foo '*f' -match 1 foo '*foo*' -match 1 foobar '*ob*a*r*' -match 1 aaaaaaabababab '*ab' -match 1 'foo*' 'foo\*' -match 0 foobar 'foo\*bar' -match 1 'f\oo' 'f\\oo' -match 1 ball '*[al]?' -match 0 ten '[ten]' -match 0 ten '**[!te]' -match 0 ten '**[!ten]' -match 1 ten 't[a-g]n' -match 0 ten 't[!a-g]n' -match 1 ton 't[!a-g]n' -match 1 ton 't[^a-g]n' -match 1 'a]b' 'a[]]b' -match 1 a-b 'a[]-]b' -match 1 'a]b' 'a[]-]b' -match 0 aab 'a[]-]b' -match 1 aab 'a[]a-]b' -match 1 ']' ']' +# Basic wildmatch features +match 1 1 1 1 foo foo +match 0 0 0 0 foo bar +match 1 1 1 1 '' "" +match 1 1 1 1 foo '???' +match 0 0 0 0 foo '??' +match 1 1 1 1 foo '*' +match 1 1 1 1 foo 'f*' +match 0 0 0 0 foo '*f' +match 1 1 1 1 foo '*foo*' +match 1 1 1 1 foobar '*ob*a*r*' +match 1 1 1 1 aaaaaaabababab '*ab' +match 1 1 1 1 'foo*' 'foo\*' +match 0 0 0 0 foobar 'foo\*bar' +match 1 1 1 1 'f\oo' 'f\\oo' +match 1 1 1 1 ball '*[al]?' +match 0 0 0 0 ten '[ten]' +match 0 0 1 1 ten '**[!te]' +match 0 0 0 0 ten '**[!ten]' +match 1 1 1 1 ten 't[a-g]n' +match 0 0 0 0 ten 't[!a-g]n' +match 1 1 1 1 ton 't[!a-g]n' +match 1 1 1 1 ton 't[^a-g]n' +match 1 1 1 1 'a]b' 'a[]]b' +match 1 1 1 1 a-b 'a[]-]b' +match 1 1 1 1 'a]b' 'a[]-]b' +match 0 0 0 0 aab 'a[]-]b' +match 1 1 1 1 aab 'a[]a-]b' +match 1 1 1 1 ']' ']' # Extended slash-matching features -match 0 'foo/baz/bar' 'foo*bar' -match 0 'foo/baz/bar' 'foo**bar' -match 0 'foobazbar' 'foo**bar' -match 1 'foo/baz/bar' 'foo/**/bar' -match 1 'foo/baz/bar' 'foo/**/**/bar' -match 1 'foo/b/a/z/bar' 'foo/**/bar' -match 1 'foo/b/a/z/bar' 'foo/**/**/bar' -match 1 'foo/bar' 'foo/**/bar' -match 1 'foo/bar' 'foo/**/**/bar' -match 0 'foo/bar' 'foo?bar' -match 0 'foo/bar' 'foo[/]bar' -match 0 'foo/bar' 'foo[^a-z]bar' -match 0 'foo/bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' -match 1 'foo-bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' -match 1 'foo' '**/foo' -match 1 'XXX/foo' '**/foo' -match 1 'bar/baz/foo' '**/foo' -match 0 'bar/baz/foo' '*/foo' -match 0 'foo/bar/baz' '**/bar*' -match 1 'deep/foo/bar/baz' '**/bar/*' -match 0 'deep/foo/bar/baz/' '**/bar/*' -match 1 'deep/foo/bar/baz/' '**/bar/**' -match 0 'deep/foo/bar' '**/bar/*' -match 1 'deep/foo/bar/' '**/bar/**' -match 0 'foo/bar/baz' '**/bar**' -match 1 'foo/bar/baz/x' '*/bar/**' -match 0 'deep/foo/bar/baz/x' '*/bar/**' -match 1 'deep/foo/bar/baz/x' '**/bar/*/*' +match 0 0 1 1 'foo/baz/bar' 'foo*bar' +match 0 0 1 1 'foo/baz/bar' 'foo**bar' +match 0 0 1 1 'foobazbar' 'foo**bar' +match 1 1 1 1 'foo/baz/bar' 'foo/**/bar' +match 1 1 0 0 'foo/baz/bar' 'foo/**/**/bar' +match 1 1 1 1 'foo/b/a/z/bar' 'foo/**/bar' +match 1 1 1 1 'foo/b/a/z/bar' 'foo/**/**/bar' +match 1 1 0 0 'foo/bar' 'foo/**/bar' +match 1 1 0 0 'foo/bar' 'foo/**/**/bar' +match 0 0 1 1 'foo/bar' 'foo?bar' +match 0 0 1 1 'foo/bar' 'foo[/]bar' +match 0 0 1 1 'foo/bar' 'foo[^a-z]bar' +match 0 0 1 1 'foo/bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' +match 1 1 1 1 'foo-bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r' +match 1 1 0 0 'foo' '**/foo' +match 1 1 1 1 'XXX/foo' '**/foo' +match 1 1 1 1 'bar/baz/foo' '**/foo' +match 0 0 1 1 'bar/baz/foo' '*/foo' +match 0 0 1 1 'foo/bar/baz' '**/bar*' +match 1 1 1 1 'deep/foo/bar/baz' '**/bar/*' +match 0 0 1 1 'deep/foo/bar/baz/' '**/bar/*' +match 1 1 1 1 'deep/foo/bar/baz/' '**/bar/**' +match 0 0 0 0 'deep/foo/bar' '**/bar/*' +match 1 1 1 1 'deep/foo/bar/' '**/bar/**' +match 0 0 1 1 'foo/bar/baz' '**/bar**' +match 1 1 1 1 'foo/bar/baz/x' '*/bar/**' +match 0 0 1 1 'deep/foo/bar/baz/x' '*/bar/**' +match 1 1 1 1 'deep/foo/bar/baz/x' '**/bar/*/*' # Various additional tests -match 0 'acrt' 'a[c-c]st' -match 1 'acrt' 'a[c-c]rt' -match 0 ']' '[!]-]' -match 1 'a' '[!]-]' -match 0 '' '\' -match 0 '\' '\' -match 0 'XXX/\' '*/\' -match 1 'XXX/\' '*/\\' -match 1 'foo' 'foo' -match 1 '@foo' '@foo' -match 0 'foo' '@foo' -match 1 '[ab]' '\[ab]' -match 1 '[ab]' '[[]ab]' -match 1 '[ab]' '[[:]ab]' -match 0 '[ab]' '[[::]ab]' -match 1 '[ab]' '[[:digit]ab]' -match 1 '[ab]' '[\[:]ab]' -match 1 '?a?b' '\??\?b' -match 1 'abc' '\a\b\c' -match 0 'foo' '' -match 1 'foo/bar/baz/to' '**/t[o]' +match 0 0 0 0 'acrt' 'a[c-c]st' +match 1 1 1 1 'acrt' 'a[c-c]rt' +match 0 0 0 0 ']' '[!]-]' +match 1 1 1 1 'a' '[!]-]' +match 0 0 0 0 '' '\' +match 0 0 0 0 '\' '\' +match 0 0 0 0 'XXX/\' '*/\' +match 1 1 1 1 'XXX/\' '*/\\' +match 1 1 1 1 'foo' 'foo' +match 1 1 1 1 '@foo' '@foo' +match 0 0 0 0 'foo' '@foo' +match 1 1 1 1 '[ab]' '\[ab]' +match 1 1 1 1 '[ab]' '[[]ab]' +match 1 1 1 1 '[ab]' '[[:]ab]' +match 0 0 0 0 '[ab]' '[[::]ab]' +match 1 1 1 1 '[ab]' '[[:digit]ab]' +match 1 1 1 1 '[ab]' '[\[:]ab]' +match 1 1 1 1 '?a?b' '\??\?b' +match 1 1 1 1 'abc' '\a\b\c' +match 0 0 0 0 'foo' '' +match 1 1 1 1 'foo/bar/baz/to' '**/t[o]' # Character class tests -match 1 'a1B' '[[:alpha:]][[:digit:]][[:upper:]]' -match 0 'a' '[[:digit:][:upper:][:space:]]' -match 1 'A' '[[:digit:][:upper:][:space:]]' -match 1 '1' '[[:digit:][:upper:][:space:]]' -match 0 '1' '[[:digit:][:upper:][:spaci:]]' -match 1 ' ' '[[:digit:][:upper:][:space:]]' -match 0 '.' '[[:digit:][:upper:][:space:]]' -match 1 '.' '[[:digit:][:punct:][:space:]]' -match 1 '5' '[[:xdigit:]]' -match 1 'f' '[[:xdigit:]]' -match 1 'D' '[[:xdigit:]]' -match 1 '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]' -match 1 '.' '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]' -match 1 '5' '[a-c[:digit:]x-z]' -match 1 'b' '[a-c[:digit:]x-z]' -match 1 'y' '[a-c[:digit:]x-z]' -match 0 'q' '[a-c[:digit:]x-z]' +match 1 1 1 1 'a1B' '[[:alpha:]][[:digit:]][[:upper:]]' +match 0 1 0 1 'a' '[[:digit:][:upper:][:space:]]' +match 1 1 1 1 'A' '[[:digit:][:upper:][:space:]]' +match 1 1 1 1 '1' '[[:digit:][:upper:][:space:]]' +match 0 0 0 0 '1' '[[:digit:][:upper:][:spaci:]]' +match 1 1 1 1 ' ' '[[:digit:][:upper:][:space:]]' +match 0 0 0 0 '.' '[[:digit:][:upper:][:space:]]' +match 1 1 1 1 '.' '[[:digit:][:punct:][:space:]]' +match 1 1 1 1 '5' '[[:xdigit:]]' +match 1 1 1 1 'f' '[[:xdigit:]]' +match 1 1 1 1 'D' '[[:xdigit:]]' +match 1 1 1 1 '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]' +match 1 1 1 1 '.' '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]' +match 1 1 1 1 '5' '[a-c[:digit:]x-z]' +match 1 1 1 1 'b' '[a-c[:digit:]x-z]' +match 1 1 1 1 'y' '[a-c[:digit:]x-z]' +match 0 0 0 0 'q' '[a-c[:digit:]x-z]' -# Additional tests, including some malformed wildmats -match 1 ']' '[\\-^]' -match 0 '[' '[\\-^]' -match 1 '-' '[\-_]' -match 1 ']' '[\]]' -match 0 '\]' '[\]]' -match 0 '\' '[\]]' -match 0 'ab' 'a[]b' -match 0 'a[]b' 'a[]b' -match 0 'ab[' 'ab[' -match 0 'ab' '[!' -match 0 'ab' '[-' -match 1 '-' '[-]' -match 0 '-' '[a-' -match 0 '-' '[!a-' -match 1 '-' '[--A]' -match 1 '5' '[--A]' -match 1 ' ' '[ --]' -match 1 '$' '[ --]' -match 1 '-' '[ --]' -match 0 '0' '[ --]' -match 1 '-' '[---]' -match 1 '-' '[------]' -match 0 'j' '[a-e-n]' -match 1 '-' '[a-e-n]' -match 1 'a' '[!------]' -match 0 '[' '[]-a]' -match 1 '^' '[]-a]' -match 0 '^' '[!]-a]' -match 1 '[' '[!]-a]' -match 1 '^' '[a^bc]' -match 1 '-b]' '[a-]b]' -match 0 '\' '[\]' -match 1 '\' '[\\]' -match 0 '\' '[!\\]' -match 1 'G' '[A-\\]' -match 0 'aaabbb' 'b*a' -match 0 'aabcaa' '*ba*' -match 1 ',' '[,]' -match 1 ',' '[\\,]' -match 1 '\' '[\\,]' -match 1 '-' '[,-.]' -match 0 '+' '[,-.]' -match 0 '-.]' '[,-.]' -match 1 '2' '[\1-\3]' -match 1 '3' '[\1-\3]' -match 0 '4' '[\1-\3]' -match 1 '\' '[[-\]]' -match 1 '[' '[[-\]]' -match 1 ']' '[[-\]]' -match 0 '-' '[[-\]]' +# Additional tests, including some malformed wildmatch patterns +match 1 1 1 1 ']' '[\\-^]' +match 0 0 0 0 '[' '[\\-^]' +match 1 1 1 1 '-' '[\-_]' +match 1 1 1 1 ']' '[\]]' +match 0 0 0 0 '\]' '[\]]' +match 0 0 0 0 '\' '[\]]' +match 0 0 0 0 'ab' 'a[]b' +match 0 0 0 0 'a[]b' 'a[]b' +match 0 0 0 0 'ab[' 'ab[' +match 0 0 0 0 'ab' '[!' +match 0 0 0 0 'ab' '[-' +match 1 1 1 1 '-' '[-]' +match 0 0 0 0 '-' '[a-' +match 0 0 0 0 '-' '[!a-' +match 1 1 1 1 '-' '[--A]' +match 1 1 1 1 '5' '[--A]' +match 1 1 1 1 ' ' '[ --]' +match 1 1 1 1 '$' '[ --]' +match 1 1 1 1 '-' '[ --]' +match 0 0 0 0 '0' '[ --]' +match 1 1 1 1 '-' '[---]' +match 1 1 1 1 '-' '[------]' +match 0 0 0 0 'j' '[a-e-n]' +match 1 1 1 1 '-' '[a-e-n]' +match 1 1 1 1 'a' '[!------]' +match 0 0 0 0 '[' '[]-a]' +match 1 1 1 1 '^' '[]-a]' +match 0 0 0 0 '^' '[!]-a]' +match 1 1 1 1 '[' '[!]-a]' +match 1 1 1 1 '^' '[a^bc]' +match 1 1 1 1 '-b]' '[a-]b]' +match 0 0 0 0 '\' '[\]' +match 1 1 1 1 '\' '[\\]' +match 0 0 0 0 '\' '[!\\]' +match 1 1 1 1 'G' '[A-\\]' +match 0 0 0 0 'aaabbb' 'b*a' +match 0 0 0 0 'aabcaa' '*ba*' +match 1 1 1 1 ',' '[,]' +match 1 1 1 1 ',' '[\\,]' +match 1 1 1 1 '\' '[\\,]' +match 1 1 1 1 '-' '[,-.]' +match 0 0 0 0 '+' '[,-.]' +match 0 0 0 0 '-.]' '[,-.]' +match 1 1 1 1 '2' '[\1-\3]' +match 1 1 1 1 '3' '[\1-\3]' +match 0 0 0 0 '4' '[\1-\3]' +match 1 1 1 1 '\' '[[-\]]' +match 1 1 1 1 '[' '[[-\]]' +match 1 1 1 1 ']' '[[-\]]' +match 0 0 0 0 '-' '[[-\]]' -# Test recursion and the abort code (use "wildtest -i" to see iteration counts) -match 1 '-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 0 '-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 0 '-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' -match 1 'XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' -match 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' -match 1 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t' -match 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t' -match 0 foo '*/*/*' -match 0 foo/bar '*/*/*' -match 1 foo/bba/arr '*/*/*' -match 0 foo/bb/aa/rr '*/*/*' -match 1 foo/bb/aa/rr '**/**/**' -match 1 abcXdefXghi '*X*i' -match 0 ab/cXd/efXg/hi '*X*i' -match 1 ab/cXd/efXg/hi '*/*X*/*/*i' -match 1 ab/cXd/efXg/hi '**/*X*/**/*i' +# Test recursion +match 1 1 1 1 '-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 0 0 0 0 '-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 0 0 0 0 '-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1' '-*-*-*-*-*-*-12-*-*-*-m-*-*-*' +match 1 1 1 1 'XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' +match 0 0 0 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*' +match 1 1 1 1 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t' +match 0 0 0 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t' +match 0 0 0 0 foo '*/*/*' +match 0 0 0 0 foo/bar '*/*/*' +match 1 1 1 1 foo/bba/arr '*/*/*' +match 0 0 1 1 foo/bb/aa/rr '*/*/*' +match 1 1 1 1 foo/bb/aa/rr '**/**/**' +match 1 1 1 1 abcXdefXghi '*X*i' +match 0 0 1 1 ab/cXd/efXg/hi '*X*i' +match 1 1 1 1 ab/cXd/efXg/hi '*/*X*/*/*i' +match 1 1 1 1 ab/cXd/efXg/hi '**/*X*/**/*i' -pathmatch 1 foo foo -pathmatch 0 foo fo -pathmatch 1 foo/bar foo/bar -pathmatch 1 foo/bar 'foo/*' -pathmatch 1 foo/bba/arr 'foo/*' -pathmatch 1 foo/bba/arr 'foo/**' -pathmatch 1 foo/bba/arr 'foo*' -pathmatch 1 foo/bba/arr 'foo**' -pathmatch 1 foo/bba/arr 'foo/*arr' -pathmatch 1 foo/bba/arr 'foo/**arr' -pathmatch 0 foo/bba/arr 'foo/*z' -pathmatch 0 foo/bba/arr 'foo/**z' -pathmatch 1 foo/bar 'foo?bar' -pathmatch 1 foo/bar 'foo[/]bar' -pathmatch 1 foo/bar 'foo[^a-z]bar' -pathmatch 0 foo '*/*/*' -pathmatch 0 foo/bar '*/*/*' -pathmatch 1 foo/bba/arr '*/*/*' -pathmatch 1 foo/bb/aa/rr '*/*/*' -pathmatch 1 abcXdefXghi '*X*i' -pathmatch 1 ab/cXd/efXg/hi '*/*X*/*/*i' -pathmatch 1 ab/cXd/efXg/hi '*Xg*i' +# Extra pathmatch tests +match 0 0 0 0 foo fo +match 1 1 1 1 foo/bar foo/bar +match 1 1 1 1 foo/bar 'foo/*' +match 0 0 1 1 foo/bba/arr 'foo/*' +match 1 1 1 1 foo/bba/arr 'foo/**' +match 0 0 1 1 foo/bba/arr 'foo*' +match 0 0 1 1 foo/bba/arr 'foo**' +match 0 0 1 1 foo/bba/arr 'foo/*arr' +match 0 0 1 1 foo/bba/arr 'foo/**arr' +match 0 0 0 0 foo/bba/arr 'foo/*z' +match 0 0 0 0 foo/bba/arr 'foo/**z' +match 0 0 1 1 foo/bar 'foo?bar' +match 0 0 1 1 foo/bar 'foo[/]bar' +match 0 0 1 1 foo/bar 'foo[^a-z]bar' +match 0 0 1 1 ab/cXd/efXg/hi '*Xg*i' -# Case-sensitivity features -match 0 'a' '[A-Z]' -match 1 'A' '[A-Z]' -match 0 'A' '[a-z]' -match 1 'a' '[a-z]' -match 0 'a' '[[:upper:]]' -match 1 'A' '[[:upper:]]' -match 0 'A' '[[:lower:]]' -match 1 'a' '[[:lower:]]' -match 0 'A' '[B-Za]' -match 1 'a' '[B-Za]' -match 0 'A' '[B-a]' -match 1 'a' '[B-a]' -match 0 'z' '[Z-y]' -match 1 'Z' '[Z-y]' - -imatch 1 'a' '[A-Z]' -imatch 1 'A' '[A-Z]' -imatch 1 'A' '[a-z]' -imatch 1 'a' '[a-z]' -imatch 1 'a' '[[:upper:]]' -imatch 1 'A' '[[:upper:]]' -imatch 1 'A' '[[:lower:]]' -imatch 1 'a' '[[:lower:]]' -imatch 1 'A' '[B-Za]' -imatch 1 'a' '[B-Za]' -imatch 1 'A' '[B-a]' -imatch 1 'a' '[B-a]' -imatch 1 'z' '[Z-y]' -imatch 1 'Z' '[Z-y]' +# Extra case-sensitivity tests +match 0 1 0 1 'a' '[A-Z]' +match 1 1 1 1 'A' '[A-Z]' +match 0 1 0 1 'A' '[a-z]' +match 1 1 1 1 'a' '[a-z]' +match 0 1 0 1 'a' '[[:upper:]]' +match 1 1 1 1 'A' '[[:upper:]]' +match 0 1 0 1 'A' '[[:lower:]]' +match 1 1 1 1 'a' '[[:lower:]]' +match 0 1 0 1 'A' '[B-Za]' +match 1 1 1 1 'a' '[B-Za]' +match 0 1 0 1 'A' '[B-a]' +match 1 1 1 1 'a' '[B-a]' +match 0 1 0 1 'z' '[Z-y]' +match 1 1 1 1 'Z' '[Z-y]' test_done From de8bada2bf63d274b8f7759f0ffd0b7669e52eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:22 +0000 Subject: [PATCH 08/10] wildmatch test: create & test files on disk in addition to in-memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There has never been any full roundtrip testing of what git-ls-files and other commands that use wildmatch() actually do, rather we've been satisfied with just testing the underlying C function. Due to git-ls-files and friends having their own codepaths before they call wildmatch() there's sometimes differences in the behavior between the two. Even when we test for those (as with [1]), there was no one place where you can review how these two modes differ. Now there is. We now attempt to create a file called $haystack and match $needle against it for each pair of $needle and $haystack that we were passing to test-wildmatch. If we can't create the file we skip the test. This ensures that we can run this on all platforms and not maintain some infinitely growing whitelist of e.g. platforms that don't support certain characters in filenames. A notable exception to this is Windows, where due to the reasons explained in [2] the shellscript emulation layer might fake the creation of a file such as "*", and "test -e" for it will succeed since it just got created with some character that maps to "*", but git ls-files won't be fooled by this. Thus we need to skip creating certain filenames entirely on Windows, the list here might be overly aggressive. I don't have access to a Windows system to test this. As a result of doing these tests we can now see the cases where these two ways of testing wildmatch differ: * Creating a file called 'a[]b' and running ls-files 'a[]b' will show that file, but wildmatch("a[]b", "a[]b") will not match * wildmatch() won't match a file called \ against \, but ls-files will. * `git --glob-pathspecs ls-files 'foo**'` will match a file 'foo/bba/arr', but wildmatch won't, however pathmatch will. This seems like a bug to me, the two are otherwise equivalent as these tests show. This also reveals the case discussed in [1], since 2.16.0 '' is now an error as far as ls-files is concerned, but wildmatch() itself happily accepts it. 1. 9e4e8a64c2 ("pathspec: die on empty strings as pathspec", 2017-06-06) 2. nycvar.QRO.7.76.6.1801052133380.1337@wbunaarf-fpuvaqryva.tvgsbejvaqbjf.bet (https://public-inbox.org/git/?q=nycvar.QRO.7.76.6.1801052133380.1337%40wbunaarf-fpuvaqryva.tvgsbejvaqbjf.bet) Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 201 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 190 insertions(+), 11 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 3e75cb0cbe..bd11e5acb0 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -4,6 +4,72 @@ test_description='wildmatch tests' . ./test-lib.sh +should_create_test_file() { + file=$1 + + case $file in + # `touch .` will succeed but obviously not do what we intend + # here. + ".") + return 1 + ;; + # We cannot create a file with an empty filename. + "") + return 1 + ;; + # The tests that are testing that e.g. foo//bar is matched by + # foo/*/bar can't be tested on filesystems since there's no + # way we're getting a double slash. + *//*) + return 1 + ;; + # When testing the difference between foo/bar and foo/bar/ we + # can't test the latter. + */) + return 1 + ;; + # On Windows, \ in paths is silently converted to /, which + # would result in the "touch" below working, but the test + # itself failing. See 6fd1106aa4 ("t3700: Skip a test with + # backslashes in pathspec", 2009-03-13) for prior art and + # details. + *\\*) + if ! test_have_prereq BSLASHPSPEC + then + return 1 + fi + # NOTE: The ;;& bash extension is not portable, so + # this test needs to be at the end of the pattern + # list. + # + # If we want to add more conditional returns we either + # need a new case statement, or turn this whole thing + # into a series of "if" tests. + ;; + esac + + + # On Windows proper (i.e. not Cygwin) many file names which + # under Cygwin would be emulated don't work. + if test_have_prereq MINGW + then + case $file in + " ") + # Files called " " are forbidden on Windows + return 1 + ;; + *\<*|*\>*|*:*|*\"*|*\|*|*\?*|*\**) + # Files with various special characters aren't + # allowed on Windows. Sourced from + # https://stackoverflow.com/a/31976060 + return 1 + ;; + esac + fi + + return 0 +} + match_with_function() { text=$1 pattern=$2 @@ -26,25 +92,133 @@ match_with_function() { } +match_with_ls_files() { + text=$1 + pattern=$2 + match_expect=$3 + match_function=$4 + ls_files_args=$5 + + match_stdout_stderr_cmp=" + tr -d '\0' actual && + >expect.err && + test_cmp expect.err actual.err && + test_cmp expect actual" + + if test "$match_expect" = 'E' + then + if test -e .git/created_test_file + then + test_expect_success "$match_function (via ls-files): match dies on '$pattern' '$text'" " + printf '%s' '$text' >expect && + test_must_fail git$ls_files_args ls-files -z -- '$pattern' + " + else + test_expect_failure "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' + fi + elif test "$match_expect" = 1 + then + if test -e .git/created_test_file + then + test_expect_success "$match_function (via ls-files): match '$pattern' '$text'" " + printf '%s' '$text' >expect && + git$ls_files_args ls-files -z -- '$pattern' >actual.raw 2>actual.err && + $match_stdout_stderr_cmp + " + else + test_expect_failure "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' + fi + elif test "$match_expect" = 0 + then + if test -e .git/created_test_file + then + test_expect_success "$match_function (via ls-files): no match '$pattern' '$text'" " + >expect && + git$ls_files_args ls-files -z -- '$pattern' >actual.raw 2>actual.err && + $match_stdout_stderr_cmp + " + else + test_expect_failure "$match_function (via ls-files): no match skip '$pattern' '$text'" 'false' + fi + else + test_expect_success "PANIC: Test framework error. Unknown matches value $match_expect" 'false' + fi +} + match() { - match_glob=$1 - match_iglob=$2 - match_pathmatch=$3 - match_pathmatchi=$4 - text=$5 - pattern=$6 + if test "$#" = 6 + then + # When test-wildmatch and git ls-files produce the same + # result. + match_glob=$1 + match_file_glob=$match_glob + match_iglob=$2 + match_file_iglob=$match_iglob + match_pathmatch=$3 + match_file_pathmatch=$match_pathmatch + match_pathmatchi=$4 + match_file_pathmatchi=$match_pathmatchi + text=$5 + pattern=$6 + elif test "$#" = 10 + then + match_glob=$1 + match_iglob=$2 + match_pathmatch=$3 + match_pathmatchi=$4 + match_file_glob=$5 + match_file_iglob=$6 + match_file_pathmatch=$7 + match_file_pathmatchi=$8 + text=$9 + pattern=${10} + fi + + test_expect_success 'cleanup after previous file test' ' + if test -e .git/created_test_file + then + git reset && + git clean -df + fi + ' + + printf '%s' "$text" >.git/expected_test_file + + test_expect_success "setup match file test for $text" ' + file=$(cat .git/expected_test_file) && + if should_create_test_file "$file" + then + dirs=${file%/*} + if test "$file" != "$dirs" + then + mkdir -p -- "$dirs" && + touch -- "./$text" + else + touch -- "./$file" + fi && + git add -A && + printf "%s" "$file" >.git/created_test_file + elif test -e .git/created_test_file + then + rm .git/created_test_file + fi + ' # $1: Case sensitive glob match: test-wildmatch & ls-files match_with_function "$text" "$pattern" $match_glob "wildmatch" + match_with_ls_files "$text" "$pattern" $match_file_glob "wildmatch" " --glob-pathspecs" # $2: Case insensitive glob match: test-wildmatch & ls-files match_with_function "$text" "$pattern" $match_iglob "iwildmatch" + match_with_ls_files "$text" "$pattern" $match_file_iglob "iwildmatch" " --glob-pathspecs --icase-pathspecs" # $3: Case sensitive path match: test-wildmatch & ls-files match_with_function "$text" "$pattern" $match_pathmatch "pathmatch" + match_with_ls_files "$text" "$pattern" $match_file_pathmatch "pathmatch" "" # $4: Case insensitive path match: test-wildmatch & ls-files match_with_function "$text" "$pattern" $match_pathmatchi "ipathmatch" + match_with_ls_files "$text" "$pattern" $match_file_pathmatchi "ipathmatch" " --icase-pathspecs" } # Basic wildmatch features @@ -113,7 +287,8 @@ match 1 1 1 1 'acrt' 'a[c-c]rt' match 0 0 0 0 ']' '[!]-]' match 1 1 1 1 'a' '[!]-]' match 0 0 0 0 '' '\' -match 0 0 0 0 '\' '\' +match 0 0 0 0 \ + 1 1 1 1 '\' '\' match 0 0 0 0 'XXX/\' '*/\' match 1 1 1 1 'XXX/\' '*/\\' match 1 1 1 1 'foo' 'foo' @@ -127,7 +302,8 @@ match 1 1 1 1 '[ab]' '[[:digit]ab]' match 1 1 1 1 '[ab]' '[\[:]ab]' match 1 1 1 1 '?a?b' '\??\?b' match 1 1 1 1 'abc' '\a\b\c' -match 0 0 0 0 'foo' '' +match 0 0 0 0 \ + E E E E 'foo' '' match 1 1 1 1 'foo/bar/baz/to' '**/t[o]' # Character class tests @@ -157,8 +333,10 @@ match 1 1 1 1 ']' '[\]]' match 0 0 0 0 '\]' '[\]]' match 0 0 0 0 '\' '[\]]' match 0 0 0 0 'ab' 'a[]b' -match 0 0 0 0 'a[]b' 'a[]b' -match 0 0 0 0 'ab[' 'ab[' +match 0 0 0 0 \ + 1 1 1 1 'a[]b' 'a[]b' +match 0 0 0 0 \ + 1 1 1 1 'ab[' 'ab[' match 0 0 0 0 'ab' '[!' match 0 0 0 0 'ab' '[-' match 1 1 1 1 '-' '[-]' @@ -226,7 +404,8 @@ match 1 1 1 1 foo/bar 'foo/*' match 0 0 1 1 foo/bba/arr 'foo/*' match 1 1 1 1 foo/bba/arr 'foo/**' match 0 0 1 1 foo/bba/arr 'foo*' -match 0 0 1 1 foo/bba/arr 'foo**' +match 0 0 1 1 \ + 1 1 1 1 foo/bba/arr 'foo**' match 0 0 1 1 foo/bba/arr 'foo/*arr' match 0 0 1 1 foo/bba/arr 'foo/**arr' match 0 0 0 0 foo/bba/arr 'foo/*z' From 5b1fe6ebb7ed494391a582c3fda37813fdbf28c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:23 +0000 Subject: [PATCH 09/10] test-lib: add an EXPENSIVE_ON_WINDOWS prerequisite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an EXPENSIVE_ON_WINDOWS prerequisite to mark those tests which are very expensive to run on Windows, but cheap elsewhere. Certain tests that heavily stress the filesystem or run a lot of shell commands are disproportionately expensive on Windows, this prerequisite will later be used by a tests that runs in 4-8 seconds on a modern Linux system, but takes almost 10 minutes on Windows. There's no reason to skip such tests by default on other platforms, but Windows users shouldn't need to wait around while they finish. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/test-lib.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/t/test-lib.sh b/t/test-lib.sh index 9b61f16f7a..b87a09fec7 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -1109,6 +1109,10 @@ test_lazy_prereq EXPENSIVE ' test -n "$GIT_TEST_LONG" ' +test_lazy_prereq EXPENSIVE_ON_WINDOWS ' + test_have_prereq EXPENSIVE || test_have_prereq !MINGW,!CYGWIN +' + test_lazy_prereq USR_BIN_TIME ' test -x /usr/bin/time ' From 8725923b856a8391e56a0b0a3d434fe7002cbcb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Tue, 30 Jan 2018 21:21:24 +0000 Subject: [PATCH 10/10] wildmatch test: mark test as EXPENSIVE_ON_WINDOWS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mark the newly added test which creates test files on-disk as EXPENSIVE_ON_WINDOWS. According to [1] it takes almost ten minutes to run this test file on Windows after this recent change, but just a few seconds on Linux as noted in my [2]. This could be done faster by exiting earlier, however by using this pattern we'll emit "skip" lines for each skipped test, making it clear we're not running a lot of them in the TAP output, at the cost of some overhead. 1. nycvar.QRO.7.76.6.1801061337020.1337@wbunaarf-fpuvaqryva.tvgsbejvaqbjf.bet (https://public-inbox.org/git/nycvar.QRO.7.76.6.1801061337020.1337@wbunaarf-fpuvaqryva.tvgsbejvaqbjf.bet/) 2. 87mv1raz9p.fsf@evledraar.gmail.com (https://public-inbox.org/git/87mv1raz9p.fsf@evledraar.gmail.com/) Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- t/t3070-wildmatch.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index bd11e5acb0..c1fc6ca730 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -109,36 +109,36 @@ match_with_ls_files() { then if test -e .git/created_test_file then - test_expect_success "$match_function (via ls-files): match dies on '$pattern' '$text'" " + test_expect_success EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): match dies on '$pattern' '$text'" " printf '%s' '$text' >expect && test_must_fail git$ls_files_args ls-files -z -- '$pattern' " else - test_expect_failure "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' + test_expect_failure EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' fi elif test "$match_expect" = 1 then if test -e .git/created_test_file then - test_expect_success "$match_function (via ls-files): match '$pattern' '$text'" " + test_expect_success EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): match '$pattern' '$text'" " printf '%s' '$text' >expect && git$ls_files_args ls-files -z -- '$pattern' >actual.raw 2>actual.err && $match_stdout_stderr_cmp " else - test_expect_failure "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' + test_expect_failure EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): match skip '$pattern' '$text'" 'false' fi elif test "$match_expect" = 0 then if test -e .git/created_test_file then - test_expect_success "$match_function (via ls-files): no match '$pattern' '$text'" " + test_expect_success EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): no match '$pattern' '$text'" " >expect && git$ls_files_args ls-files -z -- '$pattern' >actual.raw 2>actual.err && $match_stdout_stderr_cmp " else - test_expect_failure "$match_function (via ls-files): no match skip '$pattern' '$text'" 'false' + test_expect_failure EXPENSIVE_ON_WINDOWS "$match_function (via ls-files): no match skip '$pattern' '$text'" 'false' fi else test_expect_success "PANIC: Test framework error. Unknown matches value $match_expect" 'false' @@ -174,7 +174,7 @@ match() { pattern=${10} fi - test_expect_success 'cleanup after previous file test' ' + test_expect_success EXPENSIVE_ON_WINDOWS 'cleanup after previous file test' ' if test -e .git/created_test_file then git reset && @@ -184,7 +184,7 @@ match() { printf '%s' "$text" >.git/expected_test_file - test_expect_success "setup match file test for $text" ' + test_expect_success EXPENSIVE_ON_WINDOWS "setup match file test for $text" ' file=$(cat .git/expected_test_file) && if should_create_test_file "$file" then