Improve flags for compliance tools.

Test: m droid dist reportmissinglicenses

Change-Id: I4090dae3d5d33d1908d67dff31aeee92d2b261da
This commit is contained in:
Bob Badour
2022-06-03 10:42:27 -07:00
parent 1f0c3583a6
commit 986a839161
11 changed files with 649 additions and 239 deletions

View File

@@ -15,6 +15,7 @@
package main
import (
"bytes"
"flag"
"fmt"
"io"
@@ -24,12 +25,41 @@ import (
"sort"
"strings"
"android/soong/response"
"android/soong/tools/compliance"
)
func init() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, `Usage: %s file.meta_lic {file.meta_lic...}
var (
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
failNoLicenses = fmt.Errorf("No licenses found")
)
func main() {
var expandedArgs []string
for _, arg := range os.Args[1:] {
if strings.HasPrefix(arg, "@") {
f, err := os.Open(strings.TrimPrefix(arg, "@"))
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
respArgs, err := response.ReadRspFile(f)
f.Close()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
expandedArgs = append(expandedArgs, respArgs...)
} else {
expandedArgs = append(expandedArgs, arg)
}
}
flags := flag.NewFlagSet("flags", flag.ExitOnError)
flags.Usage = func() {
fmt.Fprintf(os.Stderr, `Usage: %s {-o outfile} file.meta_lic {file.meta_lic...}
Outputs a csv file with 1 project per line in the first field followed
by target:condition pairs describing why the project must be shared.
@@ -39,30 +69,61 @@ Soong module or Make target, and the license condition is either
restricted (e.g. GPL) or reciprocal (e.g. MPL).
`, filepath.Base(os.Args[0]))
}
}
var (
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
failNoLicenses = fmt.Errorf("No licenses found")
)
outputFile := flags.String("o", "-", "Where to write the list of projects to share. (default stdout)")
func main() {
flag.Parse()
flags.Parse(expandedArgs)
// Must specify at least one root target.
if flag.NArg() == 0 {
flag.Usage()
if flags.NArg() == 0 {
flags.Usage()
os.Exit(2)
}
err := listShare(os.Stdout, os.Stderr, compliance.FS, flag.Args()...)
if len(*outputFile) == 0 {
flags.Usage()
fmt.Fprintf(os.Stderr, "must specify file for -o; use - for stdout\n")
os.Exit(2)
} else {
dir, err := filepath.Abs(filepath.Dir(*outputFile))
if err != nil {
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %s\n", *outputFile, err)
os.Exit(1)
}
fi, err := os.Stat(dir)
if err != nil {
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %s\n", dir, *outputFile, err)
os.Exit(1)
}
if !fi.IsDir() {
fmt.Fprintf(os.Stderr, "parent %q of %q is not a directory\n", dir, *outputFile)
os.Exit(1)
}
}
var ofile io.Writer
ofile = os.Stdout
var obuf *bytes.Buffer
if *outputFile != "-" {
obuf = &bytes.Buffer{}
ofile = obuf
}
err := listShare(ofile, os.Stderr, compliance.FS, flags.Args()...)
if err != nil {
if err == failNoneRequested {
flag.Usage()
flags.Usage()
}
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)
}
if *outputFile != "-" {
err := os.WriteFile(*outputFile, obuf.Bytes(), 0666)
if err != nil {
fmt.Fprintf(os.Stderr, "could not write output to %q from %q: %s\n", *outputFile, os.Getenv("PWD"), err)
os.Exit(1)
}
}
os.Exit(0)
}
@@ -76,7 +137,7 @@ func listShare(stdout, stderr io.Writer, rootFS fs.FS, files ...string) error {
// Read the license graph from the license metadata files (*.meta_lic).
licenseGraph, err := compliance.ReadLicenseGraph(rootFS, stderr, files)
if err != nil {
return fmt.Errorf("Unable to read license metadata file(s) %q: %v\n", files, err)
return fmt.Errorf("Unable to read license metadata file(s) %q from %q: %v\n", files, os.Getenv("PWD"), err)
}
if licenseGraph == nil {
return failNoLicenses