1
0
mirror of https://github.com/mgechev/revive.git synced 2025-11-27 22:18:41 +02:00

prepareSkips: to resolve regexps in excludes (#1060)

* prepareSkips: to resolve regexps in excludes

* prepareSkips: to resolve regexps in excludes

* cleanup

* errorf: format

* doublestar/v4: latest version
This commit is contained in:
Marcin Federowicz
2025-02-04 19:17:59 +01:00
committed by GitHub
parent fd8d99d716
commit e8b55f8917
4 changed files with 71 additions and 1 deletions

1
go.mod
View File

@@ -4,6 +4,7 @@ go 1.22.1
require ( require (
github.com/BurntSushi/toml v1.4.0 github.com/BurntSushi/toml v1.4.0
github.com/bmatcuk/doublestar/v4 v4.8.1
github.com/chavacava/garif v0.1.0 github.com/chavacava/garif v0.1.0
github.com/fatih/color v1.18.0 github.com/fatih/color v1.18.0
github.com/fatih/structtag v1.2.0 github.com/fatih/structtag v1.2.0

2
go.sum
View File

@@ -1,5 +1,7 @@
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= 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/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 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc=
github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= 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= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

32
revivelib/core.go Normal file → Executable file
View File

@@ -5,8 +5,10 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"path/filepath"
"strings" "strings"
"github.com/bmatcuk/doublestar/v4"
"github.com/mgechev/dots" "github.com/mgechev/dots"
"github.com/mgechev/revive/config" "github.com/mgechev/revive/config"
"github.com/mgechev/revive/lint" "github.com/mgechev/revive/lint"
@@ -173,7 +175,12 @@ func getPackages(includePatterns []string, excludePatterns ArrayFlags) ([][]stri
globs = append(globs, ".") 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 { if err != nil {
return nil, fmt.Errorf("getting packages - resolving packages in dots: %w", err) 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 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 { func normalizeSplit(strs []string) []string {
res := []string{} res := []string{}

View File

@@ -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) { func TestReviveFormat(t *testing.T) {
// ARRANGE // ARRANGE
revive := getMockRevive(t) revive := getMockRevive(t)