From 9ed5dd7a01e8bf20d43faa3db19dcb50ecc5ec80 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 5 Nov 2018 12:00:54 +0000 Subject: [PATCH] Generate idea run configs for dir based projects --- .../net/fabricmc/loom/AbstractPlugin.java | 13 ++-- .../providers/MinecraftLibraryProvider.java | 8 -- .../loom/task/GenIdeaProjectTask.java | 26 +------ .../net/fabricmc/loom/task/RunClientTask.java | 2 - .../net/fabricmc/loom/util/IdeaRunConfig.java | 53 +++++++++++++ .../loom/util/SetupIntelijRunConfigs.java | 75 +++++++++++++++++++ src/main/resources/dummy_runconfig.xml | 12 +++ 7 files changed, 149 insertions(+), 40 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java create mode 100644 src/main/resources/dummy_runconfig.xml diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 6f0566a..a5a0237 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -25,12 +25,12 @@ package net.fabricmc.loom; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import net.fabricmc.loom.providers.MinecraftProvider; import net.fabricmc.loom.providers.ModRemapperProvider; -import net.fabricmc.loom.util.*; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.LoomDependencyManager; +import net.fabricmc.loom.util.ModRemapper; +import net.fabricmc.loom.util.SetupIntelijRunConfigs; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; @@ -41,13 +41,10 @@ import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; -import org.gradle.plugins.ide.api.GeneratorTask; import org.gradle.plugins.ide.eclipse.model.EclipseModel; import org.gradle.plugins.ide.idea.model.IdeaModel; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; import java.io.IOException; import java.util.Map; import java.util.Set; @@ -220,6 +217,8 @@ public class AbstractPlugin implements Plugin { dependencyManager.handleDependencies(project1); project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace")); + + SetupIntelijRunConfigs.setup(project1); }); project.getTasks().getByName("jar").doLast(task -> { diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java index 23d0e22..a616a68 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java @@ -75,13 +75,6 @@ public class MinecraftLibraryProvider { } } - //adds the natvies to compile //TODO extract natives - versionInfo.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> minecraftProvider.addDep(lib.getArtifactName(), project)); - - // for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { - // ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES.get(extension)); - // } - MinecraftVersionInfo.AssetIndex assetIndex = versionInfo.assetIndex; // get existing cache files @@ -155,7 +148,6 @@ public class MinecraftLibraryProvider { private void initFiles(Project project, MinecraftProvider minecraftProvider) { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); MINECRAFT_LIBS = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-libs"); - MINECRAFT_NATIVES = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-natives"); } } diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index bccc6e3..9898720 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -26,10 +26,8 @@ package net.fabricmc.loom.task; import com.google.gson.Gson; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MinecraftProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.IdeaRunConfig; -import net.fabricmc.loom.util.MinecraftVersionInfo; import org.gradle.api.DefaultTask; import org.gradle.api.Project; import org.gradle.api.tasks.TaskAction; @@ -49,7 +47,6 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; -import java.io.FileReader; import java.io.IOException; public class GenIdeaProjectTask extends DefaultTask { @@ -105,8 +102,7 @@ public class GenIdeaProjectTask extends DefaultTask { Gson gson = new Gson(); - MinecraftProvider minecraftProvider = extension.getDependencyManager().getProvider(MinecraftProvider.class); - MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo; + TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); @@ -136,25 +132,9 @@ public class GenIdeaProjectTask extends DefaultTask { return; } - IdeaRunConfig ideaClient = new IdeaRunConfig(); - ideaClient.mainClass = "net.minecraft.launchwrapper.Launch"; - ideaClient.projectName = project.getName(); - ideaClient.configName = "Minecraft Client"; - ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; - ideaClient.vmArgs = "-Djava.library.path=" + extension.getMinecraftProvider().libraryProvider.MINECRAFT_NATIVES.getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + minecraftVersionInfo.assetIndex.id + " --assetsDir \"" + new File(extension.getUserCache(), "assets-" + minecraftProvider.minecraftVersion).getAbsolutePath() + "\" --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; + runManager.appendChild(IdeaRunConfig.clientRunConfig(project).genRuns(runManager)); - runManager.appendChild(ideaClient.genRuns(runManager)); - - IdeaRunConfig ideaServer = new IdeaRunConfig(); - ideaServer.mainClass = "net.minecraft.launchwrapper.Launch"; - ideaServer.projectName = project.getName(); - ideaServer.configName = "Minecraft Server"; - ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; - ideaServer.vmArgs = "-Dfabric.development=true"; - ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; - - runManager.appendChild(ideaServer.genRuns(runManager)); + runManager.appendChild(IdeaRunConfig.serverRunConfig(project).genRuns(runManager)); transformerFactory = TransformerFactory.newInstance(); transformer = transformerFactory.newTransformer(); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 43b06b5..ca37f08 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -77,8 +77,6 @@ public class RunClientTask extends JavaExec { public List getJvmArgs() { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); List args = new ArrayList<>(); - args.add("-Djava.library.path=" + extension.getMinecraftProvider().libraryProvider.MINECRAFT_NATIVES.getAbsolutePath()); - //args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread return args; } diff --git a/src/main/java/net/fabricmc/loom/util/IdeaRunConfig.java b/src/main/java/net/fabricmc/loom/util/IdeaRunConfig.java index bd8b60c..5e7ec89 100644 --- a/src/main/java/net/fabricmc/loom/util/IdeaRunConfig.java +++ b/src/main/java/net/fabricmc/loom/util/IdeaRunConfig.java @@ -26,13 +26,20 @@ package net.fabricmc.loom.util; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.providers.MinecraftProvider; +import org.apache.commons.io.IOUtils; +import org.gradle.api.Project; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Map; public class IdeaRunConfig { @@ -74,4 +81,50 @@ public class IdeaRunConfig { parent.appendChild(e); return e; } + + public static IdeaRunConfig clientRunConfig(Project project){ + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + MinecraftProvider minecraftProvider = extension.getDependencyManager().getProvider(MinecraftProvider.class); + MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo; + + IdeaRunConfig ideaClient = new IdeaRunConfig(); + ideaClient.mainClass = "net.minecraft.launchwrapper.Launch"; + ideaClient.projectName = project.getName(); + ideaClient.configName = "Minecraft Client"; + ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; + ideaClient.vmArgs = "-Dfabric.development=true"; + ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + minecraftVersionInfo.assetIndex.id + " --assetsDir \"" + new File(extension.getUserCache(), "assets-" + minecraftProvider.minecraftVersion).getAbsolutePath() + "\" --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; + + return ideaClient; + } + + public static IdeaRunConfig serverRunConfig(Project project){ + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + MinecraftProvider minecraftProvider = extension.getDependencyManager().getProvider(MinecraftProvider.class); + MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo; + + IdeaRunConfig ideaServer = new IdeaRunConfig(); + ideaServer.mainClass = "net.minecraft.launchwrapper.Launch"; + ideaServer.projectName = project.getName(); + ideaServer.configName = "Minecraft Server"; + ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; + ideaServer.vmArgs = "-Dfabric.development=true"; + ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; + + return ideaServer; + } + + public String fromDummy() throws IOException { + InputStream input = SetupIntelijRunConfigs.class.getClassLoader().getResourceAsStream("dummy_runconfig.xml"); + String dummyConfig = IOUtils.toString(input, StandardCharsets.UTF_8); + input.close(); + + dummyConfig = dummyConfig.replace("%NAME%", configName); + dummyConfig = dummyConfig.replace("%MAIN_CLASS%", mainClass); + dummyConfig = dummyConfig.replace("%MODULE%", projectName); + dummyConfig = dummyConfig.replace("%PROGRAM_ARGS%", programArgs.replaceAll("\"", """)); + dummyConfig = dummyConfig.replace("%VM_ARGS%", vmArgs.replaceAll("\"", """)); + + return dummyConfig; + } } \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java b/src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java new file mode 100644 index 0000000..72c899d --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java @@ -0,0 +1,75 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.util; + +import net.fabricmc.loom.LoomGradleExtension; +import org.apache.commons.io.FileUtils; +import org.gradle.api.Project; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +public class SetupIntelijRunConfigs { + + public static void setup(Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + + File projectDir = new File(".idea"); + if(!projectDir.exists()){ + return; + } + try { + generate(project); + } catch (IOException e) { + throw new RuntimeException("Failed to generate run configs", e); + } + + File runDir = new File(Constants.WORKING_DIRECTORY, extension.runDir); + if (!runDir.exists()) { + runDir.mkdirs(); + } + } + + private static void generate(Project project) throws IOException { + File projectDir = new File(".idea"); + File runConfigsDir = new File(projectDir, "runConfigurations"); + File clientRunConfigs = new File(runConfigsDir, "Minecraft_Client.xml"); + File serverRunConfigs = new File(runConfigsDir, "Minecraft_Server.xml"); + + if(!runConfigsDir.exists()){ + runConfigsDir.mkdirs(); + } + + String clientRunConfig = IdeaRunConfig.clientRunConfig(project).fromDummy(); + String serverRunConfig = IdeaRunConfig.serverRunConfig(project).fromDummy(); + + FileUtils.writeStringToFile(clientRunConfigs, clientRunConfig, StandardCharsets.UTF_8); + FileUtils.writeStringToFile(serverRunConfigs, serverRunConfig, StandardCharsets.UTF_8); + + + } + +} diff --git a/src/main/resources/dummy_runconfig.xml b/src/main/resources/dummy_runconfig.xml new file mode 100644 index 0000000..6f2e975 --- /dev/null +++ b/src/main/resources/dummy_runconfig.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file