Merge "Track dependencies when reading notice files" am: 133e2651a5
am: 258a183c36
am: 89351613a6
am: 865cfd6f1d
Original change: https://android-review.googlesource.com/c/platform/build/+/1965959 Change-Id: I9fa36225ceecbed4f80b36d96dbfffc2d6267df2
This commit is contained in:
@@ -55,7 +55,10 @@ blueprint_go_binary {
|
|||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "htmlnotice",
|
name: "htmlnotice",
|
||||||
srcs: ["cmd/htmlnotice/htmlnotice.go"],
|
srcs: ["cmd/htmlnotice/htmlnotice.go"],
|
||||||
deps: ["compliance-module"],
|
deps: [
|
||||||
|
"compliance-module",
|
||||||
|
"blueprint-deptools",
|
||||||
|
],
|
||||||
testSrcs: ["cmd/htmlnotice/htmlnotice_test.go"],
|
testSrcs: ["cmd/htmlnotice/htmlnotice_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +72,10 @@ blueprint_go_binary {
|
|||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "textnotice",
|
name: "textnotice",
|
||||||
srcs: ["cmd/textnotice/textnotice.go"],
|
srcs: ["cmd/textnotice/textnotice.go"],
|
||||||
deps: ["compliance-module"],
|
deps: [
|
||||||
|
"compliance-module",
|
||||||
|
"blueprint-deptools",
|
||||||
|
],
|
||||||
testSrcs: ["cmd/textnotice/textnotice_test.go"],
|
testSrcs: ["cmd/textnotice/textnotice_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,10 +26,13 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/tools/compliance"
|
"android/soong/tools/compliance"
|
||||||
|
|
||||||
|
"github.com/google/blueprint/deptools"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
outputFile = flag.String("o", "-", "Where to write the NOTICE text file. (default stdout)")
|
outputFile = flag.String("o", "-", "Where to write the NOTICE text file. (default stdout)")
|
||||||
|
depsFile = flag.String("d", "", "Where to write the deps file")
|
||||||
includeTOC = flag.Bool("toc", true, "Whether to include a table of contents.")
|
includeTOC = flag.Bool("toc", true, "Whether to include a table of contents.")
|
||||||
stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root")
|
stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root")
|
||||||
title = flag.String("title", "", "The title of the notice file.")
|
title = flag.String("title", "", "The title of the notice file.")
|
||||||
@@ -45,6 +48,7 @@ type context struct {
|
|||||||
includeTOC bool
|
includeTOC bool
|
||||||
stripPrefix string
|
stripPrefix string
|
||||||
title string
|
title string
|
||||||
|
deps *[]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -95,7 +99,9 @@ func main() {
|
|||||||
ofile = &bytes.Buffer{}
|
ofile = &bytes.Buffer{}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := &context{ofile, os.Stderr, os.DirFS("."), *includeTOC, *stripPrefix, *title}
|
var deps []string
|
||||||
|
|
||||||
|
ctx := &context{ofile, os.Stderr, os.DirFS("."), *includeTOC, *stripPrefix, *title, &deps}
|
||||||
|
|
||||||
err := htmlNotice(ctx, flag.Args()...)
|
err := htmlNotice(ctx, flag.Args()...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -112,6 +118,13 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if *depsFile != "" {
|
||||||
|
err := deptools.WriteDepFile(*depsFile, *outputFile, deps)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "could not write deps to %q: %s\n", *depsFile, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,5 +226,7 @@ func htmlNotice(ctx *context, files ...string) error {
|
|||||||
}
|
}
|
||||||
fmt.Fprintln(ctx.stdout, "</body></html>")
|
fmt.Fprintln(ctx.stdout, "</body></html>")
|
||||||
|
|
||||||
|
*ctx.deps = ni.InputNoticeFiles()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"html"
|
"html"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -51,13 +52,14 @@ func TestMain(m *testing.M) {
|
|||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
name string
|
name string
|
||||||
roots []string
|
roots []string
|
||||||
includeTOC bool
|
includeTOC bool
|
||||||
stripPrefix string
|
stripPrefix string
|
||||||
title string
|
title string
|
||||||
expectedOut []matcher
|
expectedOut []matcher
|
||||||
|
expectedDeps []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -73,6 +75,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/lib/libb.so"},
|
usedBy{"highest.apex/lib/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -100,6 +103,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/lib/libb.so"},
|
usedBy{"highest.apex/lib/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -117,6 +121,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/lib/libb.so"},
|
usedBy{"highest.apex/lib/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -146,6 +151,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/lib/libb.so"},
|
usedBy{"highest.apex/lib/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -161,6 +167,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/libb.so"},
|
usedBy{"container.zip/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -172,6 +179,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -183,6 +191,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -194,6 +203,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -215,6 +225,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -236,6 +250,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -251,6 +269,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -268,6 +290,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -279,6 +305,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -300,6 +327,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -321,6 +352,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -336,6 +371,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -353,6 +392,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -364,6 +407,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -389,6 +433,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -414,6 +463,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -429,6 +483,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
restricted{},
|
restricted{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -448,6 +506,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -459,6 +522,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -485,6 +549,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -511,6 +580,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -526,6 +600,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -543,6 +621,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -554,6 +636,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
@@ -566,7 +649,9 @@ func Test(t *testing.T) {
|
|||||||
rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r)
|
rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context{stdout, stderr, os.DirFS("."), tt.includeTOC, tt.stripPrefix, tt.title}
|
var deps []string
|
||||||
|
|
||||||
|
ctx := context{stdout, stderr, os.DirFS("."), tt.includeTOC, tt.stripPrefix, tt.title, &deps}
|
||||||
|
|
||||||
err := htmlNotice(&ctx, rootFiles...)
|
err := htmlNotice(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -625,6 +710,15 @@ func Test(t *testing.T) {
|
|||||||
for ; lineno < len(tt.expectedOut); lineno++ {
|
for ; lineno < len(tt.expectedOut); lineno++ {
|
||||||
t.Errorf("htmlnotice: missing output line %d: ended early, want %q", lineno+1, tt.expectedOut[lineno].String())
|
t.Errorf("htmlnotice: missing output line %d: ended early, want %q", lineno+1, tt.expectedOut[lineno].String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.Logf("got deps: %q", deps)
|
||||||
|
|
||||||
|
t.Logf("want deps: %q", tt.expectedDeps)
|
||||||
|
|
||||||
|
if g, w := deps, tt.expectedDeps; !reflect.DeepEqual(g, w) {
|
||||||
|
t.Errorf("unexpected deps, wanted:\n%s\ngot:\n%s\n",
|
||||||
|
strings.Join(w, "\n"), strings.Join(g, "\n"))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,10 +25,13 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/tools/compliance"
|
"android/soong/tools/compliance"
|
||||||
|
|
||||||
|
"github.com/google/blueprint/deptools"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
outputFile = flag.String("o", "-", "Where to write the NOTICE text file. (default stdout)")
|
outputFile = flag.String("o", "-", "Where to write the NOTICE text file. (default stdout)")
|
||||||
|
depsFile = flag.String("d", "", "Where to write the deps file")
|
||||||
stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root")
|
stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root")
|
||||||
|
|
||||||
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
||||||
@@ -40,6 +43,7 @@ type context struct {
|
|||||||
stderr io.Writer
|
stderr io.Writer
|
||||||
rootFS fs.FS
|
rootFS fs.FS
|
||||||
stripPrefix string
|
stripPrefix string
|
||||||
|
deps *[]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -90,7 +94,9 @@ func main() {
|
|||||||
ofile = &bytes.Buffer{}
|
ofile = &bytes.Buffer{}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := &context{ofile, os.Stderr, os.DirFS("."), *stripPrefix}
|
var deps []string
|
||||||
|
|
||||||
|
ctx := &context{ofile, os.Stderr, os.DirFS("."), *stripPrefix, &deps}
|
||||||
|
|
||||||
err := textNotice(ctx, flag.Args()...)
|
err := textNotice(ctx, flag.Args()...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -107,6 +113,13 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if *depsFile != "" {
|
||||||
|
err := deptools.WriteDepFile(*depsFile, *outputFile, deps)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "could not write deps to %q: %s\n", *depsFile, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,5 +163,8 @@ func textNotice(ctx *context, files ...string) error {
|
|||||||
ctx.stdout.Write(ni.HashText(h))
|
ctx.stdout.Write(ni.HashText(h))
|
||||||
fmt.Fprintln(ctx.stdout)
|
fmt.Fprintln(ctx.stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*ctx.deps = ni.InputNoticeFiles()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -40,11 +41,12 @@ func TestMain(m *testing.M) {
|
|||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
name string
|
name string
|
||||||
roots []string
|
roots []string
|
||||||
stripPrefix string
|
stripPrefix string
|
||||||
expectedOut []matcher
|
expectedOut []matcher
|
||||||
|
expectedDeps []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -60,6 +62,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/lib/libb.so"},
|
usedBy{"highest.apex/lib/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -75,6 +78,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/libb.so"},
|
usedBy{"container.zip/libb.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -86,6 +90,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -97,6 +102,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
@@ -108,6 +114,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
firstParty{},
|
firstParty{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/firstparty/FIRST_PARTY_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -129,6 +136,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -150,6 +161,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -165,6 +180,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -182,6 +201,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
@@ -193,6 +216,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -214,6 +238,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -235,6 +263,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -250,6 +282,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -267,6 +303,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
@@ -278,6 +318,9 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/notice/NOTICE_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -303,6 +346,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -328,6 +376,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -343,6 +396,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
restricted{},
|
restricted{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -362,6 +419,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
reciprocal{},
|
reciprocal{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/reciprocal/RECIPROCAL_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
@@ -373,6 +435,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -399,6 +462,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"highest.apex/bin/bin1"},
|
usedBy{"highest.apex/bin/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -425,6 +493,11 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"container.zip/bin1"},
|
usedBy{"container.zip/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
"testdata/restricted/RESTRICTED_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -440,6 +513,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"application"},
|
usedBy{"application"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -457,6 +534,10 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"bin/bin1"},
|
usedBy{"bin/bin1"},
|
||||||
proprietary{},
|
proprietary{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{
|
||||||
|
"testdata/firstparty/FIRST_PARTY_LICENSE",
|
||||||
|
"testdata/proprietary/PROPRIETARY_LICENSE",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
@@ -468,6 +549,7 @@ func Test(t *testing.T) {
|
|||||||
usedBy{"lib/libd.so"},
|
usedBy{"lib/libd.so"},
|
||||||
notice{},
|
notice{},
|
||||||
},
|
},
|
||||||
|
expectedDeps: []string{"testdata/notice/NOTICE_LICENSE"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
@@ -480,7 +562,9 @@ func Test(t *testing.T) {
|
|||||||
rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r)
|
rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context{stdout, stderr, os.DirFS("."), tt.stripPrefix}
|
var deps []string
|
||||||
|
|
||||||
|
ctx := context{stdout, stderr, os.DirFS("."), tt.stripPrefix, &deps}
|
||||||
|
|
||||||
err := textNotice(&ctx, rootFiles...)
|
err := textNotice(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -512,6 +596,15 @@ func Test(t *testing.T) {
|
|||||||
for ; lineno < len(tt.expectedOut); lineno++ {
|
for ; lineno < len(tt.expectedOut); lineno++ {
|
||||||
t.Errorf("textnotice: missing output line %d: ended early, want %q", lineno+1, tt.expectedOut[lineno].String())
|
t.Errorf("textnotice: missing output line %d: ended early, want %q", lineno+1, tt.expectedOut[lineno].String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.Logf("got deps: %q", deps)
|
||||||
|
|
||||||
|
t.Logf("want deps: %q", tt.expectedDeps)
|
||||||
|
|
||||||
|
if g, w := deps, tt.expectedDeps; !reflect.DeepEqual(g, w) {
|
||||||
|
t.Errorf("unexpected deps, wanted:\n%s\ngot:\n%s\n",
|
||||||
|
strings.Join(w, "\n"), strings.Join(g, "\n"))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -62,6 +62,8 @@ type NoticeIndex struct {
|
|||||||
targetHashes map[*TargetNode]map[hash]struct{}
|
targetHashes map[*TargetNode]map[hash]struct{}
|
||||||
// projectName maps project directory names to project name text.
|
// projectName maps project directory names to project name text.
|
||||||
projectName map[string]string
|
projectName map[string]string
|
||||||
|
// files lists all the files accessed during indexing
|
||||||
|
files []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// IndexLicenseTexts creates a hashed index of license texts for `lg` and `rs`
|
// IndexLicenseTexts creates a hashed index of license texts for `lg` and `rs`
|
||||||
@@ -71,14 +73,17 @@ func IndexLicenseTexts(rootFS fs.FS, lg *LicenseGraph, rs ResolutionSet) (*Notic
|
|||||||
rs = ResolveNotices(lg)
|
rs = ResolveNotices(lg)
|
||||||
}
|
}
|
||||||
ni := &NoticeIndex{
|
ni := &NoticeIndex{
|
||||||
lg, rs, ShippedNodes(lg), rootFS,
|
lg: lg,
|
||||||
make(map[string]hash),
|
rs: rs,
|
||||||
make(map[hash][]byte),
|
shipped: ShippedNodes(lg),
|
||||||
make(map[hash]map[string]map[string]struct{}),
|
rootFS: rootFS,
|
||||||
make(map[string]map[hash]map[string]struct{}),
|
hash: make(map[string]hash),
|
||||||
make(map[string]map[hash]struct{}),
|
text: make(map[hash][]byte),
|
||||||
make(map[*TargetNode]map[hash]struct{}),
|
hashLibInstall: make(map[hash]map[string]map[string]struct{}),
|
||||||
make(map[string]string),
|
installHashLib: make(map[string]map[hash]map[string]struct{}),
|
||||||
|
libHash: make(map[string]map[hash]struct{}),
|
||||||
|
targetHashes: make(map[*TargetNode]map[hash]struct{}),
|
||||||
|
projectName: make(map[string]string),
|
||||||
}
|
}
|
||||||
|
|
||||||
// index adds all license texts for `tn` to the index.
|
// index adds all license texts for `tn` to the index.
|
||||||
@@ -208,6 +213,13 @@ func (ni *NoticeIndex) Hashes() chan hash {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InputNoticeFiles returns the list of files that were hashed during IndexLicenseTexts.
|
||||||
|
func (ni *NoticeIndex) InputNoticeFiles() []string {
|
||||||
|
files := append([]string(nil), ni.files...)
|
||||||
|
sort.Strings(files)
|
||||||
|
return files
|
||||||
|
}
|
||||||
|
|
||||||
// HashLibs returns the ordered array of library names using the license text
|
// HashLibs returns the ordered array of library names using the license text
|
||||||
// hashed as `h`.
|
// hashed as `h`.
|
||||||
func (ni *NoticeIndex) HashLibs(h hash) []string {
|
func (ni *NoticeIndex) HashLibs(h hash) []string {
|
||||||
@@ -449,6 +461,8 @@ func (ni *NoticeIndex) addText(file string) error {
|
|||||||
ni.text[hash] = text
|
ni.text[hash] = text
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ni.files = append(ni.files, file)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user