Compare commits

...

3 Commits

Author SHA1 Message Date
Ilya Gorbunov
003b3e84cc Use NIO Files for creating temp files: idea plugin 2020-11-17 03:43:40 +03:00
Ilya Gorbunov
335901a3a8 Use NIO Files for creating temp files: scripting, daemon, main-kts 2020-11-17 03:43:09 +03:00
Ilya Gorbunov
f156f0283a Use NIO Files for creating temp files: build tools 2020-11-17 03:42:43 +03:00
12 changed files with 72 additions and 31 deletions

View File

@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.progress.CompilationCanceledStatus
import org.jetbrains.kotlin.resolve.sam.SAM_LOOKUP_NAME
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import java.io.File
import java.nio.file.Files
import java.util.*
import kotlin.collections.HashSet
import kotlin.collections.LinkedHashSet
@@ -67,7 +68,7 @@ fun makeModuleFile(
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())
return scriptFile
}

View File

@@ -25,6 +25,7 @@ import java.io.File
import java.io.Serializable
import java.net.SocketException
import java.nio.channels.ClosedChannelException
import java.nio.file.Files
import java.rmi.ConnectException
import java.rmi.ConnectIOException
import java.rmi.UnmarshalException
@@ -422,7 +423,7 @@ class KotlinCompilerClient : KotlinCompilerDaemonClient {
report: (DaemonReportCategory, String) -> Unit
): Deferred<Pair<CompileServiceAsync?, DaemonJVMOptions>> = GlobalScope.async {
registryDir.mkdirs()
val timestampMarker = createTempFile("kotlin-daemon-client-tsmarker", directory = registryDir)
val timestampMarker = Files.createTempFile(registryDir.toPath(), "kotlin-daemon-client-tsmarker", null).toFile()
val aliveWithMetadata = try {
walkDaemonsAsync(registryDir, compilerId, timestampMarker, report = report)
} finally {

View File

@@ -26,6 +26,7 @@ import java.io.File
import java.io.OutputStream
import java.io.PrintStream
import java.net.SocketException
import java.nio.file.Files
import java.rmi.ConnectException
import java.rmi.ConnectIOException
import java.rmi.UnmarshalException
@@ -347,7 +348,7 @@ object KotlinCompilerClient {
private fun tryFindSuitableDaemonOrNewOpts(registryDir: File, compilerId: CompilerId, daemonJVMOptions: DaemonJVMOptions, report: (DaemonReportCategory, String) -> Unit): Pair<CompileService?, DaemonJVMOptions> {
registryDir.mkdirs()
val timestampMarker = createTempFile("kotlin-daemon-client-tsmarker", directory = registryDir)
val timestampMarker = Files.createTempFile(registryDir.toPath(), "kotlin-daemon-client-tsmarker", null).toFile()
val aliveWithMetadata = try {
walkDaemons(registryDir, compilerId, timestampMarker, report = report).toList()
}

View File

@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.daemon.common
import java.io.File
import java.nio.file.Files
import java.rmi.registry.LocateRegistry
@@ -106,7 +107,12 @@ private inline fun tryConnectToDaemon(port: Int, report: (DaemonReportCategory,
private const val validFlagFileKeywordChars = "abcdefghijklmnopqrstuvwxyz0123456789-_"
fun makeAutodeletingFlagFile(keyword: String = "compiler-client", baseDir: File? = null): File {
val flagFile = File.createTempFile("kotlin-${keyword.filter { validFlagFileKeywordChars.contains(it.toLowerCase()) }}-", "-is-running", baseDir?.takeIf { it.isDirectory && it.exists() })
val prefix = "kotlin-${keyword.filter { validFlagFileKeywordChars.contains(it.toLowerCase()) }}-"
val flagFile = if (baseDir?.isDirectory == true)
Files.createTempFile(baseDir.toPath(), prefix, "-is-running").toFile()
else
Files.createTempFile(prefix, "-is-running").toFile()
flagFile.deleteOnExit()
return flagFile
}

View File

@@ -20,6 +20,8 @@ import com.intellij.openapi.application.ApplicationManager;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class PluginStartupApplicationService {
@@ -32,9 +34,9 @@ public class PluginStartupApplicationService {
public synchronized String getAliveFlagPath() {
if (this.aliveFlagPath == null) {
try {
File flagFile = File.createTempFile("kotlin-idea-", "-is-running");
flagFile.deleteOnExit();
this.aliveFlagPath = flagFile.getAbsolutePath();
Path flagFile = Files.createTempFile("kotlin-idea-", "-is-running");
flagFile.toFile().deleteOnExit();
this.aliveFlagPath = flagFile.toAbsolutePath().toString();
}
catch (IOException e) {
this.aliveFlagPath = "";

View File

@@ -46,6 +46,9 @@ import org.jetbrains.kotlin.utils.keysToMap
import org.jetbrains.org.objectweb.asm.ClassReader
import java.io.File
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"
@@ -242,14 +245,18 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
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 {
File.createTempFile("kjps", readableSuffix + ".script.xml", dir)
createTempFile(dir, "kjps", readableSuffix + ".script.xml")
} catch (e: IOException) {
// sometimes files cannot be created, because file name is too long (Windows, Mac OS)
// see https://bugs.openjdk.java.net/browse/JDK-8148023
try {
File.createTempFile("kjps", ".script.xml", dir)
createTempFile(dir, "kjps", ".script.xml")
} catch (e: IOException) {
val message = buildString {
append("Could not create module file when building chunk $chunk")
@@ -259,7 +266,7 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
}
throw RuntimeException(message, e)
}
}
}.toFile()
}
private fun findClassPathRoots(): Collection<File> {

View File

@@ -4,7 +4,9 @@ plugins {
id("jps-compatible")
}
val JDK_16: String by project
jvmTarget = "1.6"
javaHome = JDK_16
dependencies {
compile(project(":kotlin-script-runtime"))
@@ -22,6 +24,10 @@ tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>> {
kotlinOptions.freeCompilerArgs += "-Xallow-kotlin-package"
}
tasks.withType<Test> {
executable = "$JDK_16/bin/java"
}
publish()
runtimeJar()

View File

@@ -59,9 +59,18 @@ class ClasspathExtractionException(message: String) : Exception(message)
fun classpathFromClassloader(currentClassLoader: ClassLoader, unpackJarCollections: Boolean = false): List<File>? {
val processedJars = hashSetOf<File>()
val unpackJarCollectionsDir by lazy {
createTempDir("unpackedJarCollections").canonicalFile.also {
File.createTempFile("unpackedJarCollections", null).canonicalFile.apply {
delete()
mkdir()
setReadable(false, false)
setWritable(false, false)
setExecutable(false, false)
setReadable(true, true)
setWritable(true, true)
setExecutable(true, true)
Runtime.getRuntime().addShutdownHook(Thread {
it.deleteRecursively()
deleteRecursively()
})
}
}
@@ -144,8 +153,12 @@ fun ClassLoader.classPathFromTypicalResourceUrls(): Sequence<File> =
.distinct()
.filter { it.isValidClasspathFile() }
private fun File.unpackJarCollection(rootTempDir: File?): Sequence<File> {
val targetDir = createTempDir(nameWithoutExtension, directory = rootTempDir)
private fun File.unpackJarCollection(rootTempDir: File): Sequence<File> {
val targetDir = File.createTempFile(nameWithoutExtension, null, rootTempDir).apply {
delete()
mkdir()
}
return try {
ArrayList<File>().apply {
JarInputStream(FileInputStream(this@unpackJarCollection)).use { jarInputStream ->

View 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.Opcodes
import java.io.File
import java.nio.file.Files
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.zip.ZipFile
@@ -126,7 +127,7 @@ internal fun runToolInSeparateProcess(
private fun writeArgumentsToFile(directory: File, argsArray: Array<String>): File {
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.writeText(argsArray.joinToString(" ") { "\"${StringEscapeUtils.escapeJava(it)}\"" })
return compilerOptions

View File

@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.Project
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*
@@ -28,10 +29,10 @@ internal fun File.relativeToRoot(project: Project): String =
internal fun Iterable<File>.toSortedPathsArray(): Array<String> =
map { it.canonicalPath }.toTypedArray().also { Arrays.sort(it) }
internal fun newTmpFile(prefix: String, suffix: String? = null, directory: File? = null, deleteOnExit: Boolean = true) =
File.createTempFile(prefix, suffix, directory).apply {
if (deleteOnExit) deleteOnExit()
}
internal fun newTmpFile(prefix: String, suffix: String? = null, directory: File? = null, deleteOnExit: Boolean = true): File =
(if (directory == null) Files.createTempFile(prefix, suffix) else Files.createTempFile(directory.toPath(), prefix, suffix))
.toFile()
.apply { if (deleteOnExit) deleteOnExit() }
internal fun File.isParentOf(childCandidate: File, strict: Boolean = false): Boolean {
val parentPath = Paths.get(this.absolutePath).normalize()

View File

@@ -19,6 +19,7 @@ import org.apache.ivy.plugins.resolver.IBiblioResolver
import org.apache.ivy.util.DefaultMessageLogger
import org.apache.ivy.util.Message
import java.io.File
import java.nio.file.Files
import kotlin.script.experimental.api.*
import kotlin.script.experimental.dependencies.ExternalDependenciesResolver
import kotlin.script.experimental.dependencies.RepositoryCoordinates
@@ -134,7 +135,7 @@ class IvyResolver : ExternalDependenciesResolver {
// val report = ivy.resolve(moduleDescriptor, resolveOptions)
//creates an ivy configuration file
val ivyFile = createTempFile("ivy", ".xml").apply { deleteOnExit() }
val ivyFile = Files.createTempFile("ivy", ".xml").toFile().apply { deleteOnExit() }
XmlModuleDescriptorWriter.write(moduleDescriptor, ivyFile)
val report = ivy.resolve(ivyFile.toURI().toURL(), resolveOptions)

View File

@@ -53,9 +53,10 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.ConfigurationKt;
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar;
import org.jetbrains.kotlin.utils.ParametersMapKt;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -138,17 +139,17 @@ public class ExecuteKotlinScriptMojo extends AbstractMojo {
buildDirectory.mkdirs();
}
File scriptFile = File.createTempFile("kotlin-maven-plugin-inline-script-", ".tmp.kts", buildDirectory);
FileOutputStream stream = new FileOutputStream(scriptFile);
stream.write(script.getBytes("UTF-8"));
stream.close();
Path scriptFile = Files.createTempFile(buildDirectory.toPath(), "kotlin-maven-plugin-inline-script-", ".tmp.kts");
try (BufferedWriter writer = Files.newBufferedWriter(scriptFile, StandardCharsets.UTF_8)) {
writer.write(script);
}
try {
executeScriptFile(scriptFile);
executeScriptFile(scriptFile.toFile());
} finally {
boolean deleted = scriptFile.delete();
boolean deleted = Files.deleteIfExists(scriptFile);
if (!deleted) {
getLog().warn("Error deleting " + scriptFile.getAbsolutePath());
getLog().warn("Error deleting " + scriptFile.toAbsolutePath());
}
}
} catch (IOException e) {