Improve flags for compliance tools.
Test: m droid dist reportmissinglicenses Change-Id: I4090dae3d5d33d1908d67dff31aeee92d2b261da
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user