From 6de848a15c767aaca2c5ebd7920b967a7c939bb9 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 17 Jul 2020 00:35:56 +0700 Subject: [PATCH] [Commonizer] Introduce success marker file in Gradle task The success marker file is written to the disk only upon successful commonization. If something goes wrong, this file is not written to the disk. So the subsequent call of 'runCommonizer' task will be considered not up-to-date. ^KT-40120 --- .../targets/native/internal/CommonizerTask.kt | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTask.kt index 872f441f63f..1cf3146c264 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTask.kt @@ -35,6 +35,9 @@ internal data class CommonizerSubtaskParams( // (common first, then platforms in the same order as in 'orderedTargetNames'). @get:OutputDirectories val resultingLibsDirs: List, + // Only for up-to-date checker. The file exists if and only if a commonizer subtask was successfully accomplished. + @get:OutputFile val successMarker: File, + @get:Internal val destinationDir: File ) @@ -61,6 +64,9 @@ internal data class CommonizerTaskParams( lateinit var failurePostActions: List<() -> Unit> companion object { + private const val SUCCESS_MARKER = ".commonized" + private const val SUCCESS_MARKER_CONTENT = "1" + fun build( kotlinVersion: String, targetGroups: List>, @@ -77,9 +83,11 @@ internal data class CommonizerTaskParams( val orderedTargetNames = targets.map { it.name }.sorted() if (orderedTargetNames.size == 1) { // no need to commonize, just use the libraries from the distribution + val successMarker = successMarker(distributionLibsDir).also(::writeSuccess) buildSubtask( destinationDir = distributionLibsDir, - orderedTargetNames = orderedTargetNames + orderedTargetNames = orderedTargetNames, + successMarker = successMarker ) } else { val discriminator = buildString { @@ -89,7 +97,11 @@ internal data class CommonizerTaskParams( } val destinationDir = baseDestinationDir.resolve(discriminator) - if (!destinationDir.isDirectory) { + val successMarker = successMarker(destinationDir) + + if (!isSuccess(successMarker)) { + successMarker.delete() + val parentDir = destinationDir.parentFile parentDir.mkdirs() @@ -107,13 +119,20 @@ internal data class CommonizerTaskParams( commandLineArguments += "-targets" commandLineArguments += orderedTargetNames.joinToString(separator = ",") - successPostActions.add { renameDirectory(destinationTmpDir, destinationDir) } - failurePostActions.add { renameToTempAndDelete(destinationTmpDir) } + successPostActions.add { + renameDirectory(destinationTmpDir, destinationDir) + writeSuccess(successMarker) + } + + failurePostActions.add { + renameToTempAndDelete(destinationTmpDir) + } } buildSubtask( destinationDir = destinationDir, - orderedTargetNames = orderedTargetNames + orderedTargetNames = orderedTargetNames, + successMarker = successMarker ) } } @@ -146,11 +165,31 @@ internal data class CommonizerTaskParams( } } - private fun buildSubtask(destinationDir: File, orderedTargetNames: List) = CommonizerSubtaskParams( + private fun buildSubtask( + destinationDir: File, + orderedTargetNames: List, + successMarker: File + ) = CommonizerSubtaskParams( orderedTargetNames = orderedTargetNames, resultingLibsDirs = resultingLibsDirs(destinationDir, orderedTargetNames), + successMarker = successMarker, destinationDir = destinationDir ) + + private fun successMarker(destinationDir: File) = destinationDir.resolve(SUCCESS_MARKER) + private fun isSuccess(successMarker: File) = successMarker.isFile && successMarker.readText() == SUCCESS_MARKER_CONTENT + + private fun writeSuccess(successMarker: File) { + if (successMarker.exists()) { + when { + successMarker.isDirectory -> renameToTempAndDelete(successMarker) + isSuccess(successMarker) -> return + else -> successMarker.delete() + } + } + + successMarker.writeText(SUCCESS_MARKER_CONTENT) + } } }