diff --git a/go.mod b/go.mod index 11ae7f6e5..91c334257 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.22.1 require ( github.com/BurntSushi/toml v1.4.0 + github.com/bmatcuk/doublestar/v4 v4.8.1 github.com/chavacava/garif v0.1.0 github.com/fatih/color v1.18.0 github.com/fatih/structtag v1.2.0 diff --git a/go.sum b/go.sum index 157facc08..4a6d1300b 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= +github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/revivelib/core.go b/revivelib/core.go old mode 100644 new mode 100755 index 31463fe64..c327d90e7 --- a/revivelib/core.go +++ b/revivelib/core.go @@ -5,8 +5,10 @@ import ( "fmt" "log" "os" + "path/filepath" "strings" + "github.com/bmatcuk/doublestar/v4" "github.com/mgechev/dots" "github.com/mgechev/revive/config" "github.com/mgechev/revive/lint" @@ -173,7 +175,12 @@ func getPackages(includePatterns []string, excludePatterns ArrayFlags) ([][]stri globs = append(globs, ".") } - packages, err := dots.ResolvePackages(globs, normalizeSplit(excludePatterns)) + globs, skips, err := prepareSkips(globs, normalizeSplit(excludePatterns)) + if err != nil { + return nil, fmt.Errorf("prepare skips - resolving excludes before dots: %w", err) + } + + packages, err := dots.ResolvePackages(globs, skips) if err != nil { return nil, fmt.Errorf("getting packages - resolving packages in dots: %w", err) } @@ -181,6 +188,29 @@ func getPackages(includePatterns []string, excludePatterns ArrayFlags) ([][]stri return packages, nil } +func prepareSkips(globs, excludes []string) ([]string, []string, error) { + var skips []string + for _, path := range globs { + var basepath string + basepath, _ = doublestar.SplitPattern(path) + fsys := os.DirFS(basepath) + for _, skip := range excludes { + matches, err := doublestar.Glob(fsys, skip) + if err != nil { + return nil, nil, fmt.Errorf("Skips Error: %w", err) + } + for _, match := range matches { + path = basepath + "/" + match + // create skip only for .go files + if filepath.Ext(path) == ".go" { + skips = append(skips, path) + } + } + } + } + return globs, skips, nil +} + func normalizeSplit(strs []string) []string { res := []string{} diff --git a/revivelib/core_test.go b/revivelib/core_test.go index d43466093..144758af4 100644 --- a/revivelib/core_test.go +++ b/revivelib/core_test.go @@ -36,6 +36,43 @@ func TestReviveLint(t *testing.T) { } } +func TestReviveLintExcludeWithRegexp(t *testing.T) { + // ARRANGE + revive := getMockRevive(t) + + // ACT + files := []string{"../testdata/if_return.go"} + excludePatterns := []string{"*return*"} + packages := []*revivelib.LintPattern{} + for _, file := range files { + packages = append(packages, revivelib.Include(file)) + } + + for _, file := range excludePatterns { + packages = append(packages, revivelib.Exclude(file)) + } + + failures, err := revive.Lint(packages...) + + if err != nil { + t.Fatal(err) + } + + // ASSERT + failureList := []lint.Failure{} + + for failure := range failures { + failureList = append(failureList, failure) + } + + const expected = 0 + + got := len(failureList) + if got != expected { + t.Fatalf("Expected failures to have %d failures, but it has %d.", expected, got) + } +} + func TestReviveFormat(t *testing.T) { // ARRANGE revive := getMockRevive(t)