Merge changes I3db6310e,I061be2b9,I7e81936d,If0684cf1,I404b138f am: e4442b7df6
am: 07da3e7574
am: 16cb1328e7
Original change: https://android-review.googlesource.com/c/platform/build/+/1964245 Change-Id: I2031fefe60d0d8f60deb78fddb844db4f8992b2c
This commit is contained in:
@@ -19,58 +19,58 @@ package {
|
|||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "bom",
|
name: "bom",
|
||||||
srcs: ["cmd/bom.go"],
|
srcs: ["cmd/bom/bom.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/bom_test.go"],
|
testSrcs: ["cmd/bom/bom_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "checkshare",
|
name: "checkshare",
|
||||||
srcs: ["cmd/checkshare.go"],
|
srcs: ["cmd/checkshare/checkshare.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/checkshare_test.go"],
|
testSrcs: ["cmd/checkshare/checkshare_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "listshare",
|
name: "listshare",
|
||||||
srcs: ["cmd/listshare.go"],
|
srcs: ["cmd/listshare/listshare.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/listshare_test.go"],
|
testSrcs: ["cmd/listshare/listshare_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "dumpgraph",
|
name: "dumpgraph",
|
||||||
srcs: ["cmd/dumpgraph.go"],
|
srcs: ["cmd/dumpgraph/dumpgraph.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/dumpgraph_test.go"],
|
testSrcs: ["cmd/dumpgraph/dumpgraph_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "dumpresolutions",
|
name: "dumpresolutions",
|
||||||
srcs: ["cmd/dumpresolutions.go"],
|
srcs: ["cmd/dumpresolutions/dumpresolutions.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/dumpresolutions_test.go"],
|
testSrcs: ["cmd/dumpresolutions/dumpresolutions_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "htmlnotice",
|
name: "htmlnotice",
|
||||||
srcs: ["cmd/htmlnotice.go"],
|
srcs: ["cmd/htmlnotice/htmlnotice.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/htmlnotice_test.go"],
|
testSrcs: ["cmd/htmlnotice/htmlnotice_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "shippedlibs",
|
name: "shippedlibs",
|
||||||
srcs: ["cmd/shippedlibs.go"],
|
srcs: ["cmd/shippedlibs/shippedlibs.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/shippedlibs_test.go"],
|
testSrcs: ["cmd/shippedlibs/shippedlibs_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
blueprint_go_binary {
|
blueprint_go_binary {
|
||||||
name: "textnotice",
|
name: "textnotice",
|
||||||
srcs: ["cmd/textnotice.go"],
|
srcs: ["cmd/textnotice/textnotice.go"],
|
||||||
deps: ["compliance-module"],
|
deps: ["compliance-module"],
|
||||||
testSrcs: ["cmd/textnotice_test.go"],
|
testSrcs: ["cmd/textnotice/textnotice_test.go"],
|
||||||
}
|
}
|
||||||
|
|
||||||
bootstrap_go_package {
|
bootstrap_go_package {
|
||||||
@@ -81,14 +81,14 @@ bootstrap_go_package {
|
|||||||
"doc.go",
|
"doc.go",
|
||||||
"graph.go",
|
"graph.go",
|
||||||
"noticeindex.go",
|
"noticeindex.go",
|
||||||
"policy/policy.go",
|
"policy_policy.go",
|
||||||
"policy/resolve.go",
|
"policy_resolve.go",
|
||||||
"policy/resolvenotices.go",
|
"policy_resolvenotices.go",
|
||||||
"policy/resolveshare.go",
|
"policy_resolveshare.go",
|
||||||
"policy/resolveprivacy.go",
|
"policy_resolveprivacy.go",
|
||||||
"policy/shareprivacyconflicts.go",
|
"policy_shareprivacyconflicts.go",
|
||||||
"policy/shipped.go",
|
"policy_shipped.go",
|
||||||
"policy/walk.go",
|
"policy_walk.go",
|
||||||
"readgraph.go",
|
"readgraph.go",
|
||||||
"resolution.go",
|
"resolution.go",
|
||||||
"resolutionset.go",
|
"resolutionset.go",
|
||||||
@@ -97,14 +97,14 @@ bootstrap_go_package {
|
|||||||
"condition_test.go",
|
"condition_test.go",
|
||||||
"conditionset_test.go",
|
"conditionset_test.go",
|
||||||
"readgraph_test.go",
|
"readgraph_test.go",
|
||||||
"policy/policy_test.go",
|
"policy_policy_test.go",
|
||||||
"policy/resolve_test.go",
|
"policy_resolve_test.go",
|
||||||
"policy/resolvenotices_test.go",
|
"policy_resolvenotices_test.go",
|
||||||
"policy/resolveshare_test.go",
|
"policy_resolveshare_test.go",
|
||||||
"policy/resolveprivacy_test.go",
|
"policy_resolveprivacy_test.go",
|
||||||
"policy/shareprivacyconflicts_test.go",
|
"policy_shareprivacyconflicts_test.go",
|
||||||
"policy/shipped_test.go",
|
"policy_shipped_test.go",
|
||||||
"policy/walk_test.go",
|
"policy_walk_test.go",
|
||||||
"resolutionset_test.go",
|
"resolutionset_test.go",
|
||||||
"test_util.go",
|
"test_util.go",
|
||||||
],
|
],
|
||||||
@@ -113,5 +113,5 @@ bootstrap_go_package {
|
|||||||
"golang-protobuf-encoding-prototext",
|
"golang-protobuf-encoding-prototext",
|
||||||
"license_metadata_proto",
|
"license_metadata_proto",
|
||||||
],
|
],
|
||||||
pkgPath: "compliance",
|
pkgPath: "android/soong/tools/compliance",
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -24,6 +23,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -69,12 +70,12 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
fi, err := os.Stat(dir)
|
fi, err := os.Stat(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %w\n", dir, *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %s\n", dir, *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if !fi.IsDir() {
|
if !fi.IsDir() {
|
||||||
@@ -102,7 +103,7 @@ func main() {
|
|||||||
if *outputFile != "-" {
|
if *outputFile != "-" {
|
||||||
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "could not write output to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "could not write output to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -17,11 +17,22 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -31,9 +42,9 @@ func Test(t *testing.T) {
|
|||||||
expectedOut []string
|
expectedOut []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional",
|
stripPrefix: "out/target/product/fictional",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"/system/apex/highest.apex",
|
"/system/apex/highest.apex",
|
||||||
@@ -44,9 +55,9 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/data/",
|
stripPrefix: "out/target/product/fictional/data/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"container.zip",
|
"container.zip",
|
||||||
@@ -57,23 +68,23 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/bin/",
|
stripPrefix: "out/target/product/fictional/bin/",
|
||||||
expectedOut: []string{"application"},
|
expectedOut: []string{"application"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"bin/bin1"},
|
expectedOut: []string{"bin/bin1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"lib/libd.so"},
|
expectedOut: []string{"lib/libd.so"},
|
||||||
},
|
},
|
||||||
@@ -102,27 +113,27 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"out/target/product/fictional/bin/application"},
|
expectedOut: []string{"out/target/product/fictional/bin/application"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"out/target/product/fictional/system/bin/bin1"},
|
expectedOut: []string{"out/target/product/fictional/system/bin/bin1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"out/target/product/fictional/system/lib/libd.so"},
|
expectedOut: []string{"out/target/product/fictional/system/lib/libd.so"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/apex/",
|
stripPrefix: "out/target/product/fictional/system/apex/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"highest.apex",
|
"highest.apex",
|
||||||
@@ -133,9 +144,9 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/data/",
|
stripPrefix: "out/target/product/fictional/data/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"container.zip",
|
"container.zip",
|
||||||
@@ -146,30 +157,30 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/bin/",
|
stripPrefix: "out/target/product/fictional/bin/",
|
||||||
expectedOut: []string{"application"},
|
expectedOut: []string{"application"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"bin/bin1"},
|
expectedOut: []string{"bin/bin1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"lib/libd.so"},
|
expectedOut: []string{"lib/libd.so"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/apex/",
|
stripPrefix: "out/target/product/fictional/system/apex/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"highest.apex",
|
"highest.apex",
|
||||||
@@ -180,9 +191,9 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/data/",
|
stripPrefix: "out/target/product/fictional/data/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"container.zip",
|
"container.zip",
|
||||||
@@ -193,30 +204,30 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/bin/",
|
stripPrefix: "out/target/product/fictional/bin/",
|
||||||
expectedOut: []string{"application"},
|
expectedOut: []string{"application"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"bin/bin1"},
|
expectedOut: []string{"bin/bin1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"lib/libd.so"},
|
expectedOut: []string{"lib/libd.so"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/apex/",
|
stripPrefix: "out/target/product/fictional/system/apex/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"highest.apex",
|
"highest.apex",
|
||||||
@@ -227,9 +238,9 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/data/",
|
stripPrefix: "out/target/product/fictional/data/",
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
"container.zip",
|
"container.zip",
|
||||||
@@ -240,23 +251,23 @@ func Test(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/bin/",
|
stripPrefix: "out/target/product/fictional/bin/",
|
||||||
expectedOut: []string{"application"},
|
expectedOut: []string{"application"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"bin/bin1"},
|
expectedOut: []string{"bin/bin1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
stripPrefix: "out/target/product/fictional/system/",
|
stripPrefix: "out/target/product/fictional/system/",
|
||||||
expectedOut: []string{"lib/libd.so"},
|
expectedOut: []string{"lib/libd.so"},
|
||||||
},
|
},
|
||||||
@@ -275,7 +286,7 @@ func Test(t *testing.T) {
|
|||||||
|
|
||||||
err := billOfMaterials(&ctx, rootFiles...)
|
err := billOfMaterials(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("bom: error = %w, stderr = %v", err, stderr)
|
t.Fatalf("bom: error = %v, stderr = %v", err, stderr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if stderr.Len() > 0 {
|
if stderr.Len() > 0 {
|
@@ -15,13 +15,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -46,12 +47,11 @@ outputs "FAIL" to stdout and exits with status 1.
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
failConflicts = fmt.Errorf("conflicts")
|
failConflicts = fmt.Errorf("conflicts")
|
||||||
failNoneRequested = fmt.Errorf("\nNo metadata files requested")
|
failNoneRequested = fmt.Errorf("\nNo metadata files requested")
|
||||||
failNoLicenses = fmt.Errorf("No licenses")
|
failNoLicenses = fmt.Errorf("No licenses")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
// byError orders conflicts by error string
|
// byError orders conflicts by error string
|
||||||
type byError []compliance.SourceSharePrivacyConflict
|
type byError []compliance.SourceSharePrivacyConflict
|
||||||
|
|
@@ -17,10 +17,21 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
type outcome struct {
|
type outcome struct {
|
||||||
target string
|
target string
|
||||||
privacyCondition string
|
privacyCondition string
|
@@ -15,7 +15,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -23,6 +22,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -31,7 +32,7 @@ var (
|
|||||||
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")
|
||||||
failNoLicenses = fmt.Errorf("No licenses found")
|
failNoLicenses = fmt.Errorf("No licenses found")
|
||||||
)
|
)
|
||||||
|
|
||||||
type context struct {
|
type context struct {
|
@@ -17,10 +17,21 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test_plaintext(t *testing.T) {
|
func Test_plaintext(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -1217,7 +1228,7 @@ func Test_graphviz(t *testing.T) {
|
|||||||
outList := strings.Split(stdout.String(), "\n")
|
outList := strings.Split(stdout.String(), "\n")
|
||||||
outLine := 0
|
outLine := 0
|
||||||
if outList[outLine] != "strict digraph {" {
|
if outList[outLine] != "strict digraph {" {
|
||||||
t.Errorf("dumpgraph: got 1st line %v, want strict digraph {")
|
t.Errorf("dumpgraph: got 1st line %v, want strict digraph {", outList[outLine])
|
||||||
}
|
}
|
||||||
outLine++
|
outLine++
|
||||||
if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") {
|
if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") {
|
@@ -15,7 +15,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -23,6 +22,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -32,7 +33,7 @@ var (
|
|||||||
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")
|
||||||
failNoLicenses = fmt.Errorf("No licenses found")
|
failNoLicenses = fmt.Errorf("No licenses found")
|
||||||
)
|
)
|
||||||
|
|
||||||
type context struct {
|
type context struct {
|
@@ -16,12 +16,24 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compliance"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test_plaintext(t *testing.T) {
|
func Test_plaintext(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -97,7 +109,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share",
|
name: "apex_trimmed_share",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesShared.AsList(),
|
conditions: compliance.ImpliesShared.AsList(),
|
||||||
stripPrefix: "testdata/firstparty/",
|
stripPrefix: "testdata/firstparty/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -107,7 +119,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_private",
|
name: "apex_trimmed_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesPrivate.AsList(),
|
conditions: compliance.ImpliesPrivate.AsList(),
|
||||||
stripPrefix: "testdata/firstparty/",
|
stripPrefix: "testdata/firstparty/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -117,7 +129,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share_private",
|
name: "apex_trimmed_share_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: append(compliance.ImpliesPrivate.AsList(),compliance.ImpliesShared.AsList()...),
|
conditions: append(compliance.ImpliesPrivate.AsList(), compliance.ImpliesShared.AsList()...),
|
||||||
stripPrefix: "testdata/firstparty/",
|
stripPrefix: "testdata/firstparty/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -255,7 +267,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share",
|
name: "apex_trimmed_share",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesShared.AsList(),
|
conditions: compliance.ImpliesShared.AsList(),
|
||||||
stripPrefix: "testdata/notice/",
|
stripPrefix: "testdata/notice/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -265,7 +277,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_private",
|
name: "apex_trimmed_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesPrivate.AsList(),
|
conditions: compliance.ImpliesPrivate.AsList(),
|
||||||
stripPrefix: "testdata/notice/",
|
stripPrefix: "testdata/notice/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -275,7 +287,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share_private",
|
name: "apex_trimmed_share_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: append(compliance.ImpliesShared.AsList(),compliance.ImpliesPrivate.AsList()...),
|
conditions: append(compliance.ImpliesShared.AsList(), compliance.ImpliesPrivate.AsList()...),
|
||||||
stripPrefix: "testdata/notice/",
|
stripPrefix: "testdata/notice/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -408,7 +420,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share",
|
name: "apex_trimmed_share",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesShared.AsList(),
|
conditions: compliance.ImpliesShared.AsList(),
|
||||||
stripPrefix: "testdata/reciprocal/",
|
stripPrefix: "testdata/reciprocal/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -424,7 +436,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_private",
|
name: "apex_trimmed_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesPrivate.AsList(),
|
conditions: compliance.ImpliesPrivate.AsList(),
|
||||||
stripPrefix: "testdata/reciprocal/",
|
stripPrefix: "testdata/reciprocal/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -434,7 +446,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share_private",
|
name: "apex_trimmed_share_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: append(compliance.ImpliesShared.AsList(),compliance.ImpliesPrivate.AsList()...),
|
conditions: append(compliance.ImpliesShared.AsList(), compliance.ImpliesPrivate.AsList()...),
|
||||||
stripPrefix: "testdata/reciprocal/",
|
stripPrefix: "testdata/reciprocal/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -573,7 +585,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share",
|
name: "apex_trimmed_share",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesShared.AsList(),
|
conditions: compliance.ImpliesShared.AsList(),
|
||||||
stripPrefix: "testdata/restricted/",
|
stripPrefix: "testdata/restricted/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -597,7 +609,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_private",
|
name: "apex_trimmed_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesPrivate.AsList(),
|
conditions: compliance.ImpliesPrivate.AsList(),
|
||||||
stripPrefix: "testdata/restricted/",
|
stripPrefix: "testdata/restricted/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{},
|
expectedOut: []string{},
|
||||||
@@ -607,7 +619,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share_private",
|
name: "apex_trimmed_share_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: append(compliance.ImpliesShared.AsList(),compliance.ImpliesPrivate.AsList()...),
|
conditions: append(compliance.ImpliesShared.AsList(), compliance.ImpliesPrivate.AsList()...),
|
||||||
stripPrefix: "testdata/restricted/",
|
stripPrefix: "testdata/restricted/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -754,7 +766,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share",
|
name: "apex_trimmed_share",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesShared.AsList(),
|
conditions: compliance.ImpliesShared.AsList(),
|
||||||
stripPrefix: "testdata/proprietary/",
|
stripPrefix: "testdata/proprietary/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -771,7 +783,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_private",
|
name: "apex_trimmed_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: compliance.ImpliesPrivate.AsList(),
|
conditions: compliance.ImpliesPrivate.AsList(),
|
||||||
stripPrefix: "testdata/proprietary/",
|
stripPrefix: "testdata/proprietary/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -789,7 +801,7 @@ func Test_plaintext(t *testing.T) {
|
|||||||
name: "apex_trimmed_share_private",
|
name: "apex_trimmed_share_private",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
ctx: context{
|
ctx: context{
|
||||||
conditions: append(compliance.ImpliesShared.AsList(),compliance.ImpliesPrivate.AsList()...),
|
conditions: append(compliance.ImpliesShared.AsList(), compliance.ImpliesPrivate.AsList()...),
|
||||||
stripPrefix: "testdata/proprietary/",
|
stripPrefix: "testdata/proprietary/",
|
||||||
},
|
},
|
||||||
expectedOut: []string{
|
expectedOut: []string{
|
||||||
@@ -930,7 +942,7 @@ type targetMatcher struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newTestCondition constructs a test license condition in the license graph.
|
// newTestCondition constructs a test license condition in the license graph.
|
||||||
func newTestCondition(lg *compliance.LicenseGraph, conditionName... string) compliance.LicenseConditionSet {
|
func newTestCondition(lg *compliance.LicenseGraph, conditionName ...string) compliance.LicenseConditionSet {
|
||||||
cs := compliance.NewLicenseConditionSet()
|
cs := compliance.NewLicenseConditionSet()
|
||||||
for _, name := range conditionName {
|
for _, name := range conditionName {
|
||||||
cs = cs.Plus(compliance.RecognizedConditionNames[name])
|
cs = cs.Plus(compliance.RecognizedConditionNames[name])
|
||||||
@@ -3305,7 +3317,7 @@ func Test_graphviz(t *testing.T) {
|
|||||||
outList := strings.Split(stdout.String(), "\n")
|
outList := strings.Split(stdout.String(), "\n")
|
||||||
outLine := 0
|
outLine := 0
|
||||||
if outList[outLine] != "strict digraph {" {
|
if outList[outLine] != "strict digraph {" {
|
||||||
t.Errorf("dumpresolutions: got 1st line %v, want strict digraph {")
|
t.Errorf("dumpresolutions: got 1st line %v, want strict digraph {", outList[outLine])
|
||||||
}
|
}
|
||||||
outLine++
|
outLine++
|
||||||
if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") {
|
if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") {
|
@@ -16,7 +16,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html"
|
"html"
|
||||||
@@ -25,6 +24,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -74,12 +75,12 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
fi, err := os.Stat(dir)
|
fi, err := os.Stat(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %w\n", dir, *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %s\n", dir, *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if !fi.IsDir() {
|
if !fi.IsDir() {
|
||||||
@@ -107,7 +108,7 @@ func main() {
|
|||||||
if *outputFile != "-" {
|
if *outputFile != "-" {
|
||||||
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "could not write output to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "could not write output to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -139,13 +140,13 @@ func htmlNotice(ctx *context, files ...string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintln(ctx.stdout, "<!DOCTYPE html>")
|
fmt.Fprintln(ctx.stdout, "<!DOCTYPE html>")
|
||||||
fmt.Fprintln(ctx.stdout, "<html><head>\n")
|
fmt.Fprintln(ctx.stdout, "<html><head>")
|
||||||
fmt.Fprintln(ctx.stdout, "<style type=\"text/css\">")
|
fmt.Fprintln(ctx.stdout, "<style type=\"text/css\">")
|
||||||
fmt.Fprintln(ctx.stdout, "body { padding: 2px; margin: 0; }")
|
fmt.Fprintln(ctx.stdout, "body { padding: 2px; margin: 0; }")
|
||||||
fmt.Fprintln(ctx.stdout, "ul { list-style-type: none; margin: 0; padding: 0; }")
|
fmt.Fprintln(ctx.stdout, "ul { list-style-type: none; margin: 0; padding: 0; }")
|
||||||
fmt.Fprintln(ctx.stdout, "li { padding-left: 1em; }")
|
fmt.Fprintln(ctx.stdout, "li { padding-left: 1em; }")
|
||||||
fmt.Fprintln(ctx.stdout, ".file-list { margin-left: 1em; }")
|
fmt.Fprintln(ctx.stdout, ".file-list { margin-left: 1em; }")
|
||||||
fmt.Fprintln(ctx.stdout, "</style>\n")
|
fmt.Fprintln(ctx.stdout, "</style>")
|
||||||
if 0 < len(ctx.title) {
|
if 0 < len(ctx.title) {
|
||||||
fmt.Fprintf(ctx.stdout, "<title>%s</title>\n", html.EscapeString(ctx.title))
|
fmt.Fprintf(ctx.stdout, "<title>%s</title>\n", html.EscapeString(ctx.title))
|
||||||
}
|
}
|
@@ -39,6 +39,16 @@ var (
|
|||||||
libReference = regexp.MustCompile(`^\s*<li><a href="#[^"]{32}">(.*)</a>\s*$`)
|
libReference = regexp.MustCompile(`^\s*<li><a href="#[^"]{32}">(.*)</a>\s*$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -560,7 +570,7 @@ func Test(t *testing.T) {
|
|||||||
|
|
||||||
err := htmlNotice(&ctx, rootFiles...)
|
err := htmlNotice(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("htmlnotice: error = %w, stderr = %v", err, stderr)
|
t.Fatalf("htmlnotice: error = %v, stderr = %v", err, stderr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if stderr.Len() > 0 {
|
if stderr.Len() > 0 {
|
@@ -15,7 +15,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -23,6 +22,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -41,7 +42,7 @@ restricted (e.g. GPL) or reciprocal (e.g. MPL).
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
||||||
failNoLicenses = fmt.Errorf("No licenses found")
|
failNoLicenses = fmt.Errorf("No licenses found")
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
@@ -16,10 +16,22 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
type projectShare struct {
|
type projectShare struct {
|
||||||
project string
|
project string
|
@@ -16,26 +16,27 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
outputFile = flag.String("o", "-", "Where to write the library list. (default stdout)")
|
outputFile = flag.String("o", "-", "Where to write the library list. (default stdout)")
|
||||||
|
|
||||||
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
failNoneRequested = fmt.Errorf("\nNo license metadata files requested")
|
||||||
failNoLicenses = fmt.Errorf("No licenses found")
|
failNoLicenses = fmt.Errorf("No licenses found")
|
||||||
)
|
)
|
||||||
|
|
||||||
type context struct {
|
type context struct {
|
||||||
stdout io.Writer
|
stdout io.Writer
|
||||||
stderr io.Writer
|
stderr io.Writer
|
||||||
rootFS fs.FS
|
rootFS fs.FS
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -66,12 +67,12 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
fi, err := os.Stat(dir)
|
fi, err := os.Stat(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %w\n", dir, *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %s\n", dir, *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if !fi.IsDir() {
|
if !fi.IsDir() {
|
||||||
@@ -99,7 +100,7 @@ func main() {
|
|||||||
if *outputFile != "-" {
|
if *outputFile != "-" {
|
||||||
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "could not write output to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "could not write output to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -17,11 +17,22 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -30,153 +41,153 @@ func Test(t *testing.T) {
|
|||||||
expectedOut []string
|
expectedOut []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
expectedOut: []string{"Android"},
|
expectedOut: []string{"Android"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
expectedOut: []string{"Android"},
|
expectedOut: []string{"Android"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"Android"},
|
expectedOut: []string{"Android"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"Android"},
|
expectedOut: []string{"Android"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "firstparty",
|
condition: "firstparty",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"Android"},
|
expectedOut: []string{"Android"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device"},
|
expectedOut: []string{"Android", "Device"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "notice",
|
condition: "notice",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"External"},
|
expectedOut: []string{"External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device"},
|
expectedOut: []string{"Android", "Device"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "reciprocal",
|
condition: "reciprocal",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"External"},
|
expectedOut: []string{"External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device"},
|
expectedOut: []string{"Android", "Device"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "restricted",
|
condition: "restricted",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"External"},
|
expectedOut: []string{"External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "apex",
|
name: "apex",
|
||||||
roots: []string{"highest.apex.meta_lic"},
|
roots: []string{"highest.apex.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"container.zip.meta_lic"},
|
roots: []string{"container.zip.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "application",
|
name: "application",
|
||||||
roots: []string{"application.meta_lic"},
|
roots: []string{"application.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device"},
|
expectedOut: []string{"Android", "Device"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"bin/bin1.meta_lic"},
|
roots: []string{"bin/bin1.meta_lic"},
|
||||||
expectedOut: []string{"Android", "Device", "External"},
|
expectedOut: []string{"Android", "Device", "External"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
condition: "proprietary",
|
condition: "proprietary",
|
||||||
name: "library",
|
name: "library",
|
||||||
roots: []string{"lib/libd.so.meta_lic"},
|
roots: []string{"lib/libd.so.meta_lic"},
|
||||||
expectedOut: []string{"External"},
|
expectedOut: []string{"External"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -194,7 +205,7 @@ func Test(t *testing.T) {
|
|||||||
|
|
||||||
err := shippedLibs(&ctx, rootFiles...)
|
err := shippedLibs(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("shippedLibs: error = %w, stderr = %v", err, stderr)
|
t.Fatalf("shippedLibs: error = %v, stderr = %v", err, stderr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if stderr.Len() > 0 {
|
if stderr.Len() > 0 {
|
@@ -16,7 +16,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compliance"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -24,6 +23,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/tools/compliance"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -69,12 +70,12 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
dir, err := filepath.Abs(filepath.Dir(*outputFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot determine path to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
fi, err := os.Stat(dir)
|
fi, err := os.Stat(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %w\n", dir, *outputFile, err)
|
fmt.Fprintf(os.Stderr, "cannot read directory %q of %q: %s\n", dir, *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if !fi.IsDir() {
|
if !fi.IsDir() {
|
||||||
@@ -102,7 +103,7 @@ func main() {
|
|||||||
if *outputFile != "-" {
|
if *outputFile != "-" {
|
||||||
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
err := os.WriteFile(*outputFile, ofile.(*bytes.Buffer).Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "could not write output to %q: %w\n", *outputFile, err)
|
fmt.Fprintf(os.Stderr, "could not write output to %q: %s\n", *outputFile, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -28,6 +28,16 @@ var (
|
|||||||
horizontalRule = regexp.MustCompile("^===[=]*===$")
|
horizontalRule = regexp.MustCompile("^===[=]*===$")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// Change into the parent directory before running the tests
|
||||||
|
// so they can find the testdata directory.
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
fmt.Printf("failed to change to testdata directory: %s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
condition string
|
condition string
|
||||||
@@ -474,7 +484,7 @@ func Test(t *testing.T) {
|
|||||||
|
|
||||||
err := textNotice(&ctx, rootFiles...)
|
err := textNotice(&ctx, rootFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("textnotice: error = %w, stderr = %v", err, stderr)
|
t.Fatalf("textnotice: error = %v, stderr = %v", err, stderr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if stderr.Len() > 0 {
|
if stderr.Len() > 0 {
|
@@ -61,16 +61,16 @@ const (
|
|||||||
var (
|
var (
|
||||||
// RecognizedConditionNames maps condition strings to LicenseCondition.
|
// RecognizedConditionNames maps condition strings to LicenseCondition.
|
||||||
RecognizedConditionNames = map[string]LicenseCondition{
|
RecognizedConditionNames = map[string]LicenseCondition{
|
||||||
"unencumbered": UnencumberedCondition,
|
"unencumbered": UnencumberedCondition,
|
||||||
"permissive": PermissiveCondition,
|
"permissive": PermissiveCondition,
|
||||||
"notice": NoticeCondition,
|
"notice": NoticeCondition,
|
||||||
"reciprocal": ReciprocalCondition,
|
"reciprocal": ReciprocalCondition,
|
||||||
"restricted": RestrictedCondition,
|
"restricted": RestrictedCondition,
|
||||||
"restricted_with_classpath_exception": RestrictedClasspathExceptionCondition,
|
"restricted_with_classpath_exception": RestrictedClasspathExceptionCondition,
|
||||||
"restricted_allows_dynamic_linking": WeaklyRestrictedCondition,
|
"restricted_allows_dynamic_linking": WeaklyRestrictedCondition,
|
||||||
"proprietary": ProprietaryCondition,
|
"proprietary": ProprietaryCondition,
|
||||||
"by_exception_only": ByExceptionOnlyCondition,
|
"by_exception_only": ByExceptionOnlyCondition,
|
||||||
"not_allowed": NotAllowedCondition,
|
"not_allowed": NotAllowedCondition,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -33,82 +33,82 @@ func TestConditionSet(t *testing.T) {
|
|||||||
conditions: []string{},
|
conditions: []string{},
|
||||||
plus: &[]string{},
|
plus: &[]string{},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{},
|
"notice": []string{},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
"restricted|reciprocal": []string{},
|
"restricted|reciprocal": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{},
|
expected: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "emptyminusnothing",
|
name: "emptyminusnothing",
|
||||||
conditions: []string{},
|
conditions: []string{},
|
||||||
minus: &[]string{},
|
minus: &[]string{},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{},
|
"notice": []string{},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
"restricted|reciprocal": []string{},
|
"restricted|reciprocal": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{},
|
expected: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "emptyminusnotice",
|
name: "emptyminusnotice",
|
||||||
conditions: []string{},
|
conditions: []string{},
|
||||||
minus: &[]string{"notice"},
|
minus: &[]string{"notice"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{},
|
"notice": []string{},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
"restricted|reciprocal": []string{},
|
"restricted|reciprocal": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{},
|
expected: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "noticeonly",
|
name: "noticeonly",
|
||||||
conditions: []string{"notice"},
|
conditions: []string{"notice"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"notice|proprietary": []string{"notice"},
|
"notice|proprietary": []string{"notice"},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{"notice"},
|
expected: []string{"notice"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allnoticeonly",
|
name: "allnoticeonly",
|
||||||
conditions: []string{"notice"},
|
conditions: []string{"notice"},
|
||||||
plus: &[]string{"notice"},
|
plus: &[]string{"notice"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"notice|proprietary": []string{"notice"},
|
"notice|proprietary": []string{"notice"},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{"notice"},
|
expected: []string{"notice"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "emptyplusnotice",
|
name: "emptyplusnotice",
|
||||||
conditions: []string{},
|
conditions: []string{},
|
||||||
plus: &[]string{"notice"},
|
plus: &[]string{"notice"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"notice|proprietary": []string{"notice"},
|
"notice|proprietary": []string{"notice"},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{"notice"},
|
expected: []string{"notice"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "everything",
|
name: "everything",
|
||||||
conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
|
conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
|
||||||
plus: &[]string{"restricted_with_classpath_exception", "restricted_allows_dynamic_linking", "by_exception_only", "not_allowed"},
|
plus: &[]string{"restricted_with_classpath_exception", "restricted_allows_dynamic_linking", "by_exception_only", "not_allowed"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered": []string{"unencumbered"},
|
"unencumbered": []string{"unencumbered"},
|
||||||
"permissive": []string{"permissive"},
|
"permissive": []string{"permissive"},
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"reciprocal": []string{"reciprocal"},
|
"reciprocal": []string{"reciprocal"},
|
||||||
"restricted": []string{"restricted"},
|
"restricted": []string{"restricted"},
|
||||||
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
||||||
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
||||||
"proprietary": []string{"proprietary"},
|
"proprietary": []string{"proprietary"},
|
||||||
"by_exception_only": []string{"by_exception_only"},
|
"by_exception_only": []string{"by_exception_only"},
|
||||||
"not_allowed": []string{"not_allowed"},
|
"not_allowed": []string{"not_allowed"},
|
||||||
"notice|proprietary": []string{"notice", "proprietary"},
|
"notice|proprietary": []string{"notice", "proprietary"},
|
||||||
},
|
},
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"unencumbered",
|
"unencumbered",
|
||||||
@@ -137,13 +137,13 @@ func TestConditionSet(t *testing.T) {
|
|||||||
"by_exception_only",
|
"by_exception_only",
|
||||||
"not_allowed",
|
"not_allowed",
|
||||||
},
|
},
|
||||||
plus: &[]string{},
|
plus: &[]string{},
|
||||||
minus: &[]string{},
|
minus: &[]string{},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered|permissive|notice": []string{"unencumbered", "permissive", "notice"},
|
"unencumbered|permissive|notice": []string{"unencumbered", "permissive", "notice"},
|
||||||
"restricted|reciprocal": []string{"reciprocal", "restricted"},
|
"restricted|reciprocal": []string{"reciprocal", "restricted"},
|
||||||
"proprietary|by_exception_only": []string{"proprietary", "by_exception_only"},
|
"proprietary|by_exception_only": []string{"proprietary", "by_exception_only"},
|
||||||
"not_allowed": []string{"not_allowed"},
|
"not_allowed": []string{"not_allowed"},
|
||||||
},
|
},
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"unencumbered",
|
"unencumbered",
|
||||||
@@ -159,21 +159,21 @@ func TestConditionSet(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "allbutone",
|
name: "allbutone",
|
||||||
conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
|
conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
|
||||||
plus: &[]string{"restricted_allows_dynamic_linking", "by_exception_only", "not_allowed"},
|
plus: &[]string{"restricted_allows_dynamic_linking", "by_exception_only", "not_allowed"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered": []string{"unencumbered"},
|
"unencumbered": []string{"unencumbered"},
|
||||||
"permissive": []string{"permissive"},
|
"permissive": []string{"permissive"},
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"reciprocal": []string{"reciprocal"},
|
"reciprocal": []string{"reciprocal"},
|
||||||
"restricted": []string{"restricted"},
|
"restricted": []string{"restricted"},
|
||||||
"restricted_with_classpath_exception": []string{},
|
"restricted_with_classpath_exception": []string{},
|
||||||
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
||||||
"proprietary": []string{"proprietary"},
|
"proprietary": []string{"proprietary"},
|
||||||
"by_exception_only": []string{"by_exception_only"},
|
"by_exception_only": []string{"by_exception_only"},
|
||||||
"not_allowed": []string{"not_allowed"},
|
"not_allowed": []string{"not_allowed"},
|
||||||
"notice|proprietary": []string{"notice", "proprietary"},
|
"notice|proprietary": []string{"notice", "proprietary"},
|
||||||
},
|
},
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"unencumbered",
|
"unencumbered",
|
||||||
@@ -203,17 +203,17 @@ func TestConditionSet(t *testing.T) {
|
|||||||
},
|
},
|
||||||
minus: &[]string{"restricted_allows_dynamic_linking"},
|
minus: &[]string{"restricted_allows_dynamic_linking"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered": []string{"unencumbered"},
|
"unencumbered": []string{"unencumbered"},
|
||||||
"permissive": []string{"permissive"},
|
"permissive": []string{"permissive"},
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"reciprocal": []string{"reciprocal"},
|
"reciprocal": []string{"reciprocal"},
|
||||||
"restricted": []string{"restricted"},
|
"restricted": []string{"restricted"},
|
||||||
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
||||||
"restricted_allows_dynamic_linking": []string{},
|
"restricted_allows_dynamic_linking": []string{},
|
||||||
"proprietary": []string{"proprietary"},
|
"proprietary": []string{"proprietary"},
|
||||||
"by_exception_only": []string{"by_exception_only"},
|
"by_exception_only": []string{"by_exception_only"},
|
||||||
"not_allowed": []string{"not_allowed"},
|
"not_allowed": []string{"not_allowed"},
|
||||||
"restricted|proprietary": []string{"restricted", "proprietary"},
|
"restricted|proprietary": []string{"restricted", "proprietary"},
|
||||||
},
|
},
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"unencumbered",
|
"unencumbered",
|
||||||
@@ -254,35 +254,35 @@ func TestConditionSet(t *testing.T) {
|
|||||||
"not_allowed",
|
"not_allowed",
|
||||||
},
|
},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered": []string{},
|
"unencumbered": []string{},
|
||||||
"permissive": []string{},
|
"permissive": []string{},
|
||||||
"notice": []string{},
|
"notice": []string{},
|
||||||
"reciprocal": []string{},
|
"reciprocal": []string{},
|
||||||
"restricted": []string{},
|
"restricted": []string{},
|
||||||
"restricted_with_classpath_exception": []string{},
|
"restricted_with_classpath_exception": []string{},
|
||||||
"restricted_allows_dynamic_linking": []string{},
|
"restricted_allows_dynamic_linking": []string{},
|
||||||
"proprietary": []string{},
|
"proprietary": []string{},
|
||||||
"by_exception_only": []string{},
|
"by_exception_only": []string{},
|
||||||
"not_allowed": []string{},
|
"not_allowed": []string{},
|
||||||
"restricted|proprietary": []string{},
|
"restricted|proprietary": []string{},
|
||||||
},
|
},
|
||||||
expected: []string{},
|
expected: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "restrictedplus",
|
name: "restrictedplus",
|
||||||
conditions: []string{"restricted", "restricted_with_classpath_exception", "restricted_allows_dynamic_linking"},
|
conditions: []string{"restricted", "restricted_with_classpath_exception", "restricted_allows_dynamic_linking"},
|
||||||
plus: &[]string{"permissive", "notice", "restricted", "proprietary"},
|
plus: &[]string{"permissive", "notice", "restricted", "proprietary"},
|
||||||
matchingAny: map[string][]string{
|
matchingAny: map[string][]string{
|
||||||
"unencumbered": []string{},
|
"unencumbered": []string{},
|
||||||
"permissive": []string{"permissive"},
|
"permissive": []string{"permissive"},
|
||||||
"notice": []string{"notice"},
|
"notice": []string{"notice"},
|
||||||
"restricted": []string{"restricted"},
|
"restricted": []string{"restricted"},
|
||||||
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
"restricted_with_classpath_exception": []string{"restricted_with_classpath_exception"},
|
||||||
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
"restricted_allows_dynamic_linking": []string{"restricted_allows_dynamic_linking"},
|
||||||
"proprietary": []string{"proprietary"},
|
"proprietary": []string{"proprietary"},
|
||||||
"restricted|proprietary": []string{"restricted", "proprietary"},
|
"restricted|proprietary": []string{"restricted", "proprietary"},
|
||||||
"by_exception_only": []string{},
|
"by_exception_only": []string{},
|
||||||
"proprietary|by_exception_only": []string{"proprietary"},
|
"proprietary|by_exception_only": []string{"proprietary"},
|
||||||
},
|
},
|
||||||
expected: []string{"permissive", "notice", "restricted", "restricted_with_classpath_exception", "restricted_allows_dynamic_linking", "proprietary"},
|
expected: []string{"permissive", "notice", "restricted", "restricted_with_classpath_exception", "restricted_allows_dynamic_linking", "proprietary"},
|
||||||
},
|
},
|
||||||
@@ -363,7 +363,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
actualConditions := actual.AsList()
|
actualConditions := actual.AsList()
|
||||||
if len(actualConditions) != len(expectedConditions) {
|
if len(actualConditions) != len(expectedConditions) {
|
||||||
t.Errorf("len(MatchingAny(%d).AsList()): got %d, want %d",
|
t.Errorf("len(MatchingAny(%s).AsList()): got %d, want %d",
|
||||||
data, len(actualNames), len(expectedNames))
|
data, len(actualNames), len(expectedNames))
|
||||||
} else {
|
} else {
|
||||||
for i := 0; i < len(actualNames); i++ {
|
for i := 0; i < len(actualNames); i++ {
|
||||||
@@ -452,7 +452,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
for i := 0; i < len(actualConditions); i++ {
|
for i := 0; i < len(actualConditions); i++ {
|
||||||
if actualConditions[i] != expectedConditions[i] {
|
if actualConditions[i] != expectedConditions[i] {
|
||||||
t.Errorf("actual.AsList()[%d]: got %s, want %s",
|
t.Errorf("actual.AsList()[%d]: got %s, want %s",
|
||||||
i, actualConditions[i], expectedConditions[i])
|
i, actualConditions[i].Name(), expectedConditions[i].Name())
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -552,7 +552,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
for i := 0; i < len(actualConditions); i++ {
|
for i := 0; i < len(actualConditions); i++ {
|
||||||
if actualConditions[i] != expectedConditions[i] {
|
if actualConditions[i] != expectedConditions[i] {
|
||||||
t.Errorf("actual.AsList()[%d}: got %s, want %s",
|
t.Errorf("actual.AsList()[%d}: got %s, want %s",
|
||||||
i, actualConditions[i], expectedConditions[i])
|
i, actualConditions[i].Name(), expectedConditions[i].Name())
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -629,7 +629,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
if checkExpected(cs, t) {
|
if checkExpected(cs, t) {
|
||||||
checkMatching(cs, t)
|
checkMatching(cs, t)
|
||||||
}
|
}
|
||||||
if checkExpectedSet(cs, t){
|
if checkExpectedSet(cs, t) {
|
||||||
checkMatchingSet(cs, t)
|
checkMatchingSet(cs, t)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -639,7 +639,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
if checkExpected(cs, t) {
|
if checkExpected(cs, t) {
|
||||||
checkMatching(cs, t)
|
checkMatching(cs, t)
|
||||||
}
|
}
|
||||||
if checkExpectedSet(cs, t){
|
if checkExpectedSet(cs, t) {
|
||||||
checkMatchingSet(cs, t)
|
checkMatchingSet(cs, t)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -649,7 +649,7 @@ func TestConditionSet(t *testing.T) {
|
|||||||
if checkExpected(cs, t) {
|
if checkExpected(cs, t) {
|
||||||
checkMatching(cs, t)
|
checkMatching(cs, t)
|
||||||
}
|
}
|
||||||
if checkExpectedSet(cs, t){
|
if checkExpectedSet(cs, t) {
|
||||||
checkMatchingSet(cs, t)
|
checkMatchingSet(cs, t)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
18
tools/compliance/go.mod
Normal file
18
tools/compliance/go.mod
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
module android/soong/tools/compliance
|
||||||
|
|
||||||
|
require google.golang.org/protobuf v0.0.0
|
||||||
|
|
||||||
|
replace google.golang.org/protobuf v0.0.0 => ../../../../external/golang-protobuf
|
||||||
|
|
||||||
|
require android/soong v0.0.0
|
||||||
|
|
||||||
|
replace android/soong v0.0.0 => ../../../soong
|
||||||
|
// Indirect deps from golang-protobuf
|
||||||
|
exclude github.com/golang/protobuf v1.5.0
|
||||||
|
|
||||||
|
replace github.com/google/go-cmp v0.5.5 => ../../../../external/go-cmp
|
||||||
|
|
||||||
|
// Indirect dep from go-cmp
|
||||||
|
exclude golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
|
||||||
|
|
||||||
|
go 1.18
|
@@ -148,7 +148,7 @@ func (e *TargetEdge) String() string {
|
|||||||
type TargetEdgeList []*TargetEdge
|
type TargetEdgeList []*TargetEdge
|
||||||
|
|
||||||
// Len returns the count of the elmements in the list.
|
// Len returns the count of the elmements in the list.
|
||||||
func (l TargetEdgeList) Len() int { return len(l) }
|
func (l TargetEdgeList) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranges 2 elements so that each occupies the other's former position.
|
// Swap rearranges 2 elements so that each occupies the other's former position.
|
||||||
func (l TargetEdgeList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
func (l TargetEdgeList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
||||||
@@ -171,7 +171,7 @@ func (l TargetEdgeList) Less(i, j int) bool {
|
|||||||
// edge with a context `ctx` defined by whatever process is creating the path.
|
// edge with a context `ctx` defined by whatever process is creating the path.
|
||||||
type TargetEdgePathSegment struct {
|
type TargetEdgePathSegment struct {
|
||||||
edge *TargetEdge
|
edge *TargetEdge
|
||||||
ctx interface{}
|
ctx interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Target identifies the target that depends on the dependency.
|
// Target identifies the target that depends on the dependency.
|
||||||
@@ -495,7 +495,7 @@ func (ts *TargetNodeSet) String() string {
|
|||||||
type TargetNodeList []*TargetNode
|
type TargetNodeList []*TargetNode
|
||||||
|
|
||||||
// Len returns the count of elements in the list.
|
// Len returns the count of elements in the list.
|
||||||
func (l TargetNodeList) Len() int { return len(l) }
|
func (l TargetNodeList) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranges 2 elements so that each occupies the other's former position.
|
// Swap rearranges 2 elements so that each occupies the other's former position.
|
||||||
func (l TargetNodeList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
func (l TargetNodeList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
||||||
|
@@ -33,21 +33,21 @@ var (
|
|||||||
// proprietary or confidential pathnames to whether to strip the prefix
|
// proprietary or confidential pathnames to whether to strip the prefix
|
||||||
// from the path when used as the library name for notices.
|
// from the path when used as the library name for notices.
|
||||||
SafePathPrefixes = map[string]bool{
|
SafePathPrefixes = map[string]bool{
|
||||||
"external/": true,
|
"external/": true,
|
||||||
"art/": false,
|
"art/": false,
|
||||||
"build/": false,
|
"build/": false,
|
||||||
"cts/": false,
|
"cts/": false,
|
||||||
"dalvik/": false,
|
"dalvik/": false,
|
||||||
"developers/": false,
|
"developers/": false,
|
||||||
"development/": false,
|
"development/": false,
|
||||||
"frameworks/": false,
|
"frameworks/": false,
|
||||||
"packages/": true,
|
"packages/": true,
|
||||||
"prebuilts/": false,
|
"prebuilts/": false,
|
||||||
"sdk/": false,
|
"sdk/": false,
|
||||||
"system/": false,
|
"system/": false,
|
||||||
"test/": false,
|
"test/": false,
|
||||||
"toolchain/": false,
|
"toolchain/": false,
|
||||||
"tools/": false,
|
"tools/": false,
|
||||||
}
|
}
|
||||||
|
|
||||||
// SafePrebuiltPrefixes maps the regular expression to match a prebuilt
|
// SafePrebuiltPrefixes maps the regular expression to match a prebuilt
|
||||||
@@ -62,8 +62,8 @@ var (
|
|||||||
|
|
||||||
// ImpliesNotice lists the condition names implying a notice or attribution policy.
|
// ImpliesNotice lists the condition names implying a notice or attribution policy.
|
||||||
ImpliesNotice = LicenseConditionSet(UnencumberedCondition | PermissiveCondition | NoticeCondition | ReciprocalCondition |
|
ImpliesNotice = LicenseConditionSet(UnencumberedCondition | PermissiveCondition | NoticeCondition | ReciprocalCondition |
|
||||||
RestrictedCondition | RestrictedClasspathExceptionCondition | WeaklyRestrictedCondition |
|
RestrictedCondition | RestrictedClasspathExceptionCondition | WeaklyRestrictedCondition |
|
||||||
ProprietaryCondition | ByExceptionOnlyCondition)
|
ProprietaryCondition | ByExceptionOnlyCondition)
|
||||||
|
|
||||||
// ImpliesReciprocal lists the condition names implying a local source-sharing policy.
|
// ImpliesReciprocal lists the condition names implying a local source-sharing policy.
|
||||||
ImpliesReciprocal = LicenseConditionSet(ReciprocalCondition)
|
ImpliesReciprocal = LicenseConditionSet(ReciprocalCondition)
|
||||||
@@ -143,7 +143,6 @@ func LicenseConditionSetFromNames(tn *TargetNode, names ...string) LicenseCondit
|
|||||||
return cs
|
return cs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Resolution happens in three phases:
|
// Resolution happens in three phases:
|
||||||
//
|
//
|
||||||
// 1. A bottom-up traversal propagates (restricted) license conditions up to
|
// 1. A bottom-up traversal propagates (restricted) license conditions up to
|
||||||
@@ -182,7 +181,6 @@ func LicenseConditionSetFromNames(tn *TargetNode, names ...string) LicenseCondit
|
|||||||
// Not all restricted licenses are create equal. Some have special rules or
|
// Not all restricted licenses are create equal. Some have special rules or
|
||||||
// exceptions. e.g. LGPL or "with classpath excption".
|
// exceptions. e.g. LGPL or "with classpath excption".
|
||||||
|
|
||||||
|
|
||||||
// depConditionsPropagatingToTarget returns the conditions which propagate up an
|
// depConditionsPropagatingToTarget returns the conditions which propagate up an
|
||||||
// edge from dependency to target.
|
// edge from dependency to target.
|
||||||
//
|
//
|
||||||
@@ -204,7 +202,7 @@ func depConditionsPropagatingToTarget(lg *LicenseGraph, e *TargetEdge, depCondit
|
|||||||
}
|
}
|
||||||
|
|
||||||
result |= depConditions & LicenseConditionSet(RestrictedCondition)
|
result |= depConditions & LicenseConditionSet(RestrictedCondition)
|
||||||
if 0 != (depConditions & LicenseConditionSet(RestrictedClasspathExceptionCondition)) && !edgeNodesAreIndependentModules(e) {
|
if 0 != (depConditions&LicenseConditionSet(RestrictedClasspathExceptionCondition)) && !edgeNodesAreIndependentModules(e) {
|
||||||
result |= LicenseConditionSet(RestrictedClasspathExceptionCondition)
|
result |= LicenseConditionSet(RestrictedClasspathExceptionCondition)
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
@@ -264,13 +262,12 @@ func conditionsAttachingAcrossEdge(lg *LicenseGraph, e *TargetEdge, universe Lic
|
|||||||
}
|
}
|
||||||
|
|
||||||
result &= LicenseConditionSet(RestrictedCondition | RestrictedClasspathExceptionCondition)
|
result &= LicenseConditionSet(RestrictedCondition | RestrictedClasspathExceptionCondition)
|
||||||
if 0 != (result & LicenseConditionSet(RestrictedClasspathExceptionCondition)) && edgeNodesAreIndependentModules(e) {
|
if 0 != (result&LicenseConditionSet(RestrictedClasspathExceptionCondition)) && edgeNodesAreIndependentModules(e) {
|
||||||
result &= LicenseConditionSet(RestrictedCondition)
|
result &= LicenseConditionSet(RestrictedCondition)
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// edgeIsDynamicLink returns true for edges representing shared libraries
|
// edgeIsDynamicLink returns true for edges representing shared libraries
|
||||||
// linked dynamically at runtime.
|
// linked dynamically at runtime.
|
||||||
func edgeIsDynamicLink(e *TargetEdge) bool {
|
func edgeIsDynamicLink(e *TargetEdge) bool {
|
@@ -226,7 +226,7 @@ func TestPolicy_edgeConditions(t *testing.T) {
|
|||||||
fs[tt.edge.dep] = []byte(meta[tt.edge.dep])
|
fs[tt.edge.dep] = []byte(meta[tt.edge.dep])
|
||||||
lg, err := ReadLicenseGraph(&fs, stderr, []string{tt.edge.target})
|
lg, err := ReadLicenseGraph(&fs, stderr, []string{tt.edge.target})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error reading graph: %w", err)
|
t.Errorf("unexpected error reading graph: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
edge := lg.Edges()[0]
|
edge := lg.Edges()[0]
|
@@ -332,7 +332,7 @@ func TestResolveBottomUpConditions(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -643,7 +643,7 @@ func TestResolveTopDownConditions(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@@ -457,7 +457,7 @@ func TestResolveNotices(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
@@ -76,7 +76,7 @@ func TestResolveSourcePrivacy(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
@@ -286,7 +286,7 @@ func TestResolveSourceSharing(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
@@ -24,7 +24,7 @@ import (
|
|||||||
type byConflict []SourceSharePrivacyConflict
|
type byConflict []SourceSharePrivacyConflict
|
||||||
|
|
||||||
// Len returns the count of elements in the slice.
|
// Len returns the count of elements in the slice.
|
||||||
func (l byConflict) Len() int { return len(l) }
|
func (l byConflict) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranged 2 elements so that each occupies the other's former
|
// Swap rearranged 2 elements so that each occupies the other's former
|
||||||
// position.
|
// position.
|
||||||
@@ -99,7 +99,7 @@ func TestConflictingSharedPrivateSource(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedConflicts := toConflictList(lg, tt.expectedConflicts)
|
expectedConflicts := toConflictList(lg, tt.expectedConflicts)
|
@@ -29,30 +29,30 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
expectedNodes []string
|
expectedNodes []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "singleton",
|
name: "singleton",
|
||||||
roots: []string{"apacheLib.meta_lic"},
|
roots: []string{"apacheLib.meta_lic"},
|
||||||
edges: []annotated{},
|
edges: []annotated{},
|
||||||
expectedNodes: []string{"apacheLib.meta_lic"},
|
expectedNodes: []string{"apacheLib.meta_lic"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "simplebinary",
|
name: "simplebinary",
|
||||||
roots: []string{"apacheBin.meta_lic"},
|
roots: []string{"apacheBin.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
||||||
},
|
},
|
||||||
expectedNodes: []string{"apacheBin.meta_lic", "apacheLib.meta_lic"},
|
expectedNodes: []string{"apacheBin.meta_lic", "apacheLib.meta_lic"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "simpledynamic",
|
name: "simpledynamic",
|
||||||
roots: []string{"apacheBin.meta_lic"},
|
roots: []string{"apacheBin.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
|
{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
|
||||||
},
|
},
|
||||||
expectedNodes: []string{"apacheBin.meta_lic"},
|
expectedNodes: []string{"apacheBin.meta_lic"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "container",
|
name: "container",
|
||||||
roots: []string{"apacheContainer.meta_lic"},
|
roots: []string{"apacheContainer.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
||||||
{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
|
{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
|
||||||
@@ -64,8 +64,8 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "binary",
|
name: "binary",
|
||||||
roots: []string{"apacheBin.meta_lic"},
|
roots: []string{"apacheBin.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
||||||
{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
|
{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
|
||||||
@@ -77,8 +77,8 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "binarydynamic",
|
name: "binarydynamic",
|
||||||
roots: []string{"apacheBin.meta_lic"},
|
roots: []string{"apacheBin.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
||||||
{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
|
{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
|
||||||
@@ -89,8 +89,8 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "containerdeep",
|
name: "containerdeep",
|
||||||
roots: []string{"apacheContainer.meta_lic"},
|
roots: []string{"apacheContainer.meta_lic"},
|
||||||
edges: []annotated{
|
edges: []annotated{
|
||||||
{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
|
{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
|
||||||
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
|
||||||
@@ -108,7 +108,7 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.Logf("graph:")
|
t.Logf("graph:")
|
||||||
@@ -127,7 +127,7 @@ func TestShippedNodes(t *testing.T) {
|
|||||||
|
|
||||||
t.Logf("sorted nodes: [%s]", strings.Join(actualNodes, ", "))
|
t.Logf("sorted nodes: [%s]", strings.Join(actualNodes, ", "))
|
||||||
t.Logf("expected nodes: [%s]", strings.Join(expectedNodes, ", "))
|
t.Logf("expected nodes: [%s]", strings.Join(expectedNodes, ", "))
|
||||||
if len(expectedNodes) != len(actualNodes) {
|
if len(expectedNodes) != len(actualNodes) {
|
||||||
t.Errorf("unexpected number of shipped nodes: %d nodes, want %d nodes",
|
t.Errorf("unexpected number of shipped nodes: %d nodes, want %d nodes",
|
||||||
len(actualNodes), len(expectedNodes))
|
len(actualNodes), len(expectedNodes))
|
||||||
return
|
return
|
@@ -83,7 +83,7 @@ func WalkTopDown(ctx EdgeContextProvider, lg *LicenseGraph, visit VisitNode) {
|
|||||||
// specific set of conditions.
|
// specific set of conditions.
|
||||||
type resolutionKey struct {
|
type resolutionKey struct {
|
||||||
target *TargetNode
|
target *TargetNode
|
||||||
cs LicenseConditionSet
|
cs LicenseConditionSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// WalkResolutionsForCondition performs a top-down walk of the LicenseGraph
|
// WalkResolutionsForCondition performs a top-down walk of the LicenseGraph
|
@@ -620,7 +620,7 @@ func TestWalkResolutionsForCondition(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
expectedRs := toResolutionSet(lg, tt.expectedResolutions)
|
||||||
@@ -1228,7 +1228,7 @@ func TestWalkActionsForCondition(t *testing.T) {
|
|||||||
stderr := &bytes.Buffer{}
|
stderr := &bytes.Buffer{}
|
||||||
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
lg, err := toGraph(stderr, tt.roots, tt.edges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected test data error: got %w, want no error", err)
|
t.Errorf("unexpected test data error: got %s, want no error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expectedAs := toActionSet(lg, tt.expectedActions)
|
expectedAs := toActionSet(lg, tt.expectedActions)
|
@@ -185,7 +185,7 @@ type targetNode struct {
|
|||||||
|
|
||||||
// addDependencies converts the proto AnnotatedDependencies into `edges`
|
// addDependencies converts the proto AnnotatedDependencies into `edges`
|
||||||
func addDependencies(lg *LicenseGraph, tn *TargetNode) error {
|
func addDependencies(lg *LicenseGraph, tn *TargetNode) error {
|
||||||
tn.edges = make(TargetEdgeList, 0,len(tn.proto.Deps))
|
tn.edges = make(TargetEdgeList, 0, len(tn.proto.Deps))
|
||||||
for _, ad := range tn.proto.Deps {
|
for _, ad := range tn.proto.Deps {
|
||||||
dependency := ad.GetFile()
|
dependency := ad.GetFile()
|
||||||
if len(dependency) == 0 {
|
if len(dependency) == 0 {
|
||||||
|
@@ -88,9 +88,9 @@ func TestReadLicenseGraph(t *testing.T) {
|
|||||||
lg, err := ReadLicenseGraph(tt.fs, stderr, tt.roots)
|
lg, err := ReadLicenseGraph(tt.fs, stderr, tt.roots)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if len(tt.expectedError) == 0 {
|
if len(tt.expectedError) == 0 {
|
||||||
t.Errorf("unexpected error: got %w, want no error", err)
|
t.Errorf("unexpected error: got %s, want no error", err)
|
||||||
} else if !strings.Contains(err.Error(), tt.expectedError) {
|
} else if !strings.Contains(err.Error(), tt.expectedError) {
|
||||||
t.Errorf("unexpected error: got %w, want %q", err, tt.expectedError)
|
t.Errorf("unexpected error: got %s, want %q", err, tt.expectedError)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -66,7 +66,7 @@ func (r Resolution) asString() string {
|
|||||||
type ResolutionList []Resolution
|
type ResolutionList []Resolution
|
||||||
|
|
||||||
// Len returns the count of elements in the list.
|
// Len returns the count of elements in the list.
|
||||||
func (l ResolutionList) Len() int { return len(l) }
|
func (l ResolutionList) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranges 2 elements so that each occupies the other's former position.
|
// Swap rearranges 2 elements so that each occupies the other's former position.
|
||||||
func (l ResolutionList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
func (l ResolutionList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
||||||
|
@@ -65,7 +65,6 @@ func (rs ResolutionSet) AttachesTo() TargetNodeList {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// AttachesToTarget returns true if the set contains conditions that
|
// AttachesToTarget returns true if the set contains conditions that
|
||||||
// are `attachedTo`.
|
// are `attachedTo`.
|
||||||
func (rs ResolutionSet) AttachesToTarget(target *TargetNode) bool {
|
func (rs ResolutionSet) AttachesToTarget(target *TargetNode) bool {
|
||||||
@@ -73,7 +72,6 @@ func (rs ResolutionSet) AttachesToTarget(target *TargetNode) bool {
|
|||||||
return isPresent
|
return isPresent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Resolutions returns the list of resolutions that `attachedTo`
|
// Resolutions returns the list of resolutions that `attachedTo`
|
||||||
// target must resolve. Returns empty list if no conditions apply.
|
// target must resolve. Returns empty list if no conditions apply.
|
||||||
func (rs ResolutionSet) Resolutions(attachesTo *TargetNode) ResolutionList {
|
func (rs ResolutionSet) Resolutions(attachesTo *TargetNode) ResolutionList {
|
||||||
|
@@ -33,56 +33,56 @@ license_conditions: "notice"
|
|||||||
|
|
||||||
// GPL starts a test metadata file for GPL 2.0 licensing.
|
// GPL starts a test metadata file for GPL 2.0 licensing.
|
||||||
GPL = `` +
|
GPL = `` +
|
||||||
`package_name: "Free Software"
|
`package_name: "Free Software"
|
||||||
license_kinds: "SPDX-license-identifier-GPL-2.0"
|
license_kinds: "SPDX-license-identifier-GPL-2.0"
|
||||||
license_conditions: "restricted"
|
license_conditions: "restricted"
|
||||||
`
|
`
|
||||||
|
|
||||||
// Classpath starts a test metadata file for GPL 2.0 with classpath exception licensing.
|
// Classpath starts a test metadata file for GPL 2.0 with classpath exception licensing.
|
||||||
Classpath = `` +
|
Classpath = `` +
|
||||||
`package_name: "Free Software"
|
`package_name: "Free Software"
|
||||||
license_kinds: "SPDX-license-identifier-GPL-2.0-with-classpath-exception"
|
license_kinds: "SPDX-license-identifier-GPL-2.0-with-classpath-exception"
|
||||||
license_conditions: "restricted"
|
license_conditions: "restricted"
|
||||||
`
|
`
|
||||||
|
|
||||||
// DependentModule starts a test metadata file for a module in the same package as `Classpath`.
|
// DependentModule starts a test metadata file for a module in the same package as `Classpath`.
|
||||||
DependentModule = `` +
|
DependentModule = `` +
|
||||||
`package_name: "Free Software"
|
`package_name: "Free Software"
|
||||||
license_kinds: "SPDX-license-identifier-MIT"
|
license_kinds: "SPDX-license-identifier-MIT"
|
||||||
license_conditions: "notice"
|
license_conditions: "notice"
|
||||||
`
|
`
|
||||||
|
|
||||||
// LGPL starts a test metadata file for a module with LGPL 2.0 licensing.
|
// LGPL starts a test metadata file for a module with LGPL 2.0 licensing.
|
||||||
LGPL = `` +
|
LGPL = `` +
|
||||||
`package_name: "Free Library"
|
`package_name: "Free Library"
|
||||||
license_kinds: "SPDX-license-identifier-LGPL-2.0"
|
license_kinds: "SPDX-license-identifier-LGPL-2.0"
|
||||||
license_conditions: "restricted"
|
license_conditions: "restricted"
|
||||||
`
|
`
|
||||||
|
|
||||||
// MPL starts a test metadata file for a module with MPL 2.0 reciprical licensing.
|
// MPL starts a test metadata file for a module with MPL 2.0 reciprical licensing.
|
||||||
MPL = `` +
|
MPL = `` +
|
||||||
`package_name: "Reciprocal"
|
`package_name: "Reciprocal"
|
||||||
license_kinds: "SPDX-license-identifier-MPL-2.0"
|
license_kinds: "SPDX-license-identifier-MPL-2.0"
|
||||||
license_conditions: "reciprocal"
|
license_conditions: "reciprocal"
|
||||||
`
|
`
|
||||||
|
|
||||||
// MIT starts a test metadata file for a module with generic notice (MIT) licensing.
|
// MIT starts a test metadata file for a module with generic notice (MIT) licensing.
|
||||||
MIT = `` +
|
MIT = `` +
|
||||||
`package_name: "Android"
|
`package_name: "Android"
|
||||||
license_kinds: "SPDX-license-identifier-MIT"
|
license_kinds: "SPDX-license-identifier-MIT"
|
||||||
license_conditions: "notice"
|
license_conditions: "notice"
|
||||||
`
|
`
|
||||||
|
|
||||||
// Proprietary starts a test metadata file for a module with proprietary licensing.
|
// Proprietary starts a test metadata file for a module with proprietary licensing.
|
||||||
Proprietary = `` +
|
Proprietary = `` +
|
||||||
`package_name: "Android"
|
`package_name: "Android"
|
||||||
license_kinds: "legacy_proprietary"
|
license_kinds: "legacy_proprietary"
|
||||||
license_conditions: "proprietary"
|
license_conditions: "proprietary"
|
||||||
`
|
`
|
||||||
|
|
||||||
// ByException starts a test metadata file for a module with by_exception_only licensing.
|
// ByException starts a test metadata file for a module with by_exception_only licensing.
|
||||||
ByException = `` +
|
ByException = `` +
|
||||||
`package_name: "Special"
|
`package_name: "Special"
|
||||||
license_kinds: "legacy_by_exception_only"
|
license_kinds: "legacy_by_exception_only"
|
||||||
license_conditions: "by_exception_only"
|
license_conditions: "by_exception_only"
|
||||||
`
|
`
|
||||||
@@ -91,22 +91,22 @@ license_conditions: "by_exception_only"
|
|||||||
var (
|
var (
|
||||||
// meta maps test file names to metadata file content without dependencies.
|
// meta maps test file names to metadata file content without dependencies.
|
||||||
meta = map[string]string{
|
meta = map[string]string{
|
||||||
"apacheBin.meta_lic": AOSP,
|
"apacheBin.meta_lic": AOSP,
|
||||||
"apacheLib.meta_lic": AOSP,
|
"apacheLib.meta_lic": AOSP,
|
||||||
"apacheContainer.meta_lic": AOSP + "is_container: true\n",
|
"apacheContainer.meta_lic": AOSP + "is_container: true\n",
|
||||||
"dependentModule.meta_lic": DependentModule,
|
"dependentModule.meta_lic": DependentModule,
|
||||||
"gplWithClasspathException.meta_lic": Classpath,
|
"gplWithClasspathException.meta_lic": Classpath,
|
||||||
"gplBin.meta_lic": GPL,
|
"gplBin.meta_lic": GPL,
|
||||||
"gplLib.meta_lic": GPL,
|
"gplLib.meta_lic": GPL,
|
||||||
"gplContainer.meta_lic": GPL + "is_container: true\n",
|
"gplContainer.meta_lic": GPL + "is_container: true\n",
|
||||||
"lgplBin.meta_lic": LGPL,
|
"lgplBin.meta_lic": LGPL,
|
||||||
"lgplLib.meta_lic": LGPL,
|
"lgplLib.meta_lic": LGPL,
|
||||||
"mitBin.meta_lic": MIT,
|
"mitBin.meta_lic": MIT,
|
||||||
"mitLib.meta_lic": MIT,
|
"mitLib.meta_lic": MIT,
|
||||||
"mplBin.meta_lic": MPL,
|
"mplBin.meta_lic": MPL,
|
||||||
"mplLib.meta_lic": MPL,
|
"mplLib.meta_lic": MPL,
|
||||||
"proprietary.meta_lic": Proprietary,
|
"proprietary.meta_lic": Proprietary,
|
||||||
"by_exception.meta_lic": ByException,
|
"by_exception.meta_lic": ByException,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -204,7 +204,7 @@ func (e edge) String() string {
|
|||||||
type byEdge []edge
|
type byEdge []edge
|
||||||
|
|
||||||
// Len returns the count of elements in the slice.
|
// Len returns the count of elements in the slice.
|
||||||
func (l byEdge) Len() int { return len(l) }
|
func (l byEdge) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranges 2 elements of the slice so that each occupies the other's
|
// Swap rearranges 2 elements of the slice so that each occupies the other's
|
||||||
// former position.
|
// former position.
|
||||||
@@ -219,7 +219,6 @@ func (l byEdge) Less(i, j int) bool {
|
|||||||
return l[i].target < l[j].target
|
return l[i].target < l[j].target
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// annotated describes annotated test data edges to define test graphs.
|
// annotated describes annotated test data edges to define test graphs.
|
||||||
type annotated struct {
|
type annotated struct {
|
||||||
target, dep string
|
target, dep string
|
||||||
@@ -240,7 +239,7 @@ func (e annotated) IsEqualTo(other annotated) bool {
|
|||||||
if e.dep != other.dep {
|
if e.dep != other.dep {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if len(e.annotations) != len(other.annotations) {
|
if len(e.annotations) != len(other.annotations) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
a1 := append([]string{}, e.annotations...)
|
a1 := append([]string{}, e.annotations...)
|
||||||
@@ -401,7 +400,7 @@ func (l actionList) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the count of elements in the slice.
|
// Len returns the count of elements in the slice.
|
||||||
func (l actionList) Len() int { return len(l) }
|
func (l actionList) Len() int { return len(l) }
|
||||||
|
|
||||||
// Swap rearranges 2 elements of the slice so that each occupies the other's
|
// Swap rearranges 2 elements of the slice so that each occupies the other's
|
||||||
// former position.
|
// former position.
|
||||||
@@ -467,10 +466,10 @@ func toConflictList(lg *LicenseGraph, data []confl) []SourceSharePrivacyConflict
|
|||||||
oprivacy := fields[0]
|
oprivacy := fields[0]
|
||||||
cprivacy := fields[1]
|
cprivacy := fields[1]
|
||||||
result = append(result, SourceSharePrivacyConflict{
|
result = append(result, SourceSharePrivacyConflict{
|
||||||
newTestNode(lg, c.sourceNode),
|
newTestNode(lg, c.sourceNode),
|
||||||
newTestCondition(lg, oshare, cshare),
|
newTestCondition(lg, oshare, cshare),
|
||||||
newTestCondition(lg, oprivacy, cprivacy),
|
newTestCondition(lg, oprivacy, cprivacy),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user