From 5c5cc8b84cec0c28fe01349eb64c64c4a6780680 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Thu, 1 Nov 2018 14:38:15 +0300 Subject: [PATCH] Gradle: do not create equal gradle init scripts if corresponding files do exist (IDEA-200434) --- .../intellij/openapi/util/io/FileUtil.java | 25 ++++++++++++- .../GradleApplicationEnvironmentProvider.java | 1 + .../build/GradleProjectTaskRunner.java | 1 + .../execution/GradleExecutionHelper.java | 36 +++++++++++++------ .../service/task/GradleTaskManager.java | 34 +++++++++++------- 5 files changed, 74 insertions(+), 23 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index 8dee395345a3..761af9209511 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -18,6 +18,7 @@ package com.intellij.openapi.util.io; import com.intellij.CommonBundle; import com.intellij.Patches; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; @@ -596,10 +597,32 @@ public class FileUtil extends FileUtilRt { @NotNull public static File findSequentNonexistentFile(@NotNull File parentFolder, @NotNull String filePrefix, @NotNull String extension) { + return findSequentFile(parentFolder, filePrefix, extension, new Condition() { + @Override + public boolean value(File file) { + return !file.exists(); + } + }); + } + + /** + * Checks sequentially files with names filePrefix.extension, filePrefix1.extension, e.t.c + * and returns the first file which conforms to the provided condition. + * + * @param parentFolder the parent folder of the file to be returned + * @param filePrefix the prefix of the file to be returned + * @param extension the extension of the file to be returned + * @param condition the check of the file to be returned + */ + @NotNull + public static File findSequentFile(@NotNull File parentFolder, + @NotNull String filePrefix, + @NotNull String extension, + @NotNull Condition condition) { int postfix = 0; String ext = extension.isEmpty() ? "" : '.' + extension; File candidate = new File(parentFolder, filePrefix + ext); - while (candidate.exists()) { + while (!condition.value(candidate)) { postfix++; candidate = new File(parentFolder, filePrefix + postfix + ext); } diff --git a/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java b/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java index 9fd07c8d381b..a9478e645f5e 100644 --- a/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java +++ b/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java @@ -162,6 +162,7 @@ public class GradleApplicationEnvironmentProvider implements GradleExecutionEnvi // @formatter:on gradleRunConfiguration.putUserData(GradleTaskManager.INIT_SCRIPT_KEY, initScript); + gradleRunConfiguration.putUserData(GradleTaskManager.INIT_SCRIPT_PREFIX_KEY, runAppTaskName); // reuse all before tasks except 'Make' as it doesn't make sense for delegated run gradleRunConfiguration.setBeforeRunTasks(RunManagerImpl.getInstanceImpl(project).getBeforeRunTasks(applicationConfiguration).stream() diff --git a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java index 2cf90c38b78b..67449fae2f81 100644 --- a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java +++ b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java @@ -168,6 +168,7 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { Collection scripts = initScripts.getModifiable(rootProjectPath); scripts.add(compilerOptionsInitScript); userData.putUserData(GradleTaskManager.INIT_SCRIPT_KEY, join(scripts, SystemProperties.getLineSeparator())); + userData.putUserData(GradleTaskManager.INIT_SCRIPT_PREFIX_KEY, executionName); ExternalSystemUtil.runTask(settings, DefaultRunExecutor.EXECUTOR_ID, project, GradleConstants.SYSTEM_ID, taskCallback, ProgressExecutionMode.IN_BACKGROUND_ASYNC, false, userData); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java index 0b58b60e5c8b..6065f1faff21 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java @@ -13,6 +13,7 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunCo import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import org.gradle.initialization.BuildLayoutParameters; @@ -22,6 +23,7 @@ import org.gradle.tooling.*; import org.gradle.tooling.internal.consumer.DefaultGradleConnector; import org.gradle.tooling.model.build.BuildEnvironment; import org.gradle.util.GradleVersion; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.service.project.DistributionFactoryExt; @@ -276,7 +278,7 @@ public class GradleExecutionHelper { "}", "", }; - final File tempFile = writeToFileGradleInitScript(StringUtil.join(lines, SystemProperties.getLineSeparator())); + final File tempFile = writeToFileGradleInitScript(StringUtil.join(lines, SystemProperties.getLineSeparator()), "wrapper_init"); settings.withArguments(GradleConstants.INIT_SCRIPT_CMD_OPTION, tempFile.getAbsolutePath()); BuildLauncher launcher = getBuildLauncher(id, connection, settings, listener); launcher.withCancellationToken(cancellationToken); @@ -406,7 +408,7 @@ public class GradleExecutionHelper { script += buildSrcDefaultInitScript; } - return writeToFileGradleInitScript(script); + return writeToFileGradleInitScript(script, "ijinit"); } catch (Exception e) { LOG.warn("Can't generate IJ gradle init script", e); @@ -417,19 +419,33 @@ public class GradleExecutionHelper { } } + /** + * @deprecated use {@link GradleExecutionHelper#writeToFileGradleInitScript(String, String)} instead + */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2019.1") public static File writeToFileGradleInitScript(@NotNull String content) throws IOException { return writeToFileGradleInitScript(content, "ijinit"); } public static File writeToFileGradleInitScript(@NotNull String content, @NotNull String filePrefix) throws IOException { - File tempFile = new File(FileUtil.getTempDirectory(), filePrefix + '.' + GradleConstants.EXTENSION); - if (tempFile.exists() && StringUtil.equals(content, FileUtil.loadFile(tempFile))) { - return tempFile; - } - tempFile = FileUtil.findSequentNonexistentFile(tempFile.getParentFile(), filePrefix, GradleConstants.EXTENSION); - FileUtil.writeToFile(tempFile, content); - tempFile.deleteOnExit(); - return tempFile; + byte[] contentBytes = content.getBytes(CharsetToolkit.UTF8_CHARSET); + int contentLength = contentBytes.length; + return FileUtil.findSequentFile(new File(FileUtil.getTempDirectory()), filePrefix, GradleConstants.EXTENSION, file -> { + try { + if (!file.exists()) { + FileUtil.writeToFile(file, contentBytes, false); + file.deleteOnExit(); + return true; + } + if (contentLength != file.length()) return false; + return content.equals(FileUtil.loadFile(file, CharsetToolkit.UTF8_CHARSET)); + } + catch (IOException ignore) { + // Skip file with access issues. Will attempt to check the next file + } + return false; + }); } @Nullable diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java index ba8e9d712f86..254c4dae4df5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java @@ -25,6 +25,7 @@ import com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerConfigurat import com.intellij.openapi.externalSystem.task.ExternalSystemTaskManager; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; @@ -62,7 +63,7 @@ public class GradleTaskManager implements ExternalSystemTaskManager INIT_SCRIPT_KEY = Key.create("INIT_SCRIPT_KEY"); - + public static final Key INIT_SCRIPT_PREFIX_KEY = Key.create("INIT_SCRIPT_PREFIX_KEY"); private final GradleExecutionHelper myHelper = new GradleExecutionHelper(); private final Map myCancellationMap = ContainerUtil.newConcurrentMap(); @@ -165,19 +166,28 @@ public class GradleTaskManager implements ExternalSystemTaskManager