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"),
+       )
 }

Reply via email to