fix(dotnet-deps-cataloger): avoid repeated dependency resolution (#3930)

Signed-off-by: Keith Zantow <kzantow@gmail.com>
This commit is contained in:
Keith Zantow 2025-05-21 21:28:40 -04:00 committed by GitHub
parent 18ed8b60f8
commit 7bfb4c86a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 8 deletions

View File

@ -252,8 +252,8 @@ func getLogicalDepsJSON(deps depsJSON, lm *libmanJSON) logicalDepsJSON {
if !bundlingDetected && knownBundlers.Has(name) { if !bundlingDetected && knownBundlers.Has(name) {
bundlingDetected = true bundlingDetected = true
} }
p.AnyChildClaimsDLLs = searchForDLLClaims(packageMap, p.dependencyNameVersions()...) p.AnyChildClaimsDLLs = searchForDLLClaims(packageMap, strset.New(), p.dependencyNameVersions()...)
p.AnyChildHasDLLs = searchForDLLEvidence(packageMap, p.dependencyNameVersions()...) p.AnyChildHasDLLs = searchForDLLEvidence(packageMap, strset.New(), p.dependencyNameVersions()...)
packages[p.NameVersion] = *p packages[p.NameVersion] = *p
} }
@ -286,31 +286,35 @@ func mergeSets(s1, s2 *strset.Set) *strset.Set {
type visitorFunc func(p *logicalDepsJSONPackage) bool type visitorFunc func(p *logicalDepsJSONPackage) bool
// searchForDLLEvidence recursively searches for executables found for any of the given nameVersions and children recursively. // searchForDLLEvidence recursively searches for executables found for any of the given nameVersions and children recursively.
func searchForDLLEvidence(packageMap map[string]*logicalDepsJSONPackage, nameVersions ...string) bool { func searchForDLLEvidence(packageMap map[string]*logicalDepsJSONPackage, visited *strset.Set, nameVersions ...string) bool {
return traverseDependencies(packageMap, func(p *logicalDepsJSONPackage) bool { return traverseDependencies(packageMap, func(p *logicalDepsJSONPackage) bool {
return p.FoundDLLs(true) return p.FoundDLLs(true)
}, nameVersions...) }, visited, nameVersions...)
} }
// searchForDLLClaims recursively searches for DLL claims in the deps.json for any of the given nameVersions and children recursively. // searchForDLLClaims recursively searches for DLL claims in the deps.json for any of the given nameVersions and children recursively.
func searchForDLLClaims(packageMap map[string]*logicalDepsJSONPackage, nameVersions ...string) bool { func searchForDLLClaims(packageMap map[string]*logicalDepsJSONPackage, visited *strset.Set, nameVersions ...string) bool {
return traverseDependencies(packageMap, func(p *logicalDepsJSONPackage) bool { return traverseDependencies(packageMap, func(p *logicalDepsJSONPackage) bool {
return p.ClaimsDLLs(true) return p.ClaimsDLLs(true)
}, nameVersions...) }, visited, nameVersions...)
} }
func traverseDependencies(packageMap map[string]*logicalDepsJSONPackage, visitor visitorFunc, nameVersions ...string) bool { func traverseDependencies(packageMap map[string]*logicalDepsJSONPackage, visitor visitorFunc, visited *strset.Set, nameVersions ...string) bool {
if len(nameVersions) == 0 { if len(nameVersions) == 0 {
return false return false
} }
for _, nameVersion := range nameVersions { for _, nameVersion := range nameVersions {
if visited.Has(nameVersion) {
continue
}
visited.Add(nameVersion)
if p, ok := packageMap[nameVersion]; ok { if p, ok := packageMap[nameVersion]; ok {
if visitor(p) { if visitor(p) {
return true return true
} }
if traverseDependencies(packageMap, visitor, p.dependencyNameVersions()...) { if traverseDependencies(packageMap, visitor, visited, p.dependencyNameVersions()...) {
return true return true
} }
} }

View File

@ -149,6 +149,11 @@ func TestGetLogicalDepsJSON_MergeTargets(t *testing.T) {
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {}, "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {},
}, },
}, },
"Microsoft.CodeAnalysis.Common/4.0.0": {
Dependencies: map[string]string{
"Microsoft.CodeAnalysis.CSharp": "4.0.0",
},
},
}, },
}, },
Libraries: map[string]depsLibrary{ Libraries: map[string]depsLibrary{