Skip to content

Commit

Permalink
Replaced absolute paths in the Kover artifact with relative ones
Browse files Browse the repository at this point in the history
Fixes #440

Co-authored-by: Leonid Startsev <sandwwraith@users.noreply.github.com>

PR #444
  • Loading branch information
shanshin authored Sep 22, 2023
1 parent a78053e commit db3d54f
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 = """
Expand All @@ -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,
Expand All @@ -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)
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,39 @@ 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")
}

/**
* 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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -42,7 +37,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val externalSources: Provider<Set<File>> = 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
}

/**
Expand All @@ -52,7 +47,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val externalReports: Provider<Set<File>> = 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
}

/**
Expand All @@ -61,7 +56,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val localSources: Provider<Set<File>> = localArtifact.map {
it.asFile.parseArtifactFile().sources
it.asFile.parseArtifactFile(rootDir).sources
}

/**
Expand All @@ -70,7 +65,7 @@ internal abstract class AbstractKoverReportTask : DefaultTask() {
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val localReports: Provider<Set<File>> = localArtifact.map {
it.asFile.parseArtifactFile().reports
it.asFile.parseArtifactFile(rootDir).reports
}

@get:Nested
Expand All @@ -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()
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

0 comments on commit db3d54f

Please sign in to comment.