diff --git a/cmd/restic/cmd_restore.go b/cmd/restic/cmd_restore.go index 331f2d86f..da3818b63 100644 --- a/cmd/restic/cmd_restore.go +++ b/cmd/restic/cmd_restore.go @@ -143,12 +143,12 @@ func runRestore(opts RestoreOptions, gopts GlobalOptions, args []string) error { excludePatterns := filter.ParsePatterns(opts.Exclude) insensitiveExcludePatterns := filter.ParsePatterns(opts.InsensitiveExclude) selectExcludeFilter := func(item string, dstpath string, node *restic.Node) (selectedForRestore bool, childMayBeSelected bool) { - matched, _, err := filter.List(excludePatterns, item) + matched, err := filter.List(excludePatterns, item) if err != nil { Warnf("error for exclude pattern: %v", err) } - matchedInsensitive, _, err := filter.List(insensitiveExcludePatterns, strings.ToLower(item)) + matchedInsensitive, err := filter.List(insensitiveExcludePatterns, strings.ToLower(item)) if err != nil { Warnf("error for iexclude pattern: %v", err) } @@ -166,12 +166,12 @@ func runRestore(opts RestoreOptions, gopts GlobalOptions, args []string) error { includePatterns := filter.ParsePatterns(opts.Include) insensitiveIncludePatterns := filter.ParsePatterns(opts.InsensitiveInclude) selectIncludeFilter := func(item string, dstpath string, node *restic.Node) (selectedForRestore bool, childMayBeSelected bool) { - matched, childMayMatch, err := filter.List(includePatterns, item) + matched, childMayMatch, err := filter.ListWithChild(includePatterns, item) if err != nil { Warnf("error for include pattern: %v", err) } - matchedInsensitive, childMayMatchInsensitive, err := filter.List(insensitiveIncludePatterns, strings.ToLower(item)) + matchedInsensitive, childMayMatchInsensitive, err := filter.ListWithChild(insensitiveIncludePatterns, strings.ToLower(item)) if err != nil { Warnf("error for iexclude pattern: %v", err) } diff --git a/cmd/restic/exclude.go b/cmd/restic/exclude.go index 0295b00f1..db603c04e 100644 --- a/cmd/restic/exclude.go +++ b/cmd/restic/exclude.go @@ -76,7 +76,7 @@ type RejectFunc func(path string, fi os.FileInfo) bool func rejectByPattern(patterns []string) RejectByNameFunc { parsedPatterns := filter.ParsePatterns(patterns) return func(item string) bool { - matched, _, err := filter.List(parsedPatterns, item) + matched, err := filter.List(parsedPatterns, item) if err != nil { Warnf("error for exclude pattern: %v", err) } diff --git a/internal/filter/filter.go b/internal/filter/filter.go index 5eb119f49..90526ddcc 100644 --- a/internal/filter/filter.go +++ b/internal/filter/filter.go @@ -194,7 +194,18 @@ func ParsePatterns(patterns []string) []Pattern { } // List returns true if str matches one of the patterns. Empty patterns are ignored. -func List(patterns []Pattern, str string) (matched bool, childMayMatch bool, err error) { +func List(patterns []Pattern, str string) (matched bool, err error) { + matched, _, err = list(patterns, false, str) + return matched, err +} + +// ListWithChild returns true if str matches one of the patterns. Empty patterns are ignored. +func ListWithChild(patterns []Pattern, str string) (matched bool, childMayMatch bool, err error) { + return list(patterns, true, str) +} + +// List returns true if str matches one of the patterns. Empty patterns are ignored. +func list(patterns []Pattern, checkChildMatches bool, str string) (matched bool, childMayMatch bool, err error) { if len(patterns) == 0 { return false, false, nil } @@ -209,9 +220,14 @@ func List(patterns []Pattern, str string) (matched bool, childMayMatch bool, err return false, false, err } - c, err := childMatch(pat, strs) - if err != nil { - return false, false, err + var c bool + if checkChildMatches { + c, err = childMatch(pat, strs) + if err != nil { + return false, false, err + } + } else { + c = true } matched = matched || m diff --git a/internal/filter/filter_test.go b/internal/filter/filter_test.go index f7cf1dd82..9d487a582 100644 --- a/internal/filter/filter_test.go +++ b/internal/filter/filter_test.go @@ -260,7 +260,7 @@ var filterListTests = []struct { func TestList(t *testing.T) { for i, test := range filterListTests { patterns := filter.ParsePatterns(test.patterns) - match, _, err := filter.List(patterns, test.path) + match, err := filter.List(patterns, test.path) if err != nil { t.Errorf("test %d failed: expected no error for patterns %q, but error returned: %v", i, test.patterns, err) @@ -276,7 +276,7 @@ func TestList(t *testing.T) { func ExampleList() { patterns := filter.ParsePatterns([]string{"*.c", "*.go"}) - match, _, _ := filter.List(patterns, "/home/user/file.go") + match, _ := filter.List(patterns, "/home/user/file.go") fmt.Printf("match: %v\n", match) // Output: // match: true @@ -294,7 +294,7 @@ func TestInvalidStrs(t *testing.T) { } patterns := []string{"test"} - _, _, err = filter.List(filter.ParsePatterns(patterns), "") + _, err = filter.List(filter.ParsePatterns(patterns), "") if err == nil { t.Error("List accepted invalid path") } @@ -302,13 +302,13 @@ func TestInvalidStrs(t *testing.T) { func TestInvalidPattern(t *testing.T) { patterns := []string{"test/["} - _, _, err := filter.List(filter.ParsePatterns(patterns), "test/example") + _, err := filter.List(filter.ParsePatterns(patterns), "test/example") if err == nil { t.Error("List accepted invalid pattern") } patterns = []string{"test/**/["} - _, _, err = filter.List(filter.ParsePatterns(patterns), "test/example") + _, err = filter.List(filter.ParsePatterns(patterns), "test/example") if err == nil { t.Error("List accepted invalid pattern") } @@ -435,7 +435,7 @@ func BenchmarkFilterPatterns(b *testing.B) { for i := 0; i < b.N; i++ { c = 0 for _, line := range lines { - match, _, err := filter.List(test.patterns, line) + match, err := filter.List(test.patterns, line) if err != nil { b.Fatal(err) }