Skip to content

Commit c27cec6

Browse files
committed
fix(reporter): Fix the creation of first level dependency relationships
As of [1] the SPDX reporter intends to associate any first level dependency with all root projects it corresponds to. The implementation introduced by [1] has the following issues: 1. Relationships to excluded packages are added, even though excluded packages are not contained in the report. For proof see [2] which adds such relationship. 2. Dependencies which are direct depdendencies of a sub-project, but not of any root project are not considered a first level dependency. Such dependencies may not be linked into the dependency tree of resulting SPDX document at all. Rewrite the algorithm in order to fix both of the above mentioned issues. Fixes #7487. [1] b471544 [2] b471544#diff-6de35dd2aff1f92b7f5ea558d3f77e02d0d596dd4ce2a8199056cfb31b47fcabR181-R184 Signed-off-by: Frank Viernau <[email protected]>
1 parent 9ee9e75 commit c27cec6

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

plugins/reporters/spdx/src/funTest/assets/spdx-document-reporter-expected-output.spdx.json

-4
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,6 @@
240240
"spdxElementId" : "SPDXRef-Package-Maven-seventh-package-group-seventh-package-0.0.1",
241241
"relationshipType" : "GENERATED_FROM",
242242
"relatedSpdxElement" : "SPDXRef-Package-Maven-seventh-package-group-seventh-package-0.0.1-source-artifact"
243-
}, {
244-
"spdxElementId" : "SPDXRef-Project-Maven-first-project-group-first-project-name-0.0.1",
245-
"relationshipType" : "DEPENDS_ON",
246-
"relatedSpdxElement" : "SPDXRef-Package-Maven-fifth-package-group-fifth-package-0.0.1"
247243
}, {
248244
"spdxElementId" : "SPDXRef-Project-Maven-first-project-group-first-project-name-0.0.1",
249245
"relationshipType" : "DEPENDS_ON",

plugins/reporters/spdx/src/funTest/assets/spdx-document-reporter-expected-output.spdx.yml

-3
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,6 @@ relationships:
241241
- spdxElementId: "SPDXRef-Package-Maven-seventh-package-group-seventh-package-0.0.1"
242242
relationshipType: "GENERATED_FROM"
243243
relatedSpdxElement: "SPDXRef-Package-Maven-seventh-package-group-seventh-package-0.0.1-source-artifact"
244-
- spdxElementId: "SPDXRef-Project-Maven-first-project-group-first-project-name-0.0.1"
245-
relationshipType: "DEPENDS_ON"
246-
relatedSpdxElement: "SPDXRef-Package-Maven-fifth-package-group-fifth-package-0.0.1"
247244
- spdxElementId: "SPDXRef-Project-Maven-first-project-group-first-project-name-0.0.1"
248245
relationshipType: "DEPENDS_ON"
249246
relatedSpdxElement: "SPDXRef-Package-Maven-first-package-group-first-package-0.0.1"

plugins/reporters/spdx/src/main/kotlin/SpdxDocumentModelMapper.kt

+30-7
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger
2626

2727
import org.apache.logging.log4j.kotlin.Logging
2828

29+
import org.ossreviewtoolkit.model.Identifier
2930
import org.ossreviewtoolkit.model.OrtResult
3031
import org.ossreviewtoolkit.model.SourceCodeOrigin.ARTIFACT
3132
import org.ossreviewtoolkit.model.SourceCodeOrigin.VCS
@@ -64,21 +65,21 @@ internal object SpdxDocumentModelMapper : Logging {
6465

6566
val projects = ortResult.getProjects(omitExcluded = true, includeSubProjects = false).sortedBy { it.id }
6667
val projectPackages = projects.map { project ->
67-
val spdxProjectPackage = project.toPackage().toSpdxPackage(
68+
project.toPackage().toSpdxPackage(
6869
SpdxPackageType.PROJECT,
6970
licenseInfoResolver,
7071
ortResult
7172
)
73+
}
7274

73-
ortResult.getDependencies(project.id, 1).mapTo(relationships) { dependency ->
74-
SpdxRelationship(
75-
spdxElementId = spdxProjectPackage.spdxId,
75+
ortResult.getRootProjectsForFirstLevelDependencies().forEach { (pkgId, rootProjectIds) ->
76+
rootProjectIds.forEach { rootProjectId ->
77+
relationships += SpdxRelationship(
78+
spdxElementId = rootProjectId.toSpdxId(SpdxPackageType.PROJECT),
7679
relationshipType = SpdxRelationship.Type.DEPENDS_ON,
77-
relatedSpdxElement = dependency.toSpdxId()
80+
relatedSpdxElement = pkgId.toSpdxId(SpdxPackageType.BINARY_PACKAGE)
7881
)
7982
}
80-
81-
spdxProjectPackage
8283
}
8384

8485
val files = mutableListOf<SpdxFile>()
@@ -169,3 +170,25 @@ internal object SpdxDocumentModelMapper : Logging {
169170
).addExtractedLicenseInfo(licenseTextProvider)
170171
}
171172
}
173+
174+
/**
175+
* Return a mapping from the identifiers of all non-excluded first level dependencies to the identifiers of the
176+
* non-excluded root projects they correspond to.
177+
*/
178+
private fun OrtResult.getRootProjectsForFirstLevelDependencies(): Map<Identifier, Set<Identifier>> {
179+
val result = mutableMapOf<Identifier, MutableSet<Identifier>>()
180+
181+
getProjects(omitExcluded = true).map { it.id }.forEach { rootProjectId ->
182+
val subProjectIds = getDependencies(rootProjectId).filter { isProject(it) && !isExcluded(it) }
183+
184+
val firstLevelDependencies = (subProjectIds + rootProjectId).flatMapTo(mutableSetOf()) { projectId ->
185+
getDependencies(projectId, maxLevel = 1).filter { isPackage(it) && !isExcluded(it) }
186+
}
187+
188+
firstLevelDependencies.forEach { pkgId ->
189+
result.getOrPut(pkgId) { mutableSetOf() } += rootProjectId
190+
}
191+
}
192+
193+
return result
194+
}

0 commit comments

Comments
 (0)