IDEA-379009 Gradle/Spring/Micronaut: Use project root directory to run Gradle tasks.

Removed the old workaround: define the settings file to be used explicitly.
Adjusted attach source task to still use location-based execution (avoid unnecessary refactoring)
Updated task name locator in test, as tasks now have full names (relative to the root Gradle project)


(cherry picked from commit 7ac4254d9e3a8ac04114c7529bc3a2416892c49c)

IJ-MR-182170

GitOrigin-RevId: a1b827f3013d328866b00457fd5394462b16f346
This commit is contained in:
Nikita.Skvortsov
2025-11-11 19:04:12 +01:00
committed by intellij-monorepo-bot
parent f92798bb47
commit 1a065fbaae
6 changed files with 6 additions and 49 deletions

View File

@@ -5,11 +5,8 @@ import com.intellij.codeInsight.TestFrameworks;
import com.intellij.execution.Location;
import com.intellij.execution.junit2.PsiMemberParameterizedLocation;
import com.intellij.execution.junit2.info.MethodLocation;
import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
@@ -90,34 +87,4 @@ public final class GradleRunnerUtil {
if (virtualFile == null) return false;
return GradleConstants.EXTENSION.equals(virtualFile.getExtension());
}
/**
* For a given IDEA module, adds settings.gradle(.kts) file from the root Gradle project as explicit commandline flag.
* <p>
* Workaround for IDEA-316566 and IDEA-317008
* @param module module of a Gradle-based project
* @param taskSettings execution settings of a task inside this module.
*/
public static void addExplicitSettingsFileParameter(@NotNull Module module, @NotNull ExternalSystemTaskExecutionSettings taskSettings) {
if (!isGradleModule(module)) {
return;
}
String path = ExternalSystemApiUtil.getExternalRootProjectPath(module);
String settingsPath = null;
String groovySettingsPath = path + "/" + GradleConstants.SETTINGS_FILE_NAME;
if (FileUtil.exists(groovySettingsPath)) {
settingsPath = groovySettingsPath;
}
String ktsSettingsPath = path + "/" + GradleConstants.KOTLIN_DSL_SETTINGS_FILE_NAME;
if (FileUtil.exists(ktsSettingsPath)) {
settingsPath = ktsSettingsPath;
}
if (settingsPath != null) {
taskSettings.setScriptParameters(
StringUtil.notNullize(taskSettings.getScriptParameters()) + " --settings-file \"" + settingsPath + "\"");
}
}
}

View File

@@ -5,13 +5,11 @@ import com.intellij.execution.Executor
import com.intellij.execution.application.ApplicationConfiguration
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.openapi.application.ReadAction
import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ThrowableComputable
import com.intellij.task.ExecuteRunConfigurationTask
import org.jetbrains.annotations.ApiStatus.Experimental
import org.jetbrains.plugins.gradle.execution.GradleRunnerUtil
/**
@@ -46,11 +44,6 @@ abstract class CustomGradleApplicationEnvironmentProvider<T : ApplicationConfigu
abstract fun getRunConfiguration(task: ExecuteRunConfigurationTask): T?
override fun customiseTaskExecutionsSettings(taskSettings: ExternalSystemTaskExecutionSettings, module: Module) {
GradleRunnerUtil.addExplicitSettingsFileParameter(module, taskSettings)
super.customiseTaskExecutionsSettings(taskSettings, module)
}
override fun generateInitScript(params: GradleInitScriptParameters): String? {
val generator = findGenerator(params.module) ?: return super.generateInitScript(params)
return generator.generateInitScript(params)

View File

@@ -68,7 +68,7 @@ object GradleLibrarySourcesDownloader {
}
val module = findAssociatedGradleModule(orderEntries) ?: return null
val gradleModuleData = CachedModuleDataFinder.getGradleModuleData(module) ?: return null
val externalProjectPath = gradleModuleData.directoryToRunTask
val externalProjectPath = gradleModuleData.moduleData.linkedExternalProjectPath ?: return null
val libraryOrderEntry = orderEntries.first()
val sourceArtifactNotation = libraryOrderEntry.getArtifactCoordinates()?.let { "$it:sources" } ?: return null
val cachedSourcesPath = lookupSourcesPathFromCache(libraryOrderEntry, sourceArtifactNotation, project, externalProjectPath)

View File

@@ -108,15 +108,13 @@ tasks.register("hello-module") {
val taskData: TaskData = ExternalSystemApiUtil
.findProjectTasks(myProject, GradleConstants.SYSTEM_ID, "$projectPath/m1/m2/m3")
.find { it.name == "hello-module" } ?: throw AssertionFailedError("Task 'hello-module' not found")
.find { it.name.contains("hello-module") } ?: throw AssertionFailedError("Task 'hello-module' not found")
val output = runTask(taskData)
assertThat(output).contains("expected!");
}
// Checks the workaround for IDEA-316566 IDEA-317008
@Test
@TargetVersions("<9.0") // --settings-file was removed in Gradle 9.0
fun `run task from misconfigured subproject with explicit script parameter`() {
val properSettingsFilePaths = createProjectSubFile("settings.gradle", """
rootProject.name = "rootProject"
@@ -154,10 +152,9 @@ tasks.register("hello-module") {
val taskData: TaskData = ExternalSystemApiUtil
.findProjectTasks(myProject, GradleConstants.SYSTEM_ID, "$projectPath/projectA")
.find { it.name == "hello" } ?: throw AssertionFailedError("Task 'hello' not found")
.find { it.name.contains("hello") } ?: throw AssertionFailedError("Task 'hello' not found")
// this script parameter allows to skip malicious settings.gradle files.
val output = runTask(taskData, "--settings-file \"$properSettingsFilePaths\"")
val output = runTask(taskData)
assertThat(output).contains("expected!")
}

View File

@@ -135,7 +135,7 @@ public final class GradleProjectResolverUtil {
String directoryToRunTask;
if (compositeBuildGradlePath.isEmpty()) {
directoryToRunTask = isUnderProjectRoot ? mainModuleConfigPath : rootProjectPath;
directoryToRunTask = rootProjectPath;
}
else {
directoryToRunTask = mainBuildRootPath;

View File

@@ -28,7 +28,7 @@ class GradleTasksImportingTest : BuildViewMessagesImportingTestCase() {
.contains("help", "init", "wrapper", "projects", "tasks", "properties")
assertThat(findTasks(path("subproject")).map { it.name })
.contains("help", "projects", "tasks", "properties")
.contains(":subproject:help", ":subproject:projects", ":subproject:tasks", ":subproject:properties")
}
@Test