Use NIO Files for creating temp files: build tools

This commit is contained in:
Ilya Gorbunov
2020-11-14 09:50:43 +03:00
parent 30bb7d19c0
commit c9bbdf6575
5 changed files with 31 additions and 20 deletions
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.progress.CompilationCanceledStatus
import org.jetbrains.kotlin.resolve.sam.SAM_LOOKUP_NAME import org.jetbrains.kotlin.resolve.sam.SAM_LOOKUP_NAME
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import java.io.File import java.io.File
import java.nio.file.Files
import java.util.* import java.util.*
import kotlin.collections.HashSet import kotlin.collections.HashSet
import kotlin.collections.LinkedHashSet import kotlin.collections.LinkedHashSet
@@ -67,7 +68,7 @@ fun makeModuleFile(
friendDirs friendDirs
) )
val scriptFile = File.createTempFile("kjps", sanitizeJavaIdentifier(name) + ".script.xml") val scriptFile = Files.createTempFile("kjps", sanitizeJavaIdentifier(name) + ".script.xml").toFile()
scriptFile.writeText(builder.asText().toString()) scriptFile.writeText(builder.asText().toString())
return scriptFile return scriptFile
} }
@@ -46,6 +46,9 @@ import org.jetbrains.kotlin.utils.keysToMap
import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassReader
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
private const val JVM_BUILD_META_INFO_FILE_NAME = "jvm-build-meta-info.txt" private const val JVM_BUILD_META_INFO_FILE_NAME = "jvm-build-meta-info.txt"
@@ -242,14 +245,18 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
append("-test") append("-test")
} }
} }
val dir = System.getProperty("kotlin.jps.dir.for.module.files")?.let { File(it) }?.takeIf { it.isDirectory }
fun createTempFile(dir: Path?, prefix: String?, suffix: String?): Path =
if (dir != null) Files.createTempFile(dir, prefix, suffix) else Files.createTempFile(prefix, suffix)
val dir = System.getProperty("kotlin.jps.dir.for.module.files")?.let { Paths.get(it) }?.takeIf { Files.isDirectory(it) }
return try { return try {
File.createTempFile("kjps", readableSuffix + ".script.xml", dir) createTempFile(dir, "kjps", readableSuffix + ".script.xml")
} catch (e: IOException) { } catch (e: IOException) {
// sometimes files cannot be created, because file name is too long (Windows, Mac OS) // sometimes files cannot be created, because file name is too long (Windows, Mac OS)
// see https://bugs.openjdk.java.net/browse/JDK-8148023 // see https://bugs.openjdk.java.net/browse/JDK-8148023
try { try {
File.createTempFile("kjps", ".script.xml", dir) createTempFile(dir, "kjps", ".script.xml")
} catch (e: IOException) { } catch (e: IOException) {
val message = buildString { val message = buildString {
append("Could not create module file when building chunk $chunk") append("Could not create module file when building chunk $chunk")
@@ -259,7 +266,7 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
} }
throw RuntimeException(message, e) throw RuntimeException(message, e)
} }
} }.toFile()
} }
private fun findClassPathRoots(): Collection<File> { private fun findClassPathRoots(): Collection<File> {
@@ -31,6 +31,7 @@ import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.FieldVisitor import org.jetbrains.org.objectweb.asm.FieldVisitor
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
import java.io.File import java.io.File
import java.nio.file.Files
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.zip.ZipFile import java.util.zip.ZipFile
@@ -126,7 +127,7 @@ internal fun runToolInSeparateProcess(
private fun writeArgumentsToFile(directory: File, argsArray: Array<String>): File { private fun writeArgumentsToFile(directory: File, argsArray: Array<String>): File {
val compilerOptions = val compilerOptions =
File.createTempFile(LocalDateTime.now().format(DateTimeFormatter.BASIC_ISO_DATE) + "_", ".compiler.options", directory) Files.createTempFile(directory.toPath(), LocalDateTime.now().format(DateTimeFormatter.BASIC_ISO_DATE) + "_", ".compiler.options").toFile()
compilerOptions.deleteOnExit() compilerOptions.deleteOnExit()
compilerOptions.writeText(argsArray.joinToString(" ") { "\"${StringEscapeUtils.escapeJava(it)}\"" }) compilerOptions.writeText(argsArray.joinToString(" ") { "\"${StringEscapeUtils.escapeJava(it)}\"" })
return compilerOptions return compilerOptions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.Project import org.gradle.api.Project
import java.io.File import java.io.File
import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
import java.util.* import java.util.*
@@ -28,10 +29,10 @@ internal fun File.relativeToRoot(project: Project): String =
internal fun Iterable<File>.toSortedPathsArray(): Array<String> = internal fun Iterable<File>.toSortedPathsArray(): Array<String> =
map { it.canonicalPath }.toTypedArray().also { Arrays.sort(it) } map { it.canonicalPath }.toTypedArray().also { Arrays.sort(it) }
internal fun newTmpFile(prefix: String, suffix: String? = null, directory: File? = null, deleteOnExit: Boolean = true) = internal fun newTmpFile(prefix: String, suffix: String? = null, directory: File? = null, deleteOnExit: Boolean = true): File =
File.createTempFile(prefix, suffix, directory).apply { (if (directory == null) Files.createTempFile(prefix, suffix) else Files.createTempFile(directory.toPath(), prefix, suffix))
if (deleteOnExit) deleteOnExit() .toFile()
} .apply { if (deleteOnExit) deleteOnExit() }
internal fun File.isParentOf(childCandidate: File, strict: Boolean = false): Boolean { internal fun File.isParentOf(childCandidate: File, strict: Boolean = false): Boolean {
val parentPath = Paths.get(this.absolutePath).normalize() val parentPath = Paths.get(this.absolutePath).normalize()
@@ -53,9 +53,10 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.ConfigurationKt;
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar; import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar;
import org.jetbrains.kotlin.utils.ParametersMapKt; import org.jetbrains.kotlin.utils.ParametersMapKt;
import java.io.File; import java.io.*;
import java.io.FileOutputStream; import java.nio.charset.StandardCharsets;
import java.io.IOException; import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -138,17 +139,17 @@ public class ExecuteKotlinScriptMojo extends AbstractMojo {
buildDirectory.mkdirs(); buildDirectory.mkdirs();
} }
File scriptFile = File.createTempFile("kotlin-maven-plugin-inline-script-", ".tmp.kts", buildDirectory); Path scriptFile = Files.createTempFile(buildDirectory.toPath(), "kotlin-maven-plugin-inline-script-", ".tmp.kts");
FileOutputStream stream = new FileOutputStream(scriptFile); try (BufferedWriter writer = Files.newBufferedWriter(scriptFile, StandardCharsets.UTF_8)) {
stream.write(script.getBytes("UTF-8")); writer.write(script);
stream.close(); }
try { try {
executeScriptFile(scriptFile); executeScriptFile(scriptFile.toFile());
} finally { } finally {
boolean deleted = scriptFile.delete(); boolean deleted = Files.deleteIfExists(scriptFile);
if (!deleted) { if (!deleted) {
getLog().warn("Error deleting " + scriptFile.getAbsolutePath()); getLog().warn("Error deleting " + scriptFile.toAbsolutePath());
} }
} }
} catch (IOException e) { } catch (IOException e) {