From db3d54fe72fc6e899b5040e276c1651774cee028 Mon Sep 17 00:00:00 2001 From: Sergey Shanshin Date: Fri, 22 Sep 2023 14:03:42 +0300 Subject: [PATCH] Replaced absolute paths in the Kover artifact with relative ones Fixes #440 Co-authored-by: Leonid Startsev PR #444 --- .../cases/BuildCacheRelocationTests.kt | 43 ++++++++++++------- .../kover/gradle/plugin/commons/Artifacts.kt | 24 +++++++---- .../tasks/reports/AbstractKoverReportTask.kt | 19 ++++---- .../services/KoverArtifactGenerationTask.kt | 6 ++- 4 files changed, 56 insertions(+), 36 deletions(-) diff --git a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/BuildCacheRelocationTests.kt b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/BuildCacheRelocationTests.kt index 0fc2a94b..fce35969 100644 --- a/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/BuildCacheRelocationTests.kt +++ b/kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/BuildCacheRelocationTests.kt @@ -12,7 +12,7 @@ import kotlin.test.assertEquals class BuildCacheRelocationTests { @Test - fun testDefaultTasks() { + fun test() { val cachePath = Files.createTempDirectory("test-gradle-cache-").toFile().canonicalPath val cachePatch = """ @@ -26,13 +26,21 @@ class BuildCacheRelocationTests { val gradleBuild1 = buildSource.generate() gradleBuild1.targetDir.resolve("settings.gradle.kts").appendText(cachePatch) - val result1 = gradleBuild1.runWithParams("koverXmlReport", "koverHtmlReport", "koverBinaryReport", "koverVerify", "--build-cache") - assertEquals("SUCCESS", result1.taskOutcome(":test")) - assertEquals("SUCCESS", result1.taskOutcome(":koverGenerateArtifact")) - assertEquals("SUCCESS", result1.taskOutcome(":koverXmlReport")) - assertEquals("SUCCESS", result1.taskOutcome(":koverHtmlReport")) - assertEquals("SUCCESS", result1.taskOutcome(":koverBinaryReport")) - assertEquals("SUCCESS", result1.taskOutcome(":koverVerify")) + val result1 = gradleBuild1.runWithParams("koverXmlReport", "koverHtmlReport", "koverBinaryReport", "koverVerify", "--build-cache", "--info") + try { + assertEquals("SUCCESS", result1.taskOutcome(":test")) + assertEquals("SUCCESS", result1.taskOutcome(":koverGenerateArtifact")) + assertEquals("SUCCESS", result1.taskOutcome(":koverXmlReport")) + assertEquals("SUCCESS", result1.taskOutcome(":koverHtmlReport")) + assertEquals("SUCCESS", result1.taskOutcome(":koverBinaryReport")) + assertEquals("SUCCESS", result1.taskOutcome(":koverVerify")) + } catch (e: Exception) { + throw AssertionError("Build log \n${result1.output}",e) + } + + + // delete the previous build to simulate project relocation + gradleBuild1.targetDir.deleteRecursively() /* since the build is created from a template, @@ -42,12 +50,17 @@ class BuildCacheRelocationTests { */ val gradleBuild2 = buildSource.generate() gradleBuild2.targetDir.resolve("settings.gradle.kts").appendText(cachePatch) - val result2 = gradleBuild2.runWithParams("koverXmlReport", "koverHtmlReport", "koverBinaryReport", "koverVerify", "--build-cache") - assertEquals("FROM-CACHE", result2.taskOutcome(":test")) - assertEquals("FROM-CACHE", result2.taskOutcome(":koverGenerateArtifact")) - assertEquals("FROM-CACHE", result2.taskOutcome(":koverXmlReport")) - assertEquals("FROM-CACHE", result2.taskOutcome(":koverHtmlReport")) - assertEquals("FROM-CACHE", result2.taskOutcome(":koverBinaryReport")) - assertEquals("FROM-CACHE", result2.taskOutcome(":koverVerify")) + val result2 = gradleBuild2.runWithParams("koverXmlReport", "koverHtmlReport", "koverBinaryReport", "koverVerify", "--build-cache", "--info") + try { + assertEquals("FROM-CACHE", result2.taskOutcome(":test")) + assertEquals("FROM-CACHE", result2.taskOutcome(":koverGenerateArtifact")) + assertEquals("FROM-CACHE", result2.taskOutcome(":koverXmlReport")) + assertEquals("FROM-CACHE", result2.taskOutcome(":koverHtmlReport")) + assertEquals("FROM-CACHE", result2.taskOutcome(":koverBinaryReport")) + assertEquals("FROM-CACHE", result2.taskOutcome(":koverVerify")) + } catch (e: Exception) { + throw AssertionError("Build log \n${result2.output}",e) + } + } } \ No newline at end of file diff --git a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/commons/Artifacts.kt b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/commons/Artifacts.kt index 1624e5e1..2ae9842d 100644 --- a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/commons/Artifacts.kt +++ b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/commons/Artifacts.kt @@ -28,16 +28,24 @@ internal class ArtifactContent( return ArtifactContent(sources, outputs, reports) } + + fun existing(): ArtifactContent { + return ArtifactContent( + sources.filter { it.exists() }.toSet(), + outputs.filter { it.exists() }.toSet(), + reports.filter { it.exists() }.toSet() + ) + } } /** * Write Kover artifact content to the file. */ -internal fun ArtifactContent.write(artifactFile: File) { - val sources = sources.joinToString("\n") { it.canonicalPath } - val outputs = outputs.joinToString("\n") { it.canonicalPath } - val reports = reports.joinToString("\n") { it.canonicalPath } +internal fun ArtifactContent.write(artifactFile: File, rootDir: File) { + val sources = sources.joinToString("\n") { it.toRelativeString(rootDir) } + val outputs = outputs.joinToString("\n") { it.toRelativeString(rootDir) } + val reports = reports.joinToString("\n") { it.toRelativeString(rootDir) } artifactFile.writeText("$sources\n\n$outputs\n\n$reports") } @@ -45,14 +53,14 @@ internal fun ArtifactContent.write(artifactFile: File) { /** * Read Kover artifact content from the file. */ -internal fun File.parseArtifactFile(): ArtifactContent { +internal fun File.parseArtifactFile(rootDir: File): ArtifactContent { if (!exists()) return ArtifactContent(emptySet(), emptySet(), emptySet()) val iterator = readLines().iterator() - val sources = iterator.groupUntil { it.isEmpty() }.map { File(it) }.filter { it.exists() }.toSet() - val outputs = iterator.groupUntil { it.isEmpty() }.map { File(it) }.filter { it.exists() }.toSet() - val reports = iterator.groupUntil { it.isEmpty() }.map { File(it) }.filter { it.exists() }.toSet() + val sources = iterator.groupUntil { it.isEmpty() }.map { rootDir.resolve(it) }.toSet() + val outputs = iterator.groupUntil { it.isEmpty() }.map { rootDir.resolve(it) }.toSet() + val reports = iterator.groupUntil { it.isEmpty() }.map { rootDir.resolve(it) }.toSet() return ArtifactContent(sources, outputs, reports) } diff --git a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/reports/AbstractKoverReportTask.kt b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/reports/AbstractKoverReportTask.kt index 102ed4f6..6617f158 100644 --- a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/reports/AbstractKoverReportTask.kt +++ b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/reports/AbstractKoverReportTask.kt @@ -4,19 +4,14 @@ package kotlinx.kover.gradle.plugin.tasks.reports -import kotlinx.kover.api.* import kotlinx.kover.gradle.plugin.commons.* -import kotlinx.kover.gradle.plugin.dsl.* import kotlinx.kover.gradle.plugin.tools.* -import kotlinx.kover.gradle.plugin.tools.kover.* import org.gradle.api.* import org.gradle.api.file.* import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.* import org.gradle.api.tasks.* -import org.gradle.configurationcache.extensions.* import org.gradle.kotlin.dsl.* -import org.gradle.process.* import org.gradle.workers.WorkerExecutor import java.io.File import javax.inject.Inject @@ -42,7 +37,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() { @get:PathSensitive(PathSensitivity.RELATIVE) internal val externalSources: Provider> = externalArtifacts.elements.map { val content = ArtifactContent(emptySet(), emptySet(), emptySet()) - content.joinWith(it.map { file -> file.asFile.parseArtifactFile() }).sources + content.joinWith(it.map { file -> file.asFile.parseArtifactFile(rootDir) }).sources } /** @@ -52,7 +47,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() { @get:PathSensitive(PathSensitivity.RELATIVE) internal val externalReports: Provider> = externalArtifacts.elements.map { val content = ArtifactContent(emptySet(), emptySet(), emptySet()) - content.joinWith(it.map { file -> file.asFile.parseArtifactFile() }).reports + content.joinWith(it.map { file -> file.asFile.parseArtifactFile(rootDir) }).reports } /** @@ -61,7 +56,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() { @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) internal val localSources: Provider> = localArtifact.map { - it.asFile.parseArtifactFile().sources + it.asFile.parseArtifactFile(rootDir).sources } /** @@ -70,7 +65,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() { @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) internal val localReports: Provider> = localArtifact.map { - it.asFile.parseArtifactFile().reports + it.asFile.parseArtifactFile(rootDir).reports } @get:Nested @@ -92,14 +87,16 @@ internal abstract class AbstractKoverReportTask : DefaultTask() { @get:Inject protected abstract val workerExecutor: WorkerExecutor + private val rootDir: File = project.rootDir + protected fun context(): ReportContext { val services = GradleReportServices(workerExecutor, ant, obj) return ReportContext(collectAllFiles(), filters.get(), reportClasspath, temporaryDir, projectPath, services) } private fun collectAllFiles(): ArtifactContent { - val local = localArtifact.get().asFile.parseArtifactFile() - return local.joinWith(externalArtifacts.files.map { it.parseArtifactFile() }) + val local = localArtifact.get().asFile.parseArtifactFile(rootDir) + return local.joinWith(externalArtifacts.files.map { it.parseArtifactFile(rootDir) }).existing() } } diff --git a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/services/KoverArtifactGenerationTask.kt b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/services/KoverArtifactGenerationTask.kt index c3564e54..0ca63f4c 100644 --- a/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/services/KoverArtifactGenerationTask.kt +++ b/kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/tasks/services/KoverArtifactGenerationTask.kt @@ -40,10 +40,12 @@ internal abstract class KoverArtifactGenerationTask : DefaultTask() { @get:OutputFile abstract val artifactFile: RegularFileProperty + private val rootDir: File = project.rootDir + @TaskAction fun generate() { val mainContent = ArtifactContent(sources.toSet(), outputDirs.toSet(), reports.toSet()) - val additional = additionalArtifacts.files.map { it.parseArtifactFile() } - mainContent.joinWith(additional).write(artifactFile.get().asFile) + val additional = additionalArtifacts.files.map { it.parseArtifactFile(rootDir) } + mainContent.joinWith(additional).write(artifactFile.get().asFile, rootDir) } }