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:07 UTC

[skywalking-eyes] branch perf/init-templates created (now c2730c8)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch perf/init-templates
in repository https://gitbox.apache.org/repos/asf/skywalking-eyes.git.


      at c2730c8  Speed up the initialization phase

This branch includes the following new commits:

     new c2730c8  Speed up the initialization phase

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[skywalking-eyes] 01/01: Speed up the initialization phase

Posted by ke...@apache.org.
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")
 }