xref: /aosp_15_r20/build/make/tools/compliance/policy_shipped.go (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker// Copyright 2021 Google LLC
2*9e94795aSAndroid Build Coastguard Worker//
3*9e94795aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*9e94795aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*9e94795aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*9e94795aSAndroid Build Coastguard Worker//
7*9e94795aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*9e94795aSAndroid Build Coastguard Worker//
9*9e94795aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*9e94795aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*9e94795aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e94795aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*9e94795aSAndroid Build Coastguard Worker// limitations under the License.
14*9e94795aSAndroid Build Coastguard Worker
15*9e94795aSAndroid Build Coastguard Workerpackage compliance
16*9e94795aSAndroid Build Coastguard Worker
17*9e94795aSAndroid Build Coastguard Worker// ShippedNodes returns the set of nodes in a license graph where the target or
18*9e94795aSAndroid Build Coastguard Worker// a derivative work gets distributed. (caches result)
19*9e94795aSAndroid Build Coastguard Workerfunc ShippedNodes(lg *LicenseGraph) TargetNodeSet {
20*9e94795aSAndroid Build Coastguard Worker	lg.mu.Lock()
21*9e94795aSAndroid Build Coastguard Worker	shipped := lg.shippedNodes
22*9e94795aSAndroid Build Coastguard Worker	lg.mu.Unlock()
23*9e94795aSAndroid Build Coastguard Worker	if shipped != nil {
24*9e94795aSAndroid Build Coastguard Worker		return *shipped
25*9e94795aSAndroid Build Coastguard Worker	}
26*9e94795aSAndroid Build Coastguard Worker
27*9e94795aSAndroid Build Coastguard Worker	tset := make(TargetNodeSet)
28*9e94795aSAndroid Build Coastguard Worker
29*9e94795aSAndroid Build Coastguard Worker	WalkTopDown(NoEdgeContext{}, lg, func(lg *LicenseGraph, tn *TargetNode, path TargetEdgePath) bool {
30*9e94795aSAndroid Build Coastguard Worker		if _, alreadyWalked := tset[tn]; alreadyWalked {
31*9e94795aSAndroid Build Coastguard Worker			return false
32*9e94795aSAndroid Build Coastguard Worker		}
33*9e94795aSAndroid Build Coastguard Worker		if len(path) > 0 {
34*9e94795aSAndroid Build Coastguard Worker			if !edgeIsDerivation(path[len(path)-1].edge) {
35*9e94795aSAndroid Build Coastguard Worker				return false
36*9e94795aSAndroid Build Coastguard Worker			}
37*9e94795aSAndroid Build Coastguard Worker		}
38*9e94795aSAndroid Build Coastguard Worker		tset[tn] = struct{}{}
39*9e94795aSAndroid Build Coastguard Worker		return true
40*9e94795aSAndroid Build Coastguard Worker	})
41*9e94795aSAndroid Build Coastguard Worker
42*9e94795aSAndroid Build Coastguard Worker	shipped = &tset
43*9e94795aSAndroid Build Coastguard Worker
44*9e94795aSAndroid Build Coastguard Worker	lg.mu.Lock()
45*9e94795aSAndroid Build Coastguard Worker	if lg.shippedNodes == nil {
46*9e94795aSAndroid Build Coastguard Worker		lg.shippedNodes = shipped
47*9e94795aSAndroid Build Coastguard Worker	} else {
48*9e94795aSAndroid Build Coastguard Worker		// if we end up with 2, release the later for garbage collection.
49*9e94795aSAndroid Build Coastguard Worker		shipped = lg.shippedNodes
50*9e94795aSAndroid Build Coastguard Worker	}
51*9e94795aSAndroid Build Coastguard Worker	lg.mu.Unlock()
52*9e94795aSAndroid Build Coastguard Worker
53*9e94795aSAndroid Build Coastguard Worker	return *shipped
54*9e94795aSAndroid Build Coastguard Worker}
55