Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b285515c authored by Bob Badour's avatar Bob Badour
Browse files

license metadata remove path on top-down walk

Performance optimization means not every path will be traversed.

Instead of updating parents via the path, perform a 2nd bottom-up walk
after the top-down walk to propagate the new resolutions to parents.

Note: the 2nd walk method will add resolutions to statically linked
libraries etc. at deeper levels, but those do not affect what gets
reported. In particular, note that test data for dumpresolutions
changes, but none of the test data for listshare, checkshare etc.
changes.

Test: m all systemlicense listshare checkshare dumpgraph dumpresolutions

Bug: 68860345
Bug: 151177513
Bug: 151953481
Change-Id: I76361c4e33bbadbbea38cbec260430e8f9407628
parent 3a820dd5
Loading
Loading
Loading
Loading
+90 −0
Original line number Diff line number Diff line
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
			},
		},
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
+73 −78
Original line number Diff line number Diff line
@@ -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()
@@ -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
		}
@@ -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]
		}
	}

@@ -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())
	}
@@ -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()
@@ -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
}
+9 −0
Original line number Diff line number Diff line
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
@@ -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"},
			},
		},
+1 −0
Original line number Diff line number Diff line
@@ -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"},
			},
		},
+2 −0
Original line number Diff line number Diff line
@@ -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"},
			},
		},
		{
@@ -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