internal/licenses: create the Scanner lazily
It takes about 8 seconds to create, so avoid doing it at program
startup.
Change-Id: I7f5837e6eba695d74eafbff22719e7cdec24b8f5
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/284236
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/licenses/licenses.go b/internal/licenses/licenses.go
index e40d986..4b4d310 100644
--- a/internal/licenses/licenses.go
+++ b/internal/licenses/licenses.go
@@ -28,6 +28,7 @@
"path/filepath"
"sort"
"strings"
+ "sync"
"github.com/google/licensecheck"
oldlicensecheck "github.com/google/licensecheck/old"
@@ -264,14 +265,20 @@
return lics
}
-var scanner *licensecheck.Scanner
+var (
+ _scanner *licensecheck.Scanner
+ scannerOnce sync.Once
+)
-func init() {
- var err error
- scanner, err = licensecheck.NewScanner(append(exceptionLicenses, licensecheck.BuiltinLicenses()...))
- if err != nil {
- log.Fatalf(context.Background(), "licensecheck.NewScanner: %v", err)
- }
+func scanner() *licensecheck.Scanner {
+ scannerOnce.Do(func() {
+ var err error
+ _scanner, err = licensecheck.NewScanner(append(exceptionLicenses, licensecheck.BuiltinLicenses()...))
+ if err != nil {
+ log.Fatalf(context.Background(), "licensecheck.NewScanner: %v", err)
+ }
+ })
+ return _scanner
}
// A Detector detects licenses in a module and its packages.
@@ -483,7 +490,7 @@
if logf == nil {
logf = func(string, ...interface{}) {}
}
- cov := scanner.Scan(contents)
+ cov := scanner().Scan(contents)
if cov.Percent < float64(coverageThreshold) {
logf("%s license coverage too low (%+v), skipping", filename, cov)
return []string{unknownLicenseType}, cov