From 113c92b0a3cbb40de5ad843ff6cd841534bedfdb Mon Sep 17 00:00:00 2001 From: Bob Badour Date: Fri, 23 Sep 2022 11:27:24 -0700 Subject: [PATCH] Make notice order more deterministic. Bug: 230357391 Test: m droid dist Change-Id: Ib3f771f9fd16743fca3f6c80c2ff85c9e42772a9 --- tools/compliance/noticeindex.go | 3 +- tools/compliance/policy_policy.go | 60 ++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/tools/compliance/noticeindex.go b/tools/compliance/noticeindex.go index f0823837d4..50f808bb16 100644 --- a/tools/compliance/noticeindex.go +++ b/tools/compliance/noticeindex.go @@ -360,7 +360,8 @@ func (ni *NoticeIndex) getLibName(noticeFor *TargetNode, h hash) string { continue } } - for r, prefix := range SafePrebuiltPrefixes { + for _, r := range OrderedSafePrebuiltPrefixes { + prefix := SafePrebuiltPrefixes[r] match := r.FindString(licenseText) if len(match) == 0 { continue diff --git a/tools/compliance/policy_policy.go b/tools/compliance/policy_policy.go index 63da73114d..2787698774 100644 --- a/tools/compliance/policy_policy.go +++ b/tools/compliance/policy_policy.go @@ -16,6 +16,8 @@ package compliance import ( "regexp" + "sort" + "strings" ) var ( @@ -32,27 +34,32 @@ var ( // proprietary or confidential pathnames to whether to strip the prefix // from the path when used as the library name for notices. SafePathPrefixes = map[string]bool{ - "external/": true, - "art/": false, - "build/": false, - "cts/": false, - "dalvik/": false, - "developers/": false, - "development/": false, - "frameworks/": false, - "packages/": true, - "prebuilts/": false, - "sdk/": false, - "system/": false, - "test/": false, - "toolchain/": false, - "tools/": false, + "external/": true, + "art/": false, + "build/": false, + "cts/": false, + "dalvik/": false, + "developers/": false, + "development/": false, + "frameworks/": false, + "packages/": true, + "prebuilts/module_sdk/": true, + "prebuilts/": false, + "sdk/": false, + "system/": false, + "test/": false, + "toolchain/": false, + "tools/": false, } // SafePrebuiltPrefixes maps the regular expression to match a prebuilt // containing the path of a safe prefix to the safe prefix. SafePrebuiltPrefixes = make(map[*regexp.Regexp]string) + // OrderedSafePrebuiltPrefixes lists the SafePrebuiltPrefixes ordered by + // increasing length. + OrderedSafePrebuiltPrefixes = make([]*regexp.Regexp, 0, 0) + // ImpliesUnencumbered lists the condition names representing an author attempt to disclaim copyright. ImpliesUnencumbered = LicenseConditionSet(UnencumberedCondition) @@ -89,14 +96,33 @@ var ( ccBySa = regexp.MustCompile(`^SPDX-license-identifier-CC-BY.*-SA.*`) ) +// byIncreasingLength implements `sort.Interface` to order regular expressions by increasing length. +type byIncreasingLength []*regexp.Regexp + +func (l byIncreasingLength) Len() int { return len(l) } +func (l byIncreasingLength) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l byIncreasingLength) Less(i, j int) bool { + ri := l[i].String() + rj := l[j].String() + if len(ri) == len(rj) { + return ri < rj + } + return len(ri) < len(rj) +} + func init() { for prefix := range SafePathPrefixes { - if prefix == "prebuilts/" { + if strings.HasPrefix(prefix, "prebuilts/") { continue } - r := regexp.MustCompile("^prebuilts/[^ ]*/" + prefix) + r := regexp.MustCompile("^prebuilts/(?:runtime/mainline/)?" + prefix) SafePrebuiltPrefixes[r] = prefix } + OrderedSafePrebuiltPrefixes = make([]*regexp.Regexp, 0, len(SafePrebuiltPrefixes)) + for r := range SafePrebuiltPrefixes { + OrderedSafePrebuiltPrefixes = append(OrderedSafePrebuiltPrefixes, r) + } + sort.Sort(byIncreasingLength(OrderedSafePrebuiltPrefixes)) } // LicenseConditionSetFromNames returns a set containing the recognized `names` and