mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Gradle: do not create equal gradle init scripts if corresponding files do exist (IDEA-200434)
This commit is contained in:
@@ -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);
|
||||
|
||||
+26
-10
@@ -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
|
||||
|
||||
+22
-12
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user