Optimized project selection for getProjectMetadata
Test: m compliance_sbom
Change-Id: I9e60b7e138a4fca74170954d8bb83862677e750f
diff --git a/tools/compliance/cmd/sbom/sbom.go b/tools/compliance/cmd/sbom/sbom.go
index afb377e..493d331 100644
--- a/tools/compliance/cmd/sbom/sbom.go
+++ b/tools/compliance/cmd/sbom/sbom.go
@@ -233,7 +233,7 @@
return url
}
-// getProjectMetadata returns the project metadata for the target node
+// getProjectMetadata returns the optimal project metadata for the target node
func getProjectMetadata(_ *context, pmix *projectmetadata.Index,
tn *compliance.TargetNode) (*projectmetadata.ProjectMetadata, error) {
pms, err := pmix.MetadataForProjects(tn.Projects()...)
@@ -244,8 +244,31 @@
return nil, nil
}
- // TO DO: skip first element if it doesn't have one of the three info needed
- return pms[0], nil
+ // Getting the project metadata that contains most of the info needed for sbomGenerator
+ score := -1
+ index := -1
+ for i := 0; i < len(pms); i++ {
+ tempScore := 0
+ if pms[i].Name() != "" {
+ tempScore += 1
+ }
+ if pms[i].Version() != "" {
+ tempScore += 1
+ }
+ if pms[i].UrlsByTypeName().DownloadUrl() != "" {
+ tempScore += 1
+ }
+
+ if tempScore == score {
+ if pms[i].Project() < pms[index].Project() {
+ index = i
+ }
+ } else if tempScore > score {
+ score = tempScore
+ index = i
+ }
+ }
+ return pms[index], nil
}
// sbomGenerator implements the spdx bom utility