Loading tools/compliance/cmd/dumpresolutions_test.go +90 −0 Original line number Diff line number Diff line Loading @@ -577,7 +577,9 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -610,7 +612,9 @@ func Test_plaintext(t *testing.T) { "highest.apex.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -723,7 +727,9 @@ func Test_plaintext(t *testing.T) { "highest.apex.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted restricted", "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/liba.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", }, }, Loading Loading @@ -755,7 +761,9 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", }, }, Loading @@ -772,6 +780,7 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/application.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", }, }, Loading @@ -786,6 +795,7 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", }, }, Loading Loading @@ -821,6 +831,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -849,6 +860,7 @@ func Test_plaintext(t *testing.T) { "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic by_exception_only:proprietary", "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic by_exception_only:proprietary", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -950,6 +962,7 @@ func Test_plaintext(t *testing.T) { "lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", }, }, Loading Loading @@ -977,6 +990,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", }, }, Loading @@ -992,6 +1006,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/application.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic restricted", "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", }, }, Loading Loading @@ -2883,11 +2898,21 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "reciprocal"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", Loading Loading @@ -3023,11 +3048,21 @@ func Test_graphviz(t *testing.T) { "lib/libb.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/liba.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "reciprocal"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -3406,11 +3441,21 @@ func Test_graphviz(t *testing.T) { "lib/libb.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/liba.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "reciprocal"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -3545,11 +3590,21 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "reciprocal"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", Loading Loading @@ -3606,6 +3661,11 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", Loading Loading @@ -3651,6 +3711,11 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", Loading Loading @@ -3786,6 +3851,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", Loading Loading @@ -3909,6 +3979,11 @@ func Test_graphviz(t *testing.T) { "lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -4237,6 +4312,11 @@ func Test_graphviz(t *testing.T) { "lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -4359,6 +4439,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", Loading Loading @@ -4412,6 +4497,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/liba.so.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libb.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", Loading tools/compliance/policy/resolve.go +73 −78 Original line number Diff line number Diff line Loading @@ -41,59 +41,7 @@ func ResolveBottomUpConditions(lg *LicenseGraph) *ResolutionSet { // must be indexed for fast lookup lg.indexForward() rs = newResolutionSet() // cmap contains an entry for every target that was previously walked as a pure aggregate only. cmap := make(map[string]bool) var walk func(f string, treatAsAggregate bool) actionSet walk = func(f string, treatAsAggregate bool) actionSet { target := lg.targets[f] result := make(actionSet) result[target] = newLicenseConditionSet() result[target].add(target, target.proto.LicenseConditions...) if preresolved, ok := rs.resolutions[target]; ok { if treatAsAggregate { result.addSet(preresolved) return result } if _, asAggregate := cmap[f]; !asAggregate { result.addSet(preresolved) return result } // previously walked in a pure aggregate context, // needs to walk again in non-aggregate context delete(cmap, f) } if treatAsAggregate { cmap[f] = true } // add all the conditions from all the dependencies for _, edge := range lg.index[f] { // walk dependency to get its conditions as := walk(edge.dependency, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) // turn those into the conditions that apply to the target as = depActionsApplicableToTarget(TargetEdge{lg, edge}, as, treatAsAggregate) // add them to the result result.addSet(as) } // record these conditions as applicable to the target rs.addConditions(target, result) rs.addSelf(target, result.byName(ImpliesRestricted)) // return this up the tree return result } // walk each of the roots for _, r := range lg.rootFiles { _ = walk(r, lg.targets[r].IsContainer()) } rs = resolveBottomUp(lg, make(map[*TargetNode]actionSet) /* empty map; no prior resolves */) // if not yet cached, save the result lg.mu.Lock() Loading Loading @@ -137,31 +85,13 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { // cmap contains the set of targets walked as pure aggregates. i.e. containers cmap := make(map[*TargetNode]bool) path := make([]*dependencyEdge, 0, 32) var walk func(fnode *TargetNode, cs *LicenseConditionSet, treatAsAggregate bool) walk = func(fnode *TargetNode, cs *LicenseConditionSet, treatAsAggregate bool) { if !cs.IsEmpty() { parentsAllAggregate := true for _, e := range path { target := lg.targets[e.target] if _, ok := rmap[target]; !ok { rmap[target] = make(actionSet) } rmap[target].add(fnode, cs) if !target.IsContainer() { parentsAllAggregate = false break } } if parentsAllAggregate { if _, ok := rmap[fnode]; !ok { rmap[fnode] = make(actionSet) } rmap[fnode].add(fnode, cs) } } if treatAsAggregate { cmap[fnode] = true } Loading Loading @@ -197,10 +127,8 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { delete(cmap, dnode) } } path = append(path, edge) // add the conditions to the dependency walk(dnode, dcs, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) path = path[:len(path)-1] } } Loading @@ -216,7 +144,6 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { continue } path = path[:0] // add the conditions to the root and its transitive closure walk(rnode, newLicenseConditionSet(), lg.targets[r].IsContainer()) } Loading @@ -230,7 +157,8 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { } } rs = &ResolutionSet{rmap} // propagate any new conditions back up the graph rs = resolveBottomUp(lg, rmap) // if not yet cached, save the result lg.mu.Lock() Loading @@ -244,3 +172,70 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { return rs } // resolveBottomUp implements a bottom-up resolve propagating conditions both // from the graph, and from a `priors` map of resolutions. func resolveBottomUp(lg *LicenseGraph, priors map[*TargetNode]actionSet) *ResolutionSet { rs := newResolutionSet() // cmap contains an entry for every target that was previously walked as a pure aggregate only. cmap := make(map[string]bool) var walk func(f string, treatAsAggregate bool) actionSet walk = func(f string, treatAsAggregate bool) actionSet { target := lg.targets[f] result := make(actionSet) result[target] = newLicenseConditionSet() result[target].add(target, target.proto.LicenseConditions...) if pas, ok := priors[target]; ok { result.addSet(pas) } if preresolved, ok := rs.resolutions[target]; ok { if treatAsAggregate { result.addSet(preresolved) return result } if _, asAggregate := cmap[f]; !asAggregate { result.addSet(preresolved) return result } // previously walked in a pure aggregate context, // needs to walk again in non-aggregate context delete(cmap, f) } if treatAsAggregate { cmap[f] = true } // add all the conditions from all the dependencies for _, edge := range lg.index[f] { // walk dependency to get its conditions as := walk(edge.dependency, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) // turn those into the conditions that apply to the target as = depActionsApplicableToTarget(TargetEdge{lg, edge}, as, treatAsAggregate) // add them to the result result.addSet(as) } // record these conditions as applicable to the target rs.addConditions(target, result) if len(priors) == 0 { // on the first bottom-up resolve, parents have their own sharing and notice needs // on the later resolve, if priors is empty, there will be nothing new to add rs.addSelf(target, result.byName(ImpliesRestricted)) } // return this up the tree return result } // walk each of the roots for _, r := range lg.rootFiles { _ = walk(r, lg.targets[r].IsContainer()) } return rs } tools/compliance/policy/resolve_test.go +9 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -480,6 +481,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"}, {"mitBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mplLib.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"}, }, }, Loading Loading @@ -512,6 +514,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -540,6 +543,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mplLib.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"}, }, }, Loading Loading @@ -573,6 +577,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -612,6 +617,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -687,6 +693,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading @@ -704,6 +711,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -735,6 +743,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading tools/compliance/policy/resolvenotices_test.go +1 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,7 @@ func TestResolveNotices(t *testing.T) { {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading tools/compliance/policy/resolveshare_test.go +2 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ func TestResolveSourceSharing(t *testing.T) { expectedResolutions: []res{ {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"}, {"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"}, {"apacheLib.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"}, }, }, { Loading Loading @@ -218,6 +219,7 @@ func TestResolveSourceSharing(t *testing.T) { expectedResolutions: []res{ {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, }, }, { Loading Loading
tools/compliance/cmd/dumpresolutions_test.go +90 −0 Original line number Diff line number Diff line Loading @@ -577,7 +577,9 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -610,7 +612,9 @@ func Test_plaintext(t *testing.T) { "highest.apex.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -723,7 +727,9 @@ func Test_plaintext(t *testing.T) { "highest.apex.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted restricted", "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/liba.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", }, }, Loading Loading @@ -755,7 +761,9 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", }, }, Loading @@ -772,6 +780,7 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/application.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", }, }, Loading @@ -786,6 +795,7 @@ func Test_plaintext(t *testing.T) { "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", }, }, Loading Loading @@ -821,6 +831,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -849,6 +860,7 @@ func Test_plaintext(t *testing.T) { "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic by_exception_only:proprietary", "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic by_exception_only:proprietary", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", }, }, Loading Loading @@ -950,6 +962,7 @@ func Test_plaintext(t *testing.T) { "lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", "lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", }, }, Loading Loading @@ -977,6 +990,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", }, }, Loading @@ -992,6 +1006,7 @@ func Test_plaintext(t *testing.T) { "testdata/proprietary/application.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic restricted", "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", }, }, Loading Loading @@ -2883,11 +2898,21 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "reciprocal"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", Loading Loading @@ -3023,11 +3048,21 @@ func Test_graphviz(t *testing.T) { "lib/libb.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/liba.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "reciprocal"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -3406,11 +3441,21 @@ func Test_graphviz(t *testing.T) { "lib/libb.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/liba.so.meta_lic", "restricted"), matchResolution( "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "lib/libc.a.meta_lic", "reciprocal"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -3545,11 +3590,21 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "reciprocal"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libd.so.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", Loading Loading @@ -3606,6 +3661,11 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libb.so.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", Loading Loading @@ -3651,6 +3711,11 @@ func Test_graphviz(t *testing.T) { "testdata/restricted/lib/liba.so.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "restricted"), matchResolution( "testdata/restricted/lib/libc.a.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", Loading Loading @@ -3786,6 +3851,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", Loading Loading @@ -3909,6 +3979,11 @@ func Test_graphviz(t *testing.T) { "lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -4237,6 +4312,11 @@ func Test_graphviz(t *testing.T) { "lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", "lib/libb.so.meta_lic", "restricted"), matchResolution( "lib/libd.so.meta_lic", "lib/libd.so.meta_lic", Loading Loading @@ -4359,6 +4439,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/libc.a.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libd.so.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", Loading Loading @@ -4412,6 +4497,11 @@ func Test_graphviz(t *testing.T) { "testdata/proprietary/lib/liba.so.meta_lic", "by_exception_only", "proprietary"), matchResolution( "testdata/proprietary/lib/liba.so.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "restricted"), matchResolution( "testdata/proprietary/lib/libb.so.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", Loading
tools/compliance/policy/resolve.go +73 −78 Original line number Diff line number Diff line Loading @@ -41,59 +41,7 @@ func ResolveBottomUpConditions(lg *LicenseGraph) *ResolutionSet { // must be indexed for fast lookup lg.indexForward() rs = newResolutionSet() // cmap contains an entry for every target that was previously walked as a pure aggregate only. cmap := make(map[string]bool) var walk func(f string, treatAsAggregate bool) actionSet walk = func(f string, treatAsAggregate bool) actionSet { target := lg.targets[f] result := make(actionSet) result[target] = newLicenseConditionSet() result[target].add(target, target.proto.LicenseConditions...) if preresolved, ok := rs.resolutions[target]; ok { if treatAsAggregate { result.addSet(preresolved) return result } if _, asAggregate := cmap[f]; !asAggregate { result.addSet(preresolved) return result } // previously walked in a pure aggregate context, // needs to walk again in non-aggregate context delete(cmap, f) } if treatAsAggregate { cmap[f] = true } // add all the conditions from all the dependencies for _, edge := range lg.index[f] { // walk dependency to get its conditions as := walk(edge.dependency, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) // turn those into the conditions that apply to the target as = depActionsApplicableToTarget(TargetEdge{lg, edge}, as, treatAsAggregate) // add them to the result result.addSet(as) } // record these conditions as applicable to the target rs.addConditions(target, result) rs.addSelf(target, result.byName(ImpliesRestricted)) // return this up the tree return result } // walk each of the roots for _, r := range lg.rootFiles { _ = walk(r, lg.targets[r].IsContainer()) } rs = resolveBottomUp(lg, make(map[*TargetNode]actionSet) /* empty map; no prior resolves */) // if not yet cached, save the result lg.mu.Lock() Loading Loading @@ -137,31 +85,13 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { // cmap contains the set of targets walked as pure aggregates. i.e. containers cmap := make(map[*TargetNode]bool) path := make([]*dependencyEdge, 0, 32) var walk func(fnode *TargetNode, cs *LicenseConditionSet, treatAsAggregate bool) walk = func(fnode *TargetNode, cs *LicenseConditionSet, treatAsAggregate bool) { if !cs.IsEmpty() { parentsAllAggregate := true for _, e := range path { target := lg.targets[e.target] if _, ok := rmap[target]; !ok { rmap[target] = make(actionSet) } rmap[target].add(fnode, cs) if !target.IsContainer() { parentsAllAggregate = false break } } if parentsAllAggregate { if _, ok := rmap[fnode]; !ok { rmap[fnode] = make(actionSet) } rmap[fnode].add(fnode, cs) } } if treatAsAggregate { cmap[fnode] = true } Loading Loading @@ -197,10 +127,8 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { delete(cmap, dnode) } } path = append(path, edge) // add the conditions to the dependency walk(dnode, dcs, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) path = path[:len(path)-1] } } Loading @@ -216,7 +144,6 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { continue } path = path[:0] // add the conditions to the root and its transitive closure walk(rnode, newLicenseConditionSet(), lg.targets[r].IsContainer()) } Loading @@ -230,7 +157,8 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { } } rs = &ResolutionSet{rmap} // propagate any new conditions back up the graph rs = resolveBottomUp(lg, rmap) // if not yet cached, save the result lg.mu.Lock() Loading @@ -244,3 +172,70 @@ func ResolveTopDownConditions(lg *LicenseGraph) *ResolutionSet { return rs } // resolveBottomUp implements a bottom-up resolve propagating conditions both // from the graph, and from a `priors` map of resolutions. func resolveBottomUp(lg *LicenseGraph, priors map[*TargetNode]actionSet) *ResolutionSet { rs := newResolutionSet() // cmap contains an entry for every target that was previously walked as a pure aggregate only. cmap := make(map[string]bool) var walk func(f string, treatAsAggregate bool) actionSet walk = func(f string, treatAsAggregate bool) actionSet { target := lg.targets[f] result := make(actionSet) result[target] = newLicenseConditionSet() result[target].add(target, target.proto.LicenseConditions...) if pas, ok := priors[target]; ok { result.addSet(pas) } if preresolved, ok := rs.resolutions[target]; ok { if treatAsAggregate { result.addSet(preresolved) return result } if _, asAggregate := cmap[f]; !asAggregate { result.addSet(preresolved) return result } // previously walked in a pure aggregate context, // needs to walk again in non-aggregate context delete(cmap, f) } if treatAsAggregate { cmap[f] = true } // add all the conditions from all the dependencies for _, edge := range lg.index[f] { // walk dependency to get its conditions as := walk(edge.dependency, treatAsAggregate && lg.targets[edge.dependency].IsContainer()) // turn those into the conditions that apply to the target as = depActionsApplicableToTarget(TargetEdge{lg, edge}, as, treatAsAggregate) // add them to the result result.addSet(as) } // record these conditions as applicable to the target rs.addConditions(target, result) if len(priors) == 0 { // on the first bottom-up resolve, parents have their own sharing and notice needs // on the later resolve, if priors is empty, there will be nothing new to add rs.addSelf(target, result.byName(ImpliesRestricted)) } // return this up the tree return result } // walk each of the roots for _, r := range lg.rootFiles { _ = walk(r, lg.targets[r].IsContainer()) } return rs }
tools/compliance/policy/resolve_test.go +9 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -480,6 +481,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"}, {"mitBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mplLib.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"}, }, }, Loading Loading @@ -512,6 +514,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -540,6 +543,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"mplLib.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"}, }, }, Loading Loading @@ -573,6 +577,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -612,6 +617,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -687,6 +693,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading @@ -704,6 +711,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading Loading @@ -735,6 +743,7 @@ func TestResolveTopDownConditions(t *testing.T) { {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading
tools/compliance/policy/resolvenotices_test.go +1 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,7 @@ func TestResolveNotices(t *testing.T) { {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"}, {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"}, {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"}, }, }, Loading
tools/compliance/policy/resolveshare_test.go +2 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ func TestResolveSourceSharing(t *testing.T) { expectedResolutions: []res{ {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"}, {"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"}, {"apacheLib.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"}, }, }, { Loading Loading @@ -218,6 +219,7 @@ func TestResolveSourceSharing(t *testing.T) { expectedResolutions: []res{ {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"}, }, }, { Loading