diff --git a/internal/filter/filter.go b/internal/filter/filter.go index 0b25c98c4..0cc9512d4 100644 --- a/internal/filter/filter.go +++ b/internal/filter/filter.go @@ -17,6 +17,10 @@ var ErrBadString = errors.New("filter.Match: string is empty") // // Pattern can be a combination of patterns suitable for filepath.Match, joined // by filepath.Separator. +// +// In addition patterns suitable for filepath.Match, pattern accepts a +// recursive wildcard '**', which greedily matches an arbitrary number of +// intermediate directories. func Match(pattern, str string) (matched bool, err error) { if pattern == "" { return true, nil @@ -46,6 +50,10 @@ func Match(pattern, str string) (matched bool, err error) { // // Pattern can be a combination of patterns suitable for filepath.Match, joined // by filepath.Separator. +// +// In addition patterns suitable for filepath.Match, pattern accepts a +// recursive wildcard '**', which greedily matches an arbitrary number of +// intermediate directories. func ChildMatch(pattern, str string) (matched bool, err error) { if pattern == "" { return true, nil diff --git a/internal/filter/filter_test.go b/internal/filter/filter_test.go index 5e940369c..bd2070e56 100644 --- a/internal/filter/filter_test.go +++ b/internal/filter/filter_test.go @@ -76,6 +76,7 @@ var matchTests = []struct { {"foo/**/bar/*.go", "/home/user/foo/bar/test.go", true}, {"foo/**/bar/*.go", "x/foo/bar/test.go", true}, {"foo/**/bar/*.go", "foo/bar/test.go", true}, + {"foo/**/bar/*.go", "foo/bar/baz/bar/test.go", true}, {"foo/**/bar/*.go", "/home/user/foo/test.c", false}, {"foo/**/bar/*.go", "bar/foo/main.go", false}, {"foo/**/bar/*.go", "/foo/bar/main.go", true}, @@ -144,6 +145,7 @@ var childMatchTests = []struct { {"/foo/bar/baz", "/foo/bar", true}, {"/foo/bar/baz", "/foo/baz", false}, {"/foo/**/baz", "/foo/bar/baz", true}, + {"/foo/**/baz", "/foo/bar/baz/blah", true}, {"/foo/**/qux", "/foo/bar/baz/qux", true}, {"/baz/bar", "/foo", false}, {"/foo", "/foo/bar", true},