This is an automated email from the ASF dual-hosted git repository. kezhenxu94 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/skywalking-eyes.git
commit 9176312e255c1d9083b1cf90fb09d9bc49fa4e47 Author: kezhenxu94 <[email protected]> AuthorDate: Sun Dec 20 22:43:58 2020 +0800 Refactor the config, result, and check logic --- commands/header/check.go | 49 +++++++-------------------- pkg/header/check.go | 52 +++++++++++----------------- pkg/header/config.go | 69 ++++++++++++++++++++++++++++++++++++++ pkg/header/{model.go => result.go} | 37 ++++++++++++++++---- 4 files changed, 132 insertions(+), 75 deletions(-) diff --git a/commands/header/check.go b/commands/header/check.go index b020882..9668894 100644 --- a/commands/header/check.go +++ b/commands/header/check.go @@ -16,11 +16,7 @@ package header import ( "github.com/spf13/cobra" - "gopkg.in/yaml.v3" - "io/ioutil" - "license-checker/internal/logger" "license-checker/pkg/header" - "strings" ) var ( @@ -34,43 +30,24 @@ var CheckCommand = &cobra.Command{ Aliases: []string{"c"}, RunE: func(cmd *cobra.Command, args []string) error { var config header.Config - if err := loadConfig(&config); err != nil { + var result header.Result + + if err := config.Parse(cfgFile); err != nil { return err } - return header.Check(&config) - }, -} - -func init() { - CheckCommand.Flags().StringVarP(&cfgFile, "config", "c", ".licenserc.yaml", "the config file") -} - -// loadConfig reads and parses the header check configurations in config file. -func loadConfig(config *header.Config) error { - logger.Log.Infoln("Loading configuration from file:", cfgFile) - bytes, err := ioutil.ReadFile(cfgFile) - if err != nil { - return err - } - - if err = yaml.Unmarshal(bytes, config); err != nil { - return err - } - - var lines []string - for _, line := range strings.Split(config.License, "\n") { - if len(line) > 0 { - lines = append(lines, strings.Trim(line, header.CommentChars)) + if err := header.Check(&config, &result); err != nil { + return err } - } - config.License = strings.Join(lines, " ") - logger.Log.Infoln("License header is:", config.License) + if result.HasFailure() { + return result.Error() + } - if len(config.Paths) == 0 { - config.Paths = []string{"**"} - } + return nil + }, +} - return nil +func init() { + CheckCommand.Flags().StringVarP(&cfgFile, "config", "c", ".licenserc.yaml", "the config file") } diff --git a/pkg/header/check.go b/pkg/header/check.go index 0defbe4..9f1cf62 100644 --- a/pkg/header/check.go +++ b/pkg/header/check.go @@ -16,7 +16,6 @@ package header import ( "bufio" - "fmt" "github.com/bmatcuk/doublestar/v2" "license-checker/internal/logger" "os" @@ -24,25 +23,16 @@ import ( "strings" ) -const CommentChars = "/*#- " +const CommentChars = "/*#- !" // Check checks the license headers of the specified paths/globs. -func Check(config *Config) error { - var result Result - +func Check(config *Config, result *Result) error { for _, pattern := range config.Paths { - if err := checkPattern(pattern, &result, config); err != nil { + if err := checkPattern(pattern, result, config); err != nil { return err } } - if len(result.Failure) > 0 { - return fmt.Errorf( - "The following files don't have a valid license header: \n%v", - strings.Join(result.Failure, "\n"), - ) - } - return nil } @@ -53,11 +43,10 @@ func checkPattern(pattern string, result *Result, config *Config) error { return err } - logger.Log.Infoln("Checking matched paths:", paths) - for _, path := range paths { - logger.Log.Debugln("Checking path:", path) - + if yes, err := config.ShouldIgnore(path); yes || err != nil { + continue + } if err = checkPath(path, result, config); err != nil { return err } @@ -67,6 +56,10 @@ func checkPattern(pattern string, result *Result, config *Config) error { } func checkPath(path string, result *Result, config *Config) error { + if yes, err := config.ShouldIgnore(path); yes || err != nil { + return err + } + pathInfo, err := os.Stat(path) if err != nil { @@ -92,21 +85,16 @@ func checkPath(path string, result *Result, config *Config) error { return nil } +var seen = make(map[string]bool) + func checkFile(file string, result *Result, config *Config) error { - skip := false - for _, ignorePattern := range config.PathsIgnore { - logger.Log.Debugln("Checking ignore pattern:", ignorePattern) - - if ignored, err := doublestar.Match(ignorePattern, file); ignored || err != nil { - logger.Log.Infoln("Ignoring path:", file) - skip = ignored - break - } - } - if skip { - return nil + if yes, err := config.ShouldIgnore(file); yes || seen[file] || err != nil { + seen[file] = true + return err } + seen[file] = true + logger.Log.Debugln("Checking file:", file) reader, err := os.Open(file) @@ -125,13 +113,13 @@ func checkFile(file string, result *Result, config *Config) error { } } - if content := strings.Join(lines, " "); !strings.Contains(content, config.License) { + if content := strings.Join(lines, " "); !strings.Contains(content, config.NormalizedLicense()) { logger.Log.Debugln("Content is:", content) logger.Log.Debugln("License is:", config.License) - result.Failure = append(result.Failure, file) + result.Fail(file) } else { - result.Success = append(result.Success, file) + result.Succeed(file) } return nil diff --git a/pkg/header/config.go b/pkg/header/config.go new file mode 100644 index 0000000..7ff1371 --- /dev/null +++ b/pkg/header/config.go @@ -0,0 +1,69 @@ +// Copyright © 2020 Hoshea Jiang <[email protected]> +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package header + +import ( + "github.com/bmatcuk/doublestar/v2" + "gopkg.in/yaml.v3" + "io/ioutil" + "license-checker/internal/logger" + "strings" +) + +type Config struct { + License string `yaml:"license"` + Paths []string `yaml:"paths"` + PathsIgnore []string `yaml:"paths-ignore"` +} + +// NormalizedLicense returns the normalized string of the license content, +// "normalized" means the linebreaks and CommentChars are all trimmed. +func (config *Config) NormalizedLicense() string { + var lines []string + for _, line := range strings.Split(config.License, "\n") { + if len(line) > 0 { + lines = append(lines, strings.Trim(line, CommentChars)) + } + } + return strings.Join(lines, " ") +} + +// Parse reads and parses the header check configurations in config file. +func (config *Config) Parse(file string) error { + logger.Log.Infoln("Loading configuration from file:", file) + + if bytes, err := ioutil.ReadFile(file); err != nil { + return err + } else if err = yaml.Unmarshal(bytes, config); err != nil { + return err + } + + logger.Log.Infoln("License header is:", config.NormalizedLicense()) + + if len(config.Paths) == 0 { + config.Paths = []string{"**"} + } + + return nil +} + +func (config *Config) ShouldIgnore(path string) (bool, error) { + for _, ignorePattern := range config.PathsIgnore { + if matched, err := doublestar.Match(ignorePattern, path); matched || err != nil { + return matched, err + } + } + return false, nil +} diff --git a/pkg/header/model.go b/pkg/header/result.go similarity index 51% rename from pkg/header/model.go rename to pkg/header/result.go index 5af67fd..c79ce9c 100644 --- a/pkg/header/model.go +++ b/pkg/header/result.go @@ -14,13 +14,36 @@ package header -type Config struct { - License string `yaml:"license"` - Paths []string `yaml:"paths"` - PathsIgnore []string `yaml:"paths-ignore"` -} +import ( + "fmt" + "strings" +) type Result struct { - Success []string `yaml:"success"` - Failure []string `yaml:"failure"` + Success []string + Failure []string + Ignored []string +} + +func (result *Result) Fail(file string) { + result.Failure = append(result.Failure, file) +} + +func (result *Result) Succeed(file string) { + result.Success = append(result.Success, file) +} + +func (result *Result) Ignore(file string) { + result.Ignored = append(result.Ignored, file) +} + +func (result *Result) HasFailure() bool { + return len(result.Failure) > 0 +} + +func (result *Result) Error() error { + return fmt.Errorf( + "The following files don't have a valid license header: \n%v", + strings.Join(result.Failure, "\n"), + ) }
