Gradle: do not create equal gradle init scripts if corresponding files do exist (IDEA-200434)

This commit is contained in:
Vladislav.Soroka
2018-11-01 14:38:27 +03:00
parent a8e133f10b
commit 5c5cc8b84c
5 changed files with 74 additions and 23 deletions
@@ -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<File>() {
@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<? super File> 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);
}
@@ -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()
@@ -168,6 +168,7 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner {
Collection<String> 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);
@@ -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
@@ -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<GradleExecut
private static final Logger LOG = Logger.getInstance(GradleTaskManager.class);
public static final Key<String> INIT_SCRIPT_KEY = Key.create("INIT_SCRIPT_KEY");
public static final Key<String> INIT_SCRIPT_PREFIX_KEY = Key.create("INIT_SCRIPT_PREFIX_KEY");
private final GradleExecutionHelper myHelper = new GradleExecutionHelper();
private final Map<ExternalSystemTaskId, CancellationTokenSource> myCancellationMap = ContainerUtil.newConcurrentMap();
@@ -165,19 +166,28 @@ public class GradleTaskManager implements ExternalSystemTaskManager<GradleExecut
});
}
final String initScript = effectiveSettings.getUserData(INIT_SCRIPT_KEY);
if (StringUtil.isNotEmpty(initScript)) {
ContainerUtil.addAll(
initScripts,
"//-- Additional script",
initScript,
"//");
}
if (!initScripts.isEmpty()) {
try {
File tempFile =
GradleExecutionHelper.writeToFileGradleInitScript(StringUtil.join(initScripts, SystemProperties.getLineSeparator()));
File tempFile = GradleExecutionHelper.writeToFileGradleInitScript(
StringUtil.join(initScripts, SystemProperties.getLineSeparator()), "ijresolvers");
effectiveSettings.withArguments(GradleConstants.INIT_SCRIPT_CMD_OPTION, tempFile.getAbsolutePath());
}
catch (IOException e) {
throw new ExternalSystemException(e);
}
}
final String initScript = effectiveSettings.getUserData(INIT_SCRIPT_KEY);
if (StringUtil.isNotEmpty(initScript)) {
try {
String initScriptPrefix = effectiveSettings.getUserData(INIT_SCRIPT_PREFIX_KEY);
if (StringUtil.isEmpty(initScriptPrefix)) {
initScriptPrefix = "ijmiscinit";
}
else {
initScriptPrefix = FileUtil.sanitizeFileName(initScriptPrefix);
}
File tempFile = GradleExecutionHelper.writeToFileGradleInitScript(initScript, initScriptPrefix);
effectiveSettings.withArguments(GradleConstants.INIT_SCRIPT_CMD_OPTION, tempFile.getAbsolutePath());
}
catch (IOException e) {