From 374a73c1cdd33cd6c3607a090add39026b551d7e Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Wed, 27 Oct 2021 11:12:48 +0200 Subject: [PATCH 1/4] Add --skip-dirs flag --- cmd/porto/main.go | 8 ++++++++ import.go | 12 +++++++----- import_test.go | 14 +++++++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmd/porto/main.go b/cmd/porto/main.go index 7dabcac..27ddff3 100644 --- a/cmd/porto/main.go +++ b/cmd/porto/main.go @@ -14,6 +14,7 @@ func main() { flagWriteOutputToFile := flag.Bool("w", false, "write result to (source) file instead of stdout") flagListDiff := flag.Bool("l", false, "list files whose vanity import differs from porto's") flagSkipFiles := flag.String("skip-files", "", "Regexps of files to skip") + flagSkipDirs := flag.String("skip-dirs", "", "Regexps of directories to skip") flagIncludeInternal := flag.Bool("include-internal", false, "include internal folders") flag.Parse() @@ -26,6 +27,7 @@ Options: -w Write result to (source) file instead of stdout (default: false) -l List files whose vanity import differs from porto's (default: false) --skip-files Regexps of files to skip +--skip-dirs Regexps of directories to skip --include-internal Include internal folders Examples: @@ -51,10 +53,16 @@ Add import path to a folder log.Fatalf("failed to build files regexes: %v", err) } + skipDirsRegex, err := porto.GetRegexpList(*flagSkipDirs) + if err != nil { + log.Fatalf("failed to build directories regexes: %v", err) + } + diffCount, err := porto.FindAndAddVanityImportForDir(workingDir, baseAbsDir, porto.Options{ WriteResultToFile: *flagWriteOutputToFile, ListDiffFiles: *flagListDiff, SkipFilesRegexes: skipFilesRegex, + SkipDirsRegexes: skipDirsRegex, IncludeInternal: *flagIncludeInternal, }) if err != nil { diff --git a/import.go b/import.go index b08d634..7cae7c5 100644 --- a/import.go +++ b/import.go @@ -106,7 +106,7 @@ func findAndAddVanityImportForModuleDir(workingDir, absDir string, moduleName st gc := 0 for _, f := range files { - if isDir, dirName := f.IsDir(), f.Name(); isDir { + if isDir, dirName := f.IsDir(), f.Name(); isDir && !matchesAny(opts.SkipDirsRegexes, dirName) { var ( c int err error @@ -127,7 +127,7 @@ func findAndAddVanityImportForModuleDir(workingDir, absDir string, moduleName st } gc += c - } else if fileName := f.Name(); isGoFile(fileName) && !isGoTestFile(fileName) && !isIgnoredFile(opts.SkipFilesRegexes, fileName) { + } else if fileName := f.Name(); isGoFile(fileName) && !isGoTestFile(fileName) && !matchesAny(opts.SkipFilesRegexes, fileName) { absFilepath := absDir + pathSeparator + fileName hasChanged, newContent, err := addImportPath(absDir+pathSeparator+fileName, moduleName) @@ -170,9 +170,9 @@ func findAndAddVanityImportForModuleDir(workingDir, absDir string, moduleName st return gc, nil } -func isIgnoredFile(fileRegexes []*regexp.Regexp, filename string) bool { - for _, fr := range fileRegexes { - if matched := fr.MatchString(filename); matched { +func matchesAny(regexes []*regexp.Regexp, str string) bool { + for _, fr := range regexes { + if matched := fr.MatchString(str); matched { return true } } @@ -227,6 +227,8 @@ type Options struct { ListDiffFiles bool // Set of regex for matching files to be skipped SkipFilesRegexes []*regexp.Regexp + // Set of regex for matching directories to be skipped + SkipDirsRegexes []*regexp.Regexp // Include internal packages IncludeInternal bool } diff --git a/import_test.go b/import_test.go index 5bccb23..4d99c3b 100644 --- a/import_test.go +++ b/import_test.go @@ -74,10 +74,10 @@ func TestFindFilesWithVanityImport(t *testing.T) { } -func TestIsIgnoredFile(t *testing.T) { +func TestMatchesAny(t *testing.T) { assert.True( t, - isIgnoredFile( + matchesAny( []*regexp.Regexp{regexp.MustCompile(".*\\.pb\\.go$")}, "myfile.pb.go", ), @@ -85,11 +85,19 @@ func TestIsIgnoredFile(t *testing.T) { assert.False( t, - isIgnoredFile( + matchesAny( []*regexp.Regexp{}, "myfile.pb.go", ), ) + + assert.True( + t, + matchesAny( + []*regexp.Regexp{regexp.MustCompile("^third_party$")}, + "third_party", + ), + ) } func TestIsUnexportedModule(t *testing.T) { From 823e44a38dd648fefad8ee503065325fcf3bf7e3 Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Wed, 27 Oct 2021 11:16:10 +0200 Subject: [PATCH 2/4] Add --skip-dirs-use-default flag --- cmd/porto/main.go | 20 ++++++++++++++------ regexes.go | 11 +++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/cmd/porto/main.go b/cmd/porto/main.go index 27ddff3..0d5e829 100644 --- a/cmd/porto/main.go +++ b/cmd/porto/main.go @@ -6,6 +6,7 @@ import ( "log" "os" "path/filepath" + "regexp" "github.com/jcchavezs/porto" ) @@ -15,6 +16,7 @@ func main() { flagListDiff := flag.Bool("l", false, "list files whose vanity import differs from porto's") flagSkipFiles := flag.String("skip-files", "", "Regexps of files to skip") flagSkipDirs := flag.String("skip-dirs", "", "Regexps of directories to skip") + flagSkipDefaultDirs := flag.Bool("skip-dirs-use-default", true, "use default skip directory list") flagIncludeInternal := flag.Bool("include-internal", false, "include internal folders") flag.Parse() @@ -24,11 +26,12 @@ func main() { usage: porto [options] Options: --w Write result to (source) file instead of stdout (default: false) --l List files whose vanity import differs from porto's (default: false) ---skip-files Regexps of files to skip ---skip-dirs Regexps of directories to skip ---include-internal Include internal folders +-w Write result to (source) file instead of stdout (default: false) +-l List files whose vanity import differs from porto's (default: false) +--skip-files Regexps of files to skip +--skip-dirs Regexps of directories to skip +--skip-dirs-use-default Use default skip directory list (default: true) +--include-internal Include internal folders Examples: @@ -53,10 +56,15 @@ Add import path to a folder log.Fatalf("failed to build files regexes: %v", err) } - skipDirsRegex, err := porto.GetRegexpList(*flagSkipDirs) + var skipDirsRegex []*regexp.Regexp + if *flagSkipDefaultDirs { + skipDirsRegex = append(skipDirsRegex, porto.StdExcludeDirRegexps...) + } + userSkipDirsRegex, err := porto.GetRegexpList(*flagSkipDirs) if err != nil { log.Fatalf("failed to build directories regexes: %v", err) } + skipDirsRegex = append(skipDirsRegex, userSkipDirsRegex...) diffCount, err := porto.FindAndAddVanityImportForDir(workingDir, baseAbsDir, porto.Options{ WriteResultToFile: *flagWriteOutputToFile, diff --git a/regexes.go b/regexes.go index cbfe16c..831df4a 100644 --- a/regexes.go +++ b/regexes.go @@ -6,6 +6,17 @@ import ( "strings" ) +// StdExcludeDirRegexps is the standard directory exclusion list from golangci-lint. +// See https://github.com/golangci/golangci-lint/blob/master/pkg/packages/skip.go. +var StdExcludeDirRegexps = []*regexp.Regexp{ + regexp.MustCompile("^vendor$"), + regexp.MustCompile("^third_party$"), + regexp.MustCompile("^testdata$"), + regexp.MustCompile("^examples$"), + regexp.MustCompile("^Godeps$"), + regexp.MustCompile("^builtin$"), +} + func GetRegexpList(regexps string) ([]*regexp.Regexp, error) { var regexes []*regexp.Regexp if len(regexps) > 0 { From 462be736f5e245f2a410670ca208f7009e532afb Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Wed, 27 Oct 2021 11:29:52 +0200 Subject: [PATCH 3/4] Update documentation --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c3fd916..104779b 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,22 @@ If you just want to list the files that porto would change vanity import, run: ```bash porto -l path/to/library ``` +## Inclusion/exclusion rules -If you want to ignore files (e.g. proto generated files), pass the `--skip-files` flag: +`porto` skips autogenerated, internal, third party and vendored files by default. You can customize what files get included using some flags: + +- If you want to ignore files (e.g. proto generated files), pass the `--skip-files` flag: ```bash porto --skip-files ".*\\.pb\\.go$" path/to/library ``` +- If you want to ignore directories (e.g. tooling directories), pass the `--skip-dirs` flag: -If you want to include `internal` folders too +```bash +porto --skip-dirs "^tools$" path/to/library +``` +- If you want to include `internal` folders and directories skipped by default: ```bash -porto --include-internal path/to/library +porto --include-internal --skip-dirs-use-default=false path/to/library ``` From 257a1607ec9fb0a1e309fee78155f0301134546f Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Wed, 27 Oct 2021 11:33:49 +0200 Subject: [PATCH 4/4] Increase cyclomatic complexity limit --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 41df480..4a72e5d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,6 +24,6 @@ linters-settings: lll: line-length: 170 gocyclo: - min-complexity: 20 + min-complexity: 25 golint: min-confidence: 0.85