You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

84 lines
2.9 KiB

/*
* Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers.
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file.
*/
package org.jetbrains.compose.desktop.application.tasks
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecResult
import org.gradle.work.InputChanges
import org.jetbrains.compose.desktop.application.internal.ComposeProperties
import org.jetbrains.compose.desktop.application.internal.jvmToolFile
import org.jetbrains.compose.desktop.application.internal.ioFile
import org.jetbrains.compose.desktop.application.internal.notNullProperty
import java.io.File
abstract class AbstractJvmToolOperationTask(private val toolName: String) : AbstractComposeDesktopTask() {
@get:LocalState
protected val workingDir: Provider<Directory> = project.layout.buildDirectory.dir("compose/tmp/$name")
@get:OutputDirectory
val destinationDir: DirectoryProperty = objects.directoryProperty()
@get:Input
@get:Optional
val freeArgs: ListProperty<String> = objects.listProperty(String::class.java)
@get:Internal
val javaHome: Property<String> = objects.notNullProperty<String>().apply {
set(providers.systemProperty("java.home"))
}
protected open fun prepareWorkingDir(inputChanges: InputChanges) {
fileOperations.delete(workingDir)
fileOperations.mkdir(workingDir)
}
protected open fun makeArgs(tmpDir: File): MutableList<String> = arrayListOf<String>().apply {
freeArgs.orNull?.forEach { add(it) }
}
protected open fun jvmToolEnvironment(): MutableMap<String, String> =
HashMap()
protected open fun checkResult(result: ExecResult) {
result.assertNormalExitValue()
}
@TaskAction
fun run(inputChanges: InputChanges) {
initState()
val jtool = jvmToolFile(toolName, javaHome = javaHome)
fileOperations.delete(destinationDir)
prepareWorkingDir(inputChanges)
val argsFile = workingDir.ioFile.let { dir ->
val args = makeArgs(dir)
dir.resolveSibling("${name}.args.txt").apply {
writeText(args.joinToString("\n"))
}
}
try {
runExternalTool(
tool = jtool,
args = listOf("@${argsFile.absolutePath}"),
environment = jvmToolEnvironment()
).also { checkResult(it) }
} finally {
if (!ComposeProperties.preserveWorkingDir(providers).get()) {
fileOperations.delete(workingDir)
}
}
saveStateAfterFinish()
}
protected open fun initState() {}
protected open fun saveStateAfterFinish() {}
}