You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by ke...@apache.org on 2021/10/02 03:21:08 UTC
[skywalking-eyes] 01/01: Speed up the initialization phase
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch perf/init-templates
in repository https://gitbox.apache.org/repos/asf/skywalking-eyes.git
commit c2730c887fdf3c452dddb6dba0a04442e8d17248
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Sat Oct 2 11:15:27 2021 +0800
Speed up the initialization phase
---
pkg/license/identifier.go | 46 +++++++++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 13 deletions(-)
diff --git a/pkg/license/identifier.go b/pkg/license/identifier.go
index e74da75..d9338bb 100644
--- a/pkg/license/identifier.go
+++ b/pkg/license/identifier.go
@@ -19,9 +19,11 @@ package license
import (
"fmt"
+ "io/fs"
"path/filepath"
"regexp"
"strings"
+ "sync"
"github.com/apache/skywalking-eyes/license-eye/assets"
"github.com/apache/skywalking-eyes/license-eye/internal/logger"
@@ -37,23 +39,32 @@ var dualLicensePatterns = []*regexp.Regexp{
regexp.MustCompile(`(?i)This project is covered by two different licenses: (?P<license>[^.]+)`),
}
-var normalizedTemplates = make(map[string]string)
+var normalizedTemplates = sync.Map{}
func init() {
+ wg := sync.WaitGroup{}
for _, dir := range templatesDirs {
files, err := assets.AssetDir(dir)
if err != nil {
logger.Log.Fatalln("Failed to read license template directory:", dir, err)
}
+ wg.Add(len(files))
for _, template := range files {
- name := template.Name()
- t, err := assets.Asset(filepath.Join(dir, name))
- if err != nil {
- logger.Log.Fatalln("Failed to read license template:", dir, err)
- }
- normalizedTemplates[dir+"/"+name] = Normalize(string(t))
+ go loadTemplate(&wg, dir, template)
}
}
+ wg.Wait()
+}
+
+func loadTemplate(wg *sync.WaitGroup, dir string, template fs.DirEntry) {
+ defer wg.Done()
+
+ name := template.Name()
+ t, err := assets.Asset(filepath.Join(dir, name))
+ if err != nil {
+ logger.Log.Fatalln("Failed to read license template:", dir, err)
+ }
+ normalizedTemplates.Store(dir+"/"+name, Normalize(string(t)))
}
// Identify identifies the Spdx ID of the given license content
@@ -68,17 +79,26 @@ func Identify(pkgPath, content string) (string, error) {
}
content = Normalize(content)
+ logger.Log.Debugf("Normalized content for %+v:\n%+v\n", pkgPath, content)
+
+ result := make(chan string, 1)
+ normalizedTemplates.Range(func(key, value interface{}) bool {
+ name := key.(string)
+ license := value.(string)
- for name, license := range normalizedTemplates {
// Should not use `Contains` as a root LICENSE file may include other licenses the project uses,
// `Contains` would identify the last one license as the project's license.
if strings.HasPrefix(content, license) {
name = filepath.Base(name)
- return strings.TrimSuffix(name, filepath.Ext(name)), nil
+ result <- strings.TrimSuffix(name, filepath.Ext(name))
+ return false
}
+ return true
+ })
+ select {
+ case license := <-result:
+ return license, nil
+ default:
+ return "", fmt.Errorf("cannot identify license content")
}
-
- logger.Log.Debugf("Normalized content for %+v:\n%+v\n", pkgPath, content)
-
- return "", fmt.Errorf("cannot identify license content")
}