From e331754fb540916a044b54938822bc5c25fe74a0 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 22 Jun 2022 20:36:56 +0100 Subject: [PATCH] Support composite builds when generating runs - Run generators will now write to the root of the composite build, rather than the root of the current project. - When in a composite build, attempt to find the full path to the current project. --- .../gradle/common/util/RunConfig.java | 3 +- .../gradle/common/util/Utils.java | 49 +++++++++++++++++++ .../util/runs/IntellijRunGenerator.java | 6 ++- .../common/util/runs/RunConfigGenerator.java | 11 +++-- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/common/java/net/minecraftforge/gradle/common/util/RunConfig.java b/src/common/java/net/minecraftforge/gradle/common/util/RunConfig.java index 1f71ef4e1..c73262fc4 100644 --- a/src/common/java/net/minecraftforge/gradle/common/util/RunConfig.java +++ b/src/common/java/net/minecraftforge/gradle/common/util/RunConfig.java @@ -104,7 +104,8 @@ public final String getTaskName() { } public final String getUniqueFileName() { - return project.getPath().length() > 1 ? String.join("_", String.join("_", project.getPath().substring(1).split(":")), getTaskName()) : getTaskName(); + String prefix = Utils.getCompositePath(project); + return prefix.length() > 1 ? prefix.substring(1).replace(':', '_') + "_" + getTaskName() : getTaskName(); } public final String getUniqueName() { diff --git a/src/common/java/net/minecraftforge/gradle/common/util/Utils.java b/src/common/java/net/minecraftforge/gradle/common/util/Utils.java index 51e013328..0e1526584 100644 --- a/src/common/java/net/minecraftforge/gradle/common/util/Utils.java +++ b/src/common/java/net/minecraftforge/gradle/common/util/Utils.java @@ -31,6 +31,7 @@ import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.artifacts.repositories.ArtifactRepository; +import org.gradle.api.invocation.Gradle; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.TaskProvider; @@ -491,4 +492,52 @@ public static String replaceTokens(Map tokens, String value) { return buf.toString(); } + + /** + * Get the root project of this composite build. + * + * @param project The current project. + * @return The very root project. + * @see Project#getRootProject() + */ + public static Project getCompositeRoot(Project project) { + Gradle gradle = project.getGradle(); + while (gradle.getParent() != null) gradle = gradle.getParent(); + return gradle.getRootProject(); + } + + /** + * Get the path to the current project relative to the composite root. + * + * @param project The current project. + * @return The root + * @see Project#getPath() + */ + public static String getCompositePath(Project project) { + Gradle gradle = project.getGradle(); + if (gradle.getParent() == null) return project.getPath(); + + // Build up a list of paths. We start off with the current sub-project (we do nothing if we're the root + // project). + List paths = new ArrayList<>(); + if (project.getPath().length() > 1) paths.add(project.getPath().substring(1)); + + while (gradle.getParent() != null) { + // Then for each composite build parent, find the matching IncludedBuild in the parent and add its name to + // the path. + Project thisProject = gradle.getRootProject(); + String projectName = gradle + .getParent().getIncludedBuilds().stream() + .filter(child -> child.getProjectDir().equals(thisProject.getRootDir())) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Cannot find valid matching parent")) + .getName(); + paths.add(projectName); + + gradle = gradle.getParent(); + } + + Collections.reverse(paths); + return ":" + String.join(":", paths); + } } diff --git a/src/common/java/net/minecraftforge/gradle/common/util/runs/IntellijRunGenerator.java b/src/common/java/net/minecraftforge/gradle/common/util/runs/IntellijRunGenerator.java index 4a34357ea..4d7285453 100644 --- a/src/common/java/net/minecraftforge/gradle/common/util/runs/IntellijRunGenerator.java +++ b/src/common/java/net/minecraftforge/gradle/common/util/runs/IntellijRunGenerator.java @@ -22,7 +22,6 @@ import net.minecraftforge.gradle.common.util.RunConfig; import net.minecraftforge.gradle.common.util.Utils; - import org.gradle.api.Project; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; @@ -196,9 +195,12 @@ protected Map createRunConfiguration(@Nonnull final Project pr final Element gradleTask = javaDocument.createElement("option"); { + String prefix = Utils.getCompositePath(project); + if (prefix.length() == 1) prefix = ""; + gradleTask.setAttribute("name", "Gradle.BeforeRunTask"); gradleTask.setAttribute("enabled", "true"); - gradleTask.setAttribute("tasks", project.getTasks().getByName("prepare" + Utils.capitalize(runConfig.getTaskName())).getPath()); + gradleTask.setAttribute("tasks", prefix + ":prepare" + Utils.capitalize(runConfig.getTaskName())); gradleTask.setAttribute("externalProjectPath", "$PROJECT_DIR$"); } methods.appendChild(gradleTask); diff --git a/src/common/java/net/minecraftforge/gradle/common/util/runs/RunConfigGenerator.java b/src/common/java/net/minecraftforge/gradle/common/util/runs/RunConfigGenerator.java index 80379987b..f0b667037 100644 --- a/src/common/java/net/minecraftforge/gradle/common/util/runs/RunConfigGenerator.java +++ b/src/common/java/net/minecraftforge/gradle/common/util/runs/RunConfigGenerator.java @@ -88,16 +88,17 @@ public abstract class RunConfigGenerator public static void createIDEGenRunsTasks(@Nonnull final MinecraftExtension minecraft, @Nonnull final TaskProvider prepareRuns, @Nonnull final TaskProvider makeSourceDirs, List additionalClientArgs) { final Project project = minecraft.getProject(); + Project rootProject = Utils.getCompositeRoot(project); final Map, File, Supplier>> ideConfigurationGenerators = ImmutableMap., File, Supplier>>builder() .put("genIntellijRuns", ImmutableTriple.of(Collections.singletonList(prepareRuns), - new File(project.getRootProject().getRootDir(), ".idea/runConfigurations"), - () -> new IntellijRunGenerator(project.getRootProject()))) + new File(rootProject.getRootDir(), ".idea/runConfigurations"), + () -> new IntellijRunGenerator(rootProject))) .put("genEclipseRuns", ImmutableTriple.of(ImmutableList.of(prepareRuns, makeSourceDirs), - project.getProjectDir(), + rootProject.getProjectDir(), EclipseRunGenerator::new)) .put("genVSCodeRuns", ImmutableTriple.of(ImmutableList.of(prepareRuns, makeSourceDirs), - new File(project.getProjectDir(), ".vscode"), + new File(rootProject.getProjectDir(), ".vscode"), VSCodeRunGenerator::new)) .build(); @@ -140,7 +141,7 @@ protected static String replaceRootDirBy(@Nonnull final Project project, String if (value == null || value.isEmpty()) { return value; } - return value.replace(project.getRootDir().toString(), replacement); + return value.replace(Utils.getCompositeRoot(project).getRootDir().toString(), replacement); } protected static Stream mapModClassesToGradle(Project project, RunConfig runConfig)