Skip to content

Commit

Permalink
feat(scanner): Add flag to scanner to detect unlicensed files
Browse files Browse the repository at this point in the history
Add flag `includeUnlicensed` to the scanner configuration. Its default
is `false`. When set to `true`, the scanner add to a `ScanResult` files
without license as LicenseFindings with license set to `NONE`.

This contribution makes possible to the scanner to display all files as
license findings. The ultimate goal is that any file without license is
catched by the scanner, so that curation mechanism can override files
without licenses in cases where a license applies to a whole folder.

Signed-off-by: Kiko Fernandez-Reyes <[email protected]>
  • Loading branch information
kikofernandez committed Dec 13, 2024
1 parent ae6e660 commit a9fd947
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
5 changes: 5 additions & 0 deletions model/src/main/kotlin/config/ScannerConfiguration.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ data class ScannerConfiguration(
*/
val skipConcluded: Boolean = false,

/**
* A flag to indicate whether the scanner should add files without license to the scanner results.
*/
val includeUnlicensed: Boolean = false,

/**
* A flag to control whether excluded scopes and paths should be skipped during the scan.
*/
Expand Down
38 changes: 36 additions & 2 deletions scanner/src/main/kotlin/Scanner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ import org.ossreviewtoolkit.model.FileList
import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.model.Issue
import org.ossreviewtoolkit.model.KnownProvenance
import org.ossreviewtoolkit.model.LicenseFinding
import org.ossreviewtoolkit.model.OrtResult
import org.ossreviewtoolkit.model.Package
import org.ossreviewtoolkit.model.PackageType
import org.ossreviewtoolkit.model.ProvenanceResolutionResult
import org.ossreviewtoolkit.model.ScanResult
import org.ossreviewtoolkit.model.ScanSummary
import org.ossreviewtoolkit.model.ScannerRun
import org.ossreviewtoolkit.model.TextLocation
import org.ossreviewtoolkit.model.VcsInfo
import org.ossreviewtoolkit.model.config.DownloaderConfiguration
import org.ossreviewtoolkit.model.config.ScannerConfiguration
Expand Down Expand Up @@ -192,8 +194,6 @@ class Scanner(

val vcsPathsForProvenances = getVcsPathsForProvenances(provenances)

val filteredScanResults = filterScanResultsByVcsPaths(controller.getAllScanResults(), vcsPathsForProvenances)

val files = controller.getAllFileLists().mapTo(mutableSetOf()) { (provenance, fileList) ->
FileList(
provenance = provenance.alignRevisions() as KnownProvenance,
Expand All @@ -207,6 +207,40 @@ class Scanner(
}
}

val filteredScanResults = filterScanResultsByVcsPaths(controller.getAllScanResults(), vcsPathsForProvenances)
.mapTo(mutableSetOf()) { scanResult ->
val licenseFiles = scanResult.summary.licenseFindings.mapTo(mutableSetOf()) { licenseFinding ->
licenseFinding.location.path
}

if (!scannerConfig.includeUnlicensed) {
scanResult.copy(provenance = scanResult.provenance.alignRevisions())
} else {
// Adds files without license to the scanned results
val scanSummary =
controller.getAllFileLists()[scanResult.provenance]?.files
.orEmpty().asSequence().mapNotNull { fileEntry ->
if (fileEntry.path in licenseFiles) {
null
} else {
fileEntry.path
}
}.toSet().let { fileEntryFindings ->
(fileEntryFindings subtract licenseFiles).mapTo(mutableSetOf()) {
LicenseFinding(license = "NONE", location = TextLocation(fileEntryFindings, 1))
}.let {
val allFindings = scanResult.summary.licenseFindings union fileEntryFindings
scanResult.summary.copy(licenseFindings = allFindings)
}
}

scanResult.copy(
provenance = scanResult.provenance.alignRevisions(),
summary = scanSummary
)
}
}

val scannerNames = scannerWrappers.mapTo(mutableSetOf()) { it.name }
val scanners = packages.associateBy({ it.id }) { scannerNames }

Expand Down

0 comments on commit a9fd947

Please sign in to comment.