blob: eba50b3c163739ab3ebd9306f1faca149f62c691 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package lib
import (
"fmt"
)
// Walk gathers all Licenses then checks for a match within each filtered file
func Walk(config *Config) error {
metrics := new(Metrics)
metrics.Init()
file_tree := NewFileTree(config, metrics)
licenses, err := NewLicenses(config.LicensePatternDir)
if err != nil {
return err
}
for tree := range file_tree.getSingleLicenseFileIterator() {
for singleLicenseFile := range tree.singleLicenseFiles {
if err := processSingleLicenseFile(singleLicenseFile, metrics, licenses, config, tree); err != nil {
// error safe to ignore because eg. io.EOF means symlink hasn't been handled yet
fmt.Printf("warning: %s. Skipping file: %s.\n", err, tree.getPath())
}
}
}
for path := range file_tree.getFileIterator() {
if err := processFile(path, metrics, licenses, config, file_tree); err != nil {
// error safe to ignore because eg. io.EOF means symlink hasn't been handled yet
fmt.Printf("warning: %s. Skipping file: %s.\n", err, path)
}
}
file, err := createOutputFile(config)
if err != nil {
return err
}
saveToOutputFile(file, licenses, config, metrics)
metrics.print()
return nil
}
func processSingleLicenseFile(base string, metrics *Metrics, licenses *Licenses, config *Config, file_tree *FileTree) error {
// TODO(solomonkinard) larger limit for single license files?
path := file_tree.getPath() + "/" + base
data, err := readFromFile(path, config.MaxReadSize)
if err != nil {
return err
}
licenses.MatchSingleLicenseFile(data, base, metrics, file_tree)
return nil
}
func processFile(path string, metrics *Metrics, licenses *Licenses, config *Config, file_tree *FileTree) error {
fmt.Printf("visited file or dir: %q\n", path)
data, err := readFromFile(path, config.MaxReadSize)
if err != nil {
return err
}
is_matched := licenses.MatchFile(data, path, metrics)
if !is_matched {
project := file_tree.getProjectLicense(path)
if project == nil {
metrics.increment("num_unlicensed")
fmt.Printf("File license: missing. Project license: missing. path: %s\n", path)
} else {
metrics.increment("num_with_project_license")
for _, arr_license := range project.singleLicenseFiles {
for i, license := range arr_license {
if i == 0 {
metrics.increment("num_one_file_matched_to_one_single_license")
}
fmt.Printf("project license: %s\n", license.category)
metrics.increment("num_one_file_matched_to_multiple_single_licenses")
license.append(path)
}
}
fmt.Printf("File license: missing. Project license: exists. path: %s\n", path)
}
}
return nil
}
// TODO(solomonkinard) tools/zedmon/client/pubspec.yaml" error reading: EOF