[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
This commit is contained in:
Dmitriy Dolovov
2020-07-17 00:35:56 +07:00
parent 178b5db8de
commit 6de848a15c
@@ -35,6 +35,9 @@ internal data class CommonizerSubtaskParams(
// (common first, then platforms in the same order as in 'orderedTargetNames'). // (common first, then platforms in the same order as in 'orderedTargetNames').
@get:OutputDirectories val resultingLibsDirs: List<File>, @get:OutputDirectories val resultingLibsDirs: List<File>,
// 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 @get:Internal val destinationDir: File
) )
@@ -61,6 +64,9 @@ internal data class CommonizerTaskParams(
lateinit var failurePostActions: List<() -> Unit> lateinit var failurePostActions: List<() -> Unit>
companion object { companion object {
private const val SUCCESS_MARKER = ".commonized"
private const val SUCCESS_MARKER_CONTENT = "1"
fun build( fun build(
kotlinVersion: String, kotlinVersion: String,
targetGroups: List<Set<KonanTarget>>, targetGroups: List<Set<KonanTarget>>,
@@ -77,9 +83,11 @@ internal data class CommonizerTaskParams(
val orderedTargetNames = targets.map { it.name }.sorted() val orderedTargetNames = targets.map { it.name }.sorted()
if (orderedTargetNames.size == 1) { if (orderedTargetNames.size == 1) {
// no need to commonize, just use the libraries from the distribution // no need to commonize, just use the libraries from the distribution
val successMarker = successMarker(distributionLibsDir).also(::writeSuccess)
buildSubtask( buildSubtask(
destinationDir = distributionLibsDir, destinationDir = distributionLibsDir,
orderedTargetNames = orderedTargetNames orderedTargetNames = orderedTargetNames,
successMarker = successMarker
) )
} else { } else {
val discriminator = buildString { val discriminator = buildString {
@@ -89,7 +97,11 @@ internal data class CommonizerTaskParams(
} }
val destinationDir = baseDestinationDir.resolve(discriminator) val destinationDir = baseDestinationDir.resolve(discriminator)
if (!destinationDir.isDirectory) { val successMarker = successMarker(destinationDir)
if (!isSuccess(successMarker)) {
successMarker.delete()
val parentDir = destinationDir.parentFile val parentDir = destinationDir.parentFile
parentDir.mkdirs() parentDir.mkdirs()
@@ -107,13 +119,20 @@ internal data class CommonizerTaskParams(
commandLineArguments += "-targets" commandLineArguments += "-targets"
commandLineArguments += orderedTargetNames.joinToString(separator = ",") commandLineArguments += orderedTargetNames.joinToString(separator = ",")
successPostActions.add { renameDirectory(destinationTmpDir, destinationDir) } successPostActions.add {
failurePostActions.add { renameToTempAndDelete(destinationTmpDir) } renameDirectory(destinationTmpDir, destinationDir)
writeSuccess(successMarker)
}
failurePostActions.add {
renameToTempAndDelete(destinationTmpDir)
}
} }
buildSubtask( buildSubtask(
destinationDir = destinationDir, destinationDir = destinationDir,
orderedTargetNames = orderedTargetNames orderedTargetNames = orderedTargetNames,
successMarker = successMarker
) )
} }
} }
@@ -146,11 +165,31 @@ internal data class CommonizerTaskParams(
} }
} }
private fun buildSubtask(destinationDir: File, orderedTargetNames: List<String>) = CommonizerSubtaskParams( private fun buildSubtask(
destinationDir: File,
orderedTargetNames: List<String>,
successMarker: File
) = CommonizerSubtaskParams(
orderedTargetNames = orderedTargetNames, orderedTargetNames = orderedTargetNames,
resultingLibsDirs = resultingLibsDirs(destinationDir, orderedTargetNames), resultingLibsDirs = resultingLibsDirs(destinationDir, orderedTargetNames),
successMarker = successMarker,
destinationDir = destinationDir 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)
}
} }
} }