From ab8249c0f0531a617532c51b5894c9553e522a53 Mon Sep 17 00:00:00 2001 From: Sebastian Schuberth Date: Mon, 6 Mar 2023 12:59:52 +0100 Subject: [PATCH] feat(ScanCodeResultParser): Warn about unsupported versions While parsing newer output format versions might not throw exceptions, results may be incomplete (see [1] for the context). Avoid confusion by warning in that case. [1]: https://github.com/oss-review-toolkit/ort/issues/6617 Signed-off-by: Sebastian Schuberth --- .../scanners/scancode/ScanCodeResultParser.kt | 20 +++++++- .../scancode/ScanCodeResultParserTest.kt | 47 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/scanner/src/main/kotlin/scanners/scancode/ScanCodeResultParser.kt b/scanner/src/main/kotlin/scanners/scancode/ScanCodeResultParser.kt index f785a08e0f64d..3b7778dafa4f7 100644 --- a/scanner/src/main/kotlin/scanners/scancode/ScanCodeResultParser.kt +++ b/scanner/src/main/kotlin/scanners/scancode/ScanCodeResultParser.kt @@ -33,7 +33,9 @@ import org.ossreviewtoolkit.model.Issue import org.ossreviewtoolkit.model.LicenseFinding import org.ossreviewtoolkit.model.ScanSummary import org.ossreviewtoolkit.model.ScannerDetails +import org.ossreviewtoolkit.model.Severity import org.ossreviewtoolkit.model.TextLocation +import org.ossreviewtoolkit.model.createAndLogIssue import org.ossreviewtoolkit.model.utils.associateLicensesWithExceptions import org.ossreviewtoolkit.utils.common.textValueOrEmpty import org.ossreviewtoolkit.utils.spdx.SpdxConstants.LICENSE_REF_PREFIX @@ -42,6 +44,8 @@ import org.ossreviewtoolkit.utils.spdx.toSpdxId import org.semver4j.Semver +const val MAX_SUPPORTED_OUTPUT_FORMAT_MAJOR_VERSION = 2 + internal val SCANCODE_TIMESTAMP_FORMATTER: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HHmmss.n").withZone(ZoneId.of("UTC")) @@ -101,6 +105,20 @@ internal fun generateSummary( ): ScanSummary { val header = result["headers"].single() + val issues = mutableListOf() + val outputFormatVersion = header["output_format_version"]?.textValue()?.let { Semver(it) } + if (outputFormatVersion != null) { + val diff = outputFormatVersion.diff(Semver.coerce(MAX_SUPPORTED_OUTPUT_FORMAT_MAJOR_VERSION.toString())) + if (diff == Semver.VersionDiff.MAJOR) { + issues += ScanCode.createAndLogIssue( + source = ScanCode.SCANNER_NAME, + message = "The output format version $outputFormatVersion exceeds the supported major version " + + "$MAX_SUPPORTED_OUTPUT_FORMAT_MAJOR_VERSION. Results may be incomplete or incorrect.", + severity = Severity.WARNING + ) + } + } + val startTimestamp = header["start_timestamp"].textValue() val endTimestamp = header["end_timestamp"].textValue() @@ -113,7 +131,7 @@ internal fun generateSummary( packageVerificationCode = verificationCode, licenseFindings = getLicenseFindings(result, detectedLicenseMapping, parseExpressions).toSortedSet(), copyrightFindings = getCopyrightFindings(result).toSortedSet(), - issues = getIssues(result) + issues = issues + getIssues(result) ) } diff --git a/scanner/src/test/kotlin/scanners/scancode/ScanCodeResultParserTest.kt b/scanner/src/test/kotlin/scanners/scancode/ScanCodeResultParserTest.kt index 84d5f54ccdb52..99b2e8ce0ae85 100644 --- a/scanner/src/test/kotlin/scanners/scancode/ScanCodeResultParserTest.kt +++ b/scanner/src/test/kotlin/scanners/scancode/ScanCodeResultParserTest.kt @@ -28,16 +28,21 @@ import io.kotest.matchers.Matcher import io.kotest.matchers.collections.beEmpty import io.kotest.matchers.collections.containExactlyInAnyOrder import io.kotest.matchers.collections.shouldBeIn +import io.kotest.matchers.collections.shouldHaveSingleElement import io.kotest.matchers.file.beRelative import io.kotest.matchers.should import io.kotest.matchers.shouldBe import io.kotest.matchers.string.shouldContain import java.io.File +import java.time.Instant +import org.ossreviewtoolkit.model.Issue import org.ossreviewtoolkit.model.LicenseFinding import org.ossreviewtoolkit.model.ScanSummary +import org.ossreviewtoolkit.model.Severity import org.ossreviewtoolkit.model.TextLocation +import org.ossreviewtoolkit.model.jsonMapper import org.ossreviewtoolkit.model.readTree import org.ossreviewtoolkit.utils.spdx.SpdxConstants import org.ossreviewtoolkit.utils.test.transformingCollectionMatcher @@ -211,6 +216,48 @@ class ScanCodeResultParserTest : FreeSpec({ ) } } + + "for output format 3.0.0 should" - { + "create an issue about an unsupported version" { + val headers = """ + { + "headers": [ + { + "tool_name": "scancode-toolkit", + "tool_version": "some future version", + "options": { + "input": [ + "." + ], + "--copyright": true, + "--info": true, + "--json-pp": "scancode.json", + "--license": true, + "--processes": "3", + "--strip-root": true, + "--timeout": "300.0" + }, + "start_timestamp": "2022-12-12T065635.691832", + "end_timestamp": "2022-12-12T065637.770792", + "output_format_version": "3.0.0" + } + ] + } + """.trimIndent() + + val result = jsonMapper.readTree(headers) + + val summary = generateSummary(SpdxConstants.NONE, result) + + summary.issues.map { it.copy(timestamp = Instant.EPOCH) } shouldHaveSingleElement Issue( + timestamp = Instant.EPOCH, + source = ScanCode.SCANNER_NAME, + message = "The output format version 3.0.0 exceeds the supported major version " + + "$MAX_SUPPORTED_OUTPUT_FORMAT_MAJOR_VERSION. Results may be incomplete or incorrect.", + severity = Severity.WARNING + ) + } + } } "generateDetails()" - {