diff --git a/build.gradle b/build.gradle index cae8bb5..1ca0e16 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ targetCompatibility = 1.8 group = 'net.fabricmc' archivesBaseName = project.name -version = '0.0.12-SNAPSHOT' +version = '0.0.13-SNAPSHOT' def build = "local" def ENV = System.getenv() @@ -47,7 +47,7 @@ dependencies { jar { manifest { - attributes 'Implementation-Version': version + " Build(" + build + ")" + attributes 'Implementation-MinecraftVersionInfo': version + " Build(" + build + ")" } } diff --git a/gradlew.bat b/gradlew.bat index f955316..5abf139 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -20,7 +20,7 @@ set DEFAULT_JVM_OPTS= if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 +%JAVA_EXE% -minecraftVersionInfo >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 848e420..8bc3f93 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -28,10 +28,9 @@ 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.task.DownloadTask; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.ModRemapper; -import net.fabricmc.loom.util.Version; +import net.fabricmc.loom.providers.MinecraftProvider; +import net.fabricmc.loom.providers.ModRemapperProvider; +import net.fabricmc.loom.util.*; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; @@ -70,22 +69,13 @@ public class AbstractPlugin implements Plugin { project.getExtensions().create("minecraft", LoomGradleExtension.class, project); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - readModJson(extension); - // Force add Mojang repository addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); - // Minecraft libraries configuration - project.getConfigurations().maybeCreate(Constants.CONFIG_MINECRAFT); - project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES); - project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES_CLIENT); - project.getConfigurations().maybeCreate(Constants.CONFIG_NATIVES); + Configuration compileModsConfig = project.getConfigurations().maybeCreate(Constants.COMPILE_MODS); - compileModsConfig.setTransitive(false); //Dont get transitive deps of mods - - // Common libraries extends from client libraries, CONFIG_MC_DEPENDENCIES will contains all MC dependencies - project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES_CLIENT))); + project.getConfigurations().maybeCreate(Constants.MINECRAFT); configureIDEs(); configureCompile(); @@ -95,21 +85,17 @@ public class AbstractPlugin implements Plugin { Project project = entry.getKey(); Set taskSet = entry.getValue(); for (Task task : taskSet) { - if (task instanceof GeneratorTask) { - task.dependsOn("setup"); - } - if (task instanceof JavaCompile && !(task.getName().contains("Test")) && !(task.getName().contains("test"))) { JavaCompile javaCompileTask = (JavaCompile) task; javaCompileTask.doFirst(task1 -> { project.getLogger().lifecycle(":setting java compiler args"); try { - javaCompileTask.getClasspath().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); - javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); + //javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); - javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFileNamedIntermediary=" + Constants.MAPPINGS_TINY.get(extension).getCanonicalPath()); - javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFileNamedIntermediary=" + Constants.MAPPINGS_MIXIN_EXPORT.get(extension).getCanonicalPath()); + + javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFileNamedIntermediary=" + extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getCanonicalPath()); + javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFileNamedIntermediary=" + extension.getMinecraftProvider().pomfProvider.MAPPINGS_MIXIN_EXPORT.getCanonicalPath()); if(extension.refmapName == null || extension.refmapName.isEmpty()){ project.getLogger().error("Could not find refmap definition, will be using default name: " + project.getName() + "-refmap.json"); extension.refmapName = project.getName() + "-refmap.json"; @@ -176,11 +162,9 @@ public class AbstractPlugin implements Plugin { ideaModel.getModule().setDownloadJavadoc(true); ideaModel.getModule().setDownloadSources(true); ideaModel.getModule().setInheritOutputDirs(true); - ideaModel.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); // ECLIPSE EclipseModel eclipseModel = (EclipseModel) project.getExtensions().getByName("eclipse"); - eclipseModel.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); } /** @@ -192,11 +176,6 @@ public class AbstractPlugin implements Plugin { SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); SourceSet test = javaModule.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME); - main.setCompileClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); - test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); - main.setRuntimeClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); - test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); - Javadoc javadoc = (Javadoc) project.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME); javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath())); @@ -231,74 +210,25 @@ public class AbstractPlugin implements Plugin { project1.getRepositories().mavenCentral(); project1.getRepositories().jcenter(); - Gson gson = new Gson(); - try { - DownloadTask.downloadMcJson(extension, project1.getLogger()); - Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); - for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile(extension) != null) { - String configName = Constants.CONFIG_MC_DEPENDENCIES; - if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { - configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; - } - project1.getDependencies().add(configName, library.getArtifactName()); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - project1.getDependencies().add(Constants.CONFIG_MINECRAFT, "net.minecraft:" + Constants.MINECRAFT_FINAL_JAR.get(extension).getName().replace(".jar", "")); + LoomDependencyManager dependencyManager = new LoomDependencyManager(); + extension.setDependencyManager(dependencyManager); - if (extension.isModWorkspace()) { - //only add this when not in a dev env - project1.getDependencies().add(Constants.COMPILE_MODS, "net.fabricmc:fabric-loader:" + extension.getVersionString()); - } + dependencyManager.addProvider(new MinecraftProvider()); + dependencyManager.addProvider(new ModRemapperProvider()); + dependencyManager.handleDependencies(project1); + project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace")); }); project.getTasks().getByName("jar").doLast(task -> { project.getLogger().lifecycle(":remapping mods"); - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); try { - if(extension.hasPomf()){ - ModRemapper.remap(project); - } + ModRemapper.remap(project); } catch (IOException e) { e.printStackTrace(); } }); - project.afterEvaluate(project12 -> { - project12.getTasks().getByName("idea").dependsOn(project12.getTasks().getByName("cleanIdea")).dependsOn(project12.getTasks().getByName("setup")).dependsOn(project12.getTasks().getByName("extractNatives")); - project12.getTasks().getByName("idea").finalizedBy(project12.getTasks().getByName("genIdeaWorkspace")); - }); - - } - - protected void readModJson(LoomGradleExtension extension) { - File resDir = new File(project.getProjectDir(), "src" + File.separator + "main" + File.separator + "resources"); - File modJson = new File(resDir, "mod.json"); - if (modJson.exists()) { - Gson gson = new Gson(); - try { - JsonElement jsonElement = gson.fromJson(new FileReader(modJson), JsonElement.class); - JsonObject jsonObject = jsonElement.getAsJsonObject(); - if ((extension.version == null || extension.version.isEmpty()) && jsonObject.has("version")) { - project.setVersion(jsonObject.get("version").getAsString()); - } - if (jsonObject.has("group")) { - project.setGroup(jsonObject.get("group").getAsString()); - } - if (jsonObject.has("description")) { - project.setDescription(jsonObject.get("description").getAsString()); - } - //TODO load deps - - } catch (FileNotFoundException e) { - //This wont happen as we have checked for it - e.printStackTrace(); - } - } } } diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index a3a9eb9..2d26eed 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -24,38 +24,24 @@ package net.fabricmc.loom; -import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.providers.MinecraftProvider; +import net.fabricmc.loom.util.LoomDependencyManager; import org.gradle.api.Project; import java.io.File; public class LoomGradleExtension { - public String version; public String runDir = "run"; - public String fabricVersion; - public String pomfVersion; public String refmapName; - public String jarMapper = Constants.JAR_MAPPER_TINY; // enigma, tiny - public boolean localMappings = false; //Not to be set in the build.gradle private Project project; + private LoomDependencyManager dependencyManager; public LoomGradleExtension(Project project) { this.project = project; } - public String getVersionString() { - if (isModWorkspace()) { - return version + "-" + fabricVersion; - } - return version; - } - - public boolean isModWorkspace() { - return fabricVersion != null && !fabricVersion.isEmpty(); - } - public File getUserCache() { File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "fabric-loom"); if (!userCache.exists()) { @@ -64,10 +50,15 @@ public class LoomGradleExtension { return userCache; } - public boolean hasPomf(){ - if (localMappings) { - return true; - } - return pomfVersion != null && !pomfVersion.isEmpty(); + public LoomDependencyManager getDependencyManager() { + return dependencyManager; + } + + public MinecraftProvider getMinecraftProvider(){ + return getDependencyManager().getProvider(MinecraftProvider.class); + } + + public void setDependencyManager(LoomDependencyManager dependencyManager) { + this.dependencyManager = dependencyManager; } } diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index e5b98d6..e842bd4 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -32,16 +32,8 @@ public class LoomGradlePlugin extends AbstractPlugin { public void apply(Project target) { super.apply(target); - makeTask("download", DownloadTask.class); - makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); - makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); - makeTask("setup", SetupTask.class).dependsOn("mapJars").setGroup("fabric"); - - makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); - makeTask("vscode", GenVSCodeProjectTask.class).dependsOn("extractNatives").setGroup("ide"); - makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraft"); makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraft"); } diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftJarProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftJarProvider.java new file mode 100644 index 0000000..e0f1ea7 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftJarProvider.java @@ -0,0 +1,115 @@ +/* + * 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.providers; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.MapJarsTiny; +import net.fabricmc.stitch.merge.JarMerger; +import org.gradle.api.Project; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Collection; + +public class MinecraftJarProvider { + + public File MINECRAFT_INTERMEDIARY_JAR; + public File MINECRAFT_MERGED_JAR; + public File MINECRAFT_MAPPED_JAR; + + MinecraftProvider minecraftProvider; + + public MinecraftJarProvider(Project project, MinecraftProvider minecraftProvider) throws IOException { + this.minecraftProvider = minecraftProvider; + initFiles(project, minecraftProvider); + proccess(project, minecraftProvider); + } + + private void proccess(Project project, MinecraftProvider minecraftProvider) throws IOException { + if (!MINECRAFT_MERGED_JAR.exists()) { + mergeJars(project); + } + + if (getMappedJar().exists()) { + getMappedJar().delete(); + } + if (getIntermediaryJar().exists()) { + getIntermediaryJar().delete(); + } + new MapJarsTiny().mapJars(this, project); + + if (!MINECRAFT_MAPPED_JAR.exists()) { + throw new RuntimeException("mapped jar not found"); + } + minecraftProvider.addDep(MINECRAFT_MAPPED_JAR, project); + } + + public void mergeJars(Project project) throws IOException { + project.getLogger().lifecycle(":merging jars"); + FileInputStream client = new FileInputStream(minecraftProvider.MINECRAFT_CLIENT_JAR); + FileInputStream server = new FileInputStream(minecraftProvider.MINECRAFT_SERVER_JAR); + FileOutputStream merged = new FileOutputStream(MINECRAFT_MERGED_JAR); + + JarMerger jarMerger = new JarMerger(client, server, merged); + + jarMerger.merge(); + jarMerger.close(); + + client.close(); + server.close(); + merged.close(); + } + + private void initFiles(Project project, MinecraftProvider minecraftProvider) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + MINECRAFT_INTERMEDIARY_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-intermediary.jar"); + MINECRAFT_MERGED_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-merged.jar"); + MINECRAFT_MAPPED_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-mapped-" + minecraftProvider.pomfVersion + ".jar"); + + } + + public File getMappingFile() { + return minecraftProvider.pomfProvider.MAPPINGS_TINY; + } + + public Collection getMapperPaths() { + return minecraftProvider.libraryProvider.getLibraries(); + } + + public File getInputJar() { + return MINECRAFT_MERGED_JAR; + } + + public File getIntermediaryJar() { + return MINECRAFT_INTERMEDIARY_JAR; + } + + public File getMappedJar() { + return MINECRAFT_MAPPED_JAR; + } + +} diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java new file mode 100644 index 0000000..23d0e22 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java @@ -0,0 +1,161 @@ +/* + * 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.providers; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.gson.Gson; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Checksum; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.MinecraftVersionInfo; +import net.fabricmc.loom.util.assets.AssetIndex; +import net.fabricmc.loom.util.assets.AssetObject; +import net.fabricmc.loom.util.progress.ProgressLogger; +import org.apache.commons.io.FileUtils; +import org.gradle.api.Project; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URL; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; + +public class MinecraftLibraryProvider { + + public File MINECRAFT_LIBS; + public File MINECRAFT_NATIVES; + + private Collection libs = new HashSet<>(); + + public void provide(MinecraftProvider minecraftProvider, Project project) throws IOException { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + MinecraftVersionInfo versionInfo = minecraftProvider.versionInfo; + + initFiles(project, minecraftProvider); + + for (MinecraftVersionInfo.Library library : versionInfo.libraries) { + if (library.allowed() && library.getFile(MINECRAFT_LIBS) != null) { + // By default, they are all available on all sides + boolean isClientOnly = false; + if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { + isClientOnly = true; + } + if(!library.getFile(MINECRAFT_LIBS).exists()){ + project.getLogger().lifecycle(":downloading " + library.getURL()); + FileUtils.copyURLToFile(new URL(library.getURL()), library.getFile(MINECRAFT_LIBS)); + } + libs.add(library.getFile(MINECRAFT_LIBS)); + minecraftProvider.addDep(library.getFile(MINECRAFT_LIBS), project); + } + } + + //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 + project.getLogger().lifecycle(":checking for existing asset files"); + Multimap assetFilenameToFile = HashMultimap.create(); + for (File assetDir : Objects.requireNonNull(extension.getUserCache().listFiles((f) -> f.isDirectory() && f.getName().startsWith("assets-")))) { + File objectsDir = new File(assetDir, "objects"); + if (objectsDir.exists() && objectsDir.isDirectory()) { + for (File subDir : Objects.requireNonNull(objectsDir.listFiles(File::isDirectory))) { + for (File subFile : Objects.requireNonNull(subDir.listFiles(File::isFile))) { + assetFilenameToFile.put("objects" + File.separator + subDir.getName() + File.separator + subFile.getName(), subFile); + } + } + } + } + + File assets = new File(extension.getUserCache(), "assets-" + minecraftProvider.minecraftVersion); + if (!assets.exists()) { + assets.mkdirs(); + } + + File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.id + ".json"); + if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) { + project.getLogger().lifecycle(":downloading asset index"); + FileUtils.copyURLToFile(new URL(assetIndex.url), assetsInfo); + } + + ProgressLogger progressLogger = ProgressLogger.getProgressFactory(project, getClass().getName()); + progressLogger.start("Downloading assets...", "assets"); + FileReader fileReader = new FileReader(assetsInfo); + AssetIndex index = new Gson().fromJson(fileReader, AssetIndex.class); + fileReader.close(); + Map parent = index.getFileMap(); + final int totalSize = parent.size(); + int position = 0; + project.getLogger().lifecycle(":downloading assets..."); + for (Map.Entry entry : parent.entrySet()) { + AssetObject object = entry.getValue(); + String sha1 = object.getHash(); + String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; + File file = new File(assets, filename); + if (!file.exists() && assetFilenameToFile.containsKey(filename)) { + project.getLogger().debug(":copying asset " + entry.getKey()); + for (File srcFile : assetFilenameToFile.get(filename)) { + if (Checksum.equals(srcFile, sha1)) { + FileUtils.copyFile(srcFile, file); + break; + } + } + } + + if (!file.exists() || !Checksum.equals(file, sha1)) { + project.getLogger().debug(":downloading asset " + entry.getKey()); + FileUtils.copyURLToFile(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file); + } + String assetName = entry.getKey(); + int end = assetName.lastIndexOf("/") + 1; + if (end > 0) { + assetName = assetName.substring(end); + } + progressLogger.progress(assetName + " - " + position + "/" + totalSize + " (" + (int) ((position / (double) totalSize) * 100) + "%) assets downloaded"); + position++; + } + progressLogger.completed(); + } + + public Collection getLibraries() { + return libs; + } + + 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/providers/MinecraftProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java new file mode 100644 index 0000000..b5ff0b7 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java @@ -0,0 +1,116 @@ +/* + * 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.providers; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.*; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.gradle.api.Project; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +public class MinecraftProvider extends DependencyProvider { + + public String minecraftVersion; + public String pomfVersion; + + public PomfProvider pomfProvider; + public MinecraftVersionInfo versionInfo; + public MinecraftLibraryProvider libraryProvider; + public MinecraftJarProvider jarProvider; + + File MINECRAFT_JSON; + File MINECRAFT_CLIENT_JAR; + File MINECRAFT_SERVER_JAR; + File MINECRAFT_MERGED_JAR; + + Gson gson = new Gson(); + + @Override + public void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) throws Exception { + minecraftVersion = dependency.getDependency().getName(); + pomfVersion = dependency.getDependency().getVersion(); + + initFiles(project); + + downloadMcJson(); + versionInfo = gson.fromJson(new FileReader(MINECRAFT_JSON), MinecraftVersionInfo.class); + + downloadJars(); + + libraryProvider = new MinecraftLibraryProvider(); + libraryProvider.provide(this, project); + + //Downloads and setups up pomf + pomfProvider = new PomfProvider(pomfVersion, minecraftVersion, project); + + jarProvider = new MinecraftJarProvider(project, this); + } + + private void initFiles(Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + MINECRAFT_JSON = new File(extension.getUserCache(), minecraftVersion + "-info.jar"); + MINECRAFT_CLIENT_JAR = new File(extension.getUserCache(), minecraftVersion + "-client.jar"); + MINECRAFT_SERVER_JAR = new File(extension.getUserCache(), minecraftVersion + "-server.jar"); + MINECRAFT_MERGED_JAR = new File(extension.getUserCache(), minecraftVersion + "-merged.jar"); + + } + + private void downloadMcJson() throws IOException { + String versionManifest = IOUtils.toString(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), StandardCharsets.UTF_8); + ManifestVersion mcManifest = new GsonBuilder().create().fromJson(versionManifest, ManifestVersion.class); + + Optional optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst(); + if (optionalVersion.isPresent()) { + FileUtils.copyURLToFile(new URL(optionalVersion.get().url), MINECRAFT_JSON); + } else { + throw new RuntimeException("Failed to download minecraft json"); + } + + } + + private void downloadJars() throws IOException { + if (!MINECRAFT_CLIENT_JAR.exists() || !Checksum.equals(MINECRAFT_CLIENT_JAR, versionInfo.downloads.get("client").sha1)) { + FileUtils.copyURLToFile(new URL(versionInfo.downloads.get("client").url), MINECRAFT_CLIENT_JAR); + } + + if (!MINECRAFT_SERVER_JAR.exists() || !Checksum.equals(MINECRAFT_SERVER_JAR, versionInfo.downloads.get("server").sha1)) { + FileUtils.copyURLToFile(new URL(versionInfo.downloads.get("server").url), MINECRAFT_SERVER_JAR); + } + } + + @Override + public String getTargetConfig() { + return Constants.MINECRAFT; + } +} diff --git a/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java b/src/main/java/net/fabricmc/loom/providers/ModRemapperProvider.java similarity index 57% rename from src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java rename to src/main/java/net/fabricmc/loom/providers/ModRemapperProvider.java index 8ee785d..296818d 100644 --- a/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java +++ b/src/main/java/net/fabricmc/loom/providers/ModRemapperProvider.java @@ -22,25 +22,35 @@ * SOFTWARE. */ -package net.fabricmc.loom.task; +package net.fabricmc.loom.providers; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.TaskAction; -import org.zeroturnaround.zip.ZipUtil; +import net.fabricmc.loom.util.DependencyProvider; +import net.fabricmc.loom.util.ModProcessor; +import org.gradle.api.Project; import java.io.File; -import java.io.FileNotFoundException; -public class ExtractNativesTask extends DefaultTask { - @TaskAction - public void extractNatives() throws FileNotFoundException { - LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); - if (!Constants.MINECRAFT_NATIVES.get(extension).exists()) { - for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { - ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES.get(extension)); - } - } +public class ModRemapperProvider extends DependencyProvider { + @Override + public void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) { + File input = dependency.resolveFile(); + + project.getLogger().lifecycle("Providing " + dependency.getDepString()); + + MinecraftProvider minecraftProvider = getDependencyManager().getProvider(MinecraftProvider.class); + + String outputName = input.getName().substring(0, input.getName().length() - 4) + "-mapped-" + minecraftProvider.pomfVersion + ".jar";//TODO use the hash of the input file or something? + File output = new File(Constants.REMAPPED_MODS_STORE, outputName); + + ModProcessor.handleMod(input, output, project); + + addDep(output, project); + } + + @Override + public String getTargetConfig() { + return Constants.COMPILE_MODS; } } diff --git a/src/main/java/net/fabricmc/loom/providers/PomfProvider.java b/src/main/java/net/fabricmc/loom/providers/PomfProvider.java new file mode 100644 index 0000000..36c2d83 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/providers/PomfProvider.java @@ -0,0 +1,98 @@ +/* + * 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.providers; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import org.apache.commons.io.FileUtils; +import org.gradle.api.Project; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.util.zip.GZIPInputStream; + +//TODO fix local mappings +//TODO possibly use maven for mappings, can fix above at the same time +public class PomfProvider { + + public String minecraftVersion; + public String pomfVersion; + + public File POMF_DIR; + public File MAPPINGS_TINY_GZ; + public File MAPPINGS_TINY; + public File MAPPINGS_MIXIN_EXPORT; + + public PomfProvider(String pomfVersion, String minecraftVersion, Project project) { + this.pomfVersion = pomfVersion; + this.minecraftVersion = minecraftVersion; + initFiles(project); + try { + init(project); + } catch (Exception e) { + throw new RuntimeException("Failed to setup pomf", e); + } + } + + public void init(Project project) throws IOException { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + project.getLogger().lifecycle(":setting up pomf " + pomfVersion); + + if (!POMF_DIR.exists()) { + POMF_DIR.mkdir(); + } + + if (!MAPPINGS_TINY_GZ.exists()) { + FileUtils.copyURLToFile( + new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-tiny.gz", Constants.POMF_MAVEN_SERVER, minecraftVersion, pomfVersion)), + MAPPINGS_TINY_GZ); + } + + if (!MAPPINGS_TINY.exists()) { + GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(MAPPINGS_TINY_GZ)); + FileOutputStream fileOutputStream = new FileOutputStream(MAPPINGS_TINY); + int length; + byte[] buffer = new byte[1024]; + while ((length = gzipInputStream.read(buffer)) > 0) { + fileOutputStream.write(buffer, 0, length); + } + gzipInputStream.close(); + fileOutputStream.close(); + } + } + + public void initFiles(Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + POMF_DIR = new File(extension.getUserCache(), "pomf"); + + MAPPINGS_TINY_GZ = new File(POMF_DIR, "pomf-tiny-" + minecraftVersion + "." + pomfVersion + ".gz"); + MAPPINGS_TINY = new File(POMF_DIR, "pomf-tiny-" + minecraftVersion + "." + pomfVersion); + MAPPINGS_MIXIN_EXPORT = new File(Constants.CACHE_FILES, "mixin-map-" + minecraftVersion + "." + pomfVersion + ".tiny"); + } + +} diff --git a/src/main/java/net/fabricmc/loom/task/DownloadNewTask.java b/src/main/java/net/fabricmc/loom/task/DownloadNewTask.java deleted file mode 100644 index 570ae4f..0000000 --- a/src/main/java/net/fabricmc/loom/task/DownloadNewTask.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * 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.task; - -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.progress.ProgressLogger; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.TaskAction; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; - -/** - * Generic Download class compatible with ProgressLogger - */ -public class DownloadNewTask extends DefaultTask { - @Input - private Object output; - - @OutputFile - private String url; - private String taskName; - - @TaskAction - public void download() throws IOException { - File outputFile = getProject().file(getOutput()); - outputFile.getParentFile().mkdirs(); - outputFile.createNewFile(); - - getLogger().info("Downloading " + getURL()); - - URL url = new URL(getURL()); - HttpURLConnection connect = (HttpURLConnection) url.openConnection(); - connect.setRequestProperty("User-Agent", Constants.USER_AGENT); - connect.setInstanceFollowRedirects(true); - - ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); - progressLogger.setDescription("Downloading " + getURL()); - ReadableByteChannel inChannel = new DownloadChannel(Channels.newChannel(connect.getInputStream()), getContentLength(url), progressLogger); - FileChannel outChannel = new FileOutputStream(outputFile).getChannel(); - outChannel.transferFrom(inChannel, 0, Long.MAX_VALUE); - outChannel.close(); - inChannel.close(); - progressLogger.completed(); - getLogger().info("Download complete"); - } - - private int getContentLength(URL url) { - HttpURLConnection connection; - int contentLength = -1; - try { - connection = (HttpURLConnection) url.openConnection(); - contentLength = connection.getContentLength(); - } catch (Exception e) { - } - return contentLength; - } - - public File getOutput() { - return getProject().file(output); - } - - public void setOutput(Object output) { - this.output = output; - } - - public String getURL() { - return url; - } - - public void setURL(String url) { - this.url = url; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - } - - public String getTaskName() { - return taskName; - } - - class DownloadChannel implements ReadableByteChannel { - ProgressLogger logger; - String formattedSize; - ReadableByteChannel rbc; - long totalBytes; - - DownloadChannel(ReadableByteChannel rbc, long expectedSize, ProgressLogger logger) { - this.logger = logger; - this.formattedSize = toHumanReadableLength(expectedSize); - this.rbc = rbc; - } - - public void close() throws IOException { - rbc.close(); - } - - public boolean isOpen() { - return rbc.isOpen(); - } - - public int read(ByteBuffer buffer) throws IOException { - int processedBytes; - if ((processedBytes = rbc.read(buffer)) > 0) { - totalBytes += processedBytes; - logger.progress(toHumanReadableLength(totalBytes) + "/" + formattedSize + " downloaded"); - } - return processedBytes; - } - - private String toHumanReadableLength(long bytes) { - if (bytes < 1024) { - return bytes + " B"; - } else if (bytes < 1024 * 1024) { - return (bytes / 1024) + " KB"; - } else if (bytes < 1024 * 1024 * 1024) { - return String.format("%.2f MB", bytes / (1024.0 * 1024.0)); - } else { - return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0)); - } - } - } -} diff --git a/src/main/java/net/fabricmc/loom/task/DownloadTask.java b/src/main/java/net/fabricmc/loom/task/DownloadTask.java deleted file mode 100644 index a194dd3..0000000 --- a/src/main/java/net/fabricmc/loom/task/DownloadTask.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * 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.task; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Checksum; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.ManifestVersion; -import net.fabricmc.loom.util.Version; -import net.fabricmc.loom.util.assets.AssetIndex; -import net.fabricmc.loom.util.assets.AssetObject; -import net.fabricmc.loom.util.progress.ProgressLogger; -import org.apache.commons.io.FileUtils; -import org.gradle.api.DefaultTask; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.dsl.DependencyHandler; -import org.gradle.api.logging.Logger; -import org.gradle.api.tasks.TaskAction; - -import java.io.*; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.zip.GZIPInputStream; - -public class DownloadTask extends DefaultTask { - @TaskAction - public void download() { - try { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - - downloadMcJson(extension, getLogger()); - - Gson gson = new Gson(); - Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); - - if (!Constants.MINECRAFT_CLIENT_JAR.get(extension).exists() || !Checksum.equals(Constants.MINECRAFT_CLIENT_JAR.get(extension), version.downloads.get("client").sha1)) { - this.getLogger().lifecycle(":downloading client"); - FileUtils.copyURLToFile(new URL(version.downloads.get("client").url), Constants.MINECRAFT_CLIENT_JAR.get(extension)); - } - - if (!Constants.MINECRAFT_SERVER_JAR.get(extension).exists() || !Checksum.equals(Constants.MINECRAFT_SERVER_JAR.get(extension), version.downloads.get("server").sha1)) { - this.getLogger().lifecycle(":downloading server"); - FileUtils.copyURLToFile(new URL(version.downloads.get("server").url), Constants.MINECRAFT_SERVER_JAR.get(extension)); - } - - if (!Constants.POMF_DIR.get(extension).exists()) { - Constants.POMF_DIR.get(extension).mkdir(); - } - - if (Constants.JAR_MAPPER_ENIGMA.equals(extension.jarMapper)) { - if (!Constants.MAPPINGS_ENIGMA_ZIP.get(extension).exists() && extension.hasPomf()) { - this.getLogger().lifecycle(":downloading enigma mappings"); - try { - FileUtils.copyURLToFile( - new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-engima.zip", Constants.POMF_MAVEN_SERVER, extension.version, extension.pomfVersion)), - Constants.MAPPINGS_ENIGMA_ZIP.get(extension) - ); - } catch (Exception e) { - throw new RuntimeException("Failed to download mappings", e); - } - } - } - - if (!extension.hasPomf()) { - if (Constants.MAPPINGS_DIR_LOCAL.get(extension).exists()) { - if (Constants.MAPPINGS_TINY_GZ_LOCAL.get(extension).exists() && (!Constants.JAR_MAPPER_ENIGMA.equals(extension.jarMapper) || Constants.MAPPINGS_ENIGMA_ZIP_LOCAL.get(extension).exists())) { - this.getLogger().lifecycle(":using local mappings!"); - extension.localMappings = true; - - //We delete this to make sure they are always re extracted. - deleteIfExists(Constants.MAPPINGS_ENIGMA_DIR.get(extension)); - deleteIfExists(Constants.MAPPINGS_ENIGMA_ZIP.get(extension)); - deleteIfExists(Constants.MAPPINGS_TINY_GZ.get(extension)); - deleteIfExists(Constants.MAPPINGS_TINY.get(extension)); - - Constants.MAPPINGS_TINY_GZ = Constants.MAPPINGS_TINY_GZ_LOCAL; - Constants.MAPPINGS_ENIGMA_ZIP = Constants.MAPPINGS_ENIGMA_ZIP_LOCAL; - } - } - } - - if (!Constants.MAPPINGS_TINY.get(extension).exists() && extension.hasPomf()) { - if (!Constants.MAPPINGS_TINY_GZ.get(extension).exists() && !extension.localMappings) { - getLogger().lifecycle(":downloading tiny mappings"); - try { - FileUtils.copyURLToFile(new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-tiny.gz", Constants.POMF_MAVEN_SERVER, extension.version, extension.pomfVersion)), Constants.MAPPINGS_TINY_GZ.get(extension)); - } catch (Exception e) { - throw new RuntimeException("Failed to download mappings", e); - } - } - GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(Constants.MAPPINGS_TINY_GZ.get(extension))); - FileOutputStream fileOutputStream = new FileOutputStream(Constants.MAPPINGS_TINY.get(extension)); - int length; - byte[] buffer = new byte[1024]; - while ((length = gzipInputStream.read(buffer)) > 0) { - fileOutputStream.write(buffer, 0, length); - } - gzipInputStream.close(); - fileOutputStream.close(); - } - - DependencyHandler dependencyHandler = getProject().getDependencies(); - - if (getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getState() == Configuration.State.UNRESOLVED) { - for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile(extension) != null) { - // By default, they are all available on all sides - String configName = Constants.CONFIG_MC_DEPENDENCIES; - if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { - configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; - } - dependencyHandler.add(configName, library.getArtifactName()); - } - } - } - - if (getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES).getState() == Configuration.State.UNRESOLVED) { - version.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> dependencyHandler.add(Constants.CONFIG_NATIVES, lib.getArtifactName())); - } - - Version.AssetIndex assetIndex = version.assetIndex; - - // get existing cache files - this.getLogger().lifecycle(":checking for existing asset files"); - Multimap assetFilenameToFile = HashMultimap.create(); - for (File assetDir : Objects.requireNonNull(extension.getUserCache().listFiles((f) -> f.isDirectory() && f.getName().startsWith("assets-")))) { - File objectsDir = new File(assetDir, "objects"); - if (objectsDir.exists() && objectsDir.isDirectory()) { - for (File subDir : Objects.requireNonNull(objectsDir.listFiles(File::isDirectory))) { - for (File subFile : Objects.requireNonNull(subDir.listFiles(File::isFile))) { - assetFilenameToFile.put("objects" + File.separator + subDir.getName() + File.separator + subFile.getName(), subFile); - } - } - } - } - - File assets = new File(extension.getUserCache(), "assets-" + extension.version); - if (!assets.exists()) { - assets.mkdirs(); - } - - File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.id + ".json"); - if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) { - this.getLogger().lifecycle(":downloading asset index"); - FileUtils.copyURLToFile(new URL(assetIndex.url), assetsInfo); - } - - ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); - progressLogger.start("Downloading assets...", "assets"); - AssetIndex index = new Gson().fromJson(new FileReader(assetsInfo), AssetIndex.class); - Map parent = index.getFileMap(); - final int totalSize = parent.size(); - int position = 0; - this.getLogger().lifecycle(":downloading assets..."); - for (Map.Entry entry : parent.entrySet()) { - AssetObject object = entry.getValue(); - String sha1 = object.getHash(); - String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; - File file = new File(assets, filename); - if (!file.exists() && assetFilenameToFile.containsKey(filename)) { - this.getLogger().debug(":copying asset " + entry.getKey()); - for (File srcFile : assetFilenameToFile.get(filename)) { - if (Checksum.equals(srcFile, sha1)) { - FileUtils.copyFile(srcFile, file); - break; - } - } - } - - if (!file.exists() || !Checksum.equals(file, sha1)) { - this.getLogger().debug(":downloading asset " + entry.getKey()); - FileUtils.copyURLToFile(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file); - } - String assetName = entry.getKey(); - int end = assetName.lastIndexOf("/") + 1; - if (end > 0) { - assetName = assetName.substring(end); - } - progressLogger.progress(assetName + " - " + position + "/" + totalSize + " (" + (int) ((position / (double) totalSize) * 100) + "%) assets downloaded"); - position++; - } - progressLogger.completed(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void downloadMcJson(LoomGradleExtension extension, Logger logger) throws IOException { - if (!Constants.MINECRAFT_JSON.get(extension).exists()) { - logger.lifecycle(":downloading minecraft json"); - FileUtils.copyURLToFile(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), Constants.VERSION_MANIFEST.get(extension)); - ManifestVersion mcManifest = new GsonBuilder().create().fromJson(FileUtils.readFileToString(Constants.VERSION_MANIFEST.get(extension), "UTF-8"), ManifestVersion.class); - - Optional optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(extension.version)).findFirst(); - if (optionalVersion.isPresent()) { - FileUtils.copyURLToFile(new URL(optionalVersion.get().url), Constants.MINECRAFT_JSON.get(extension)); - } else { - logger.info(":failed downloading minecraft json"); - throw new RuntimeException("Failed downloading Minecraft json"); - } - } - } - - private static boolean deleteIfExists(File file) { - if (file.exists()) { - if (file.isDirectory()) { - try { - FileUtils.deleteDirectory(file); - return file.mkdir(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return file.delete(); - } - return false; - } -} diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index f3c9f6f..bccc6e3 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -26,9 +26,10 @@ 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.Version; +import net.fabricmc.loom.util.MinecraftVersionInfo; import org.gradle.api.DefaultTask; import org.gradle.api.Project; import org.gradle.api.tasks.TaskAction; @@ -104,7 +105,8 @@ public class GenIdeaProjectTask extends DefaultTask { Gson gson = new Gson(); - Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); + MinecraftProvider minecraftProvider = extension.getDependencyManager().getProvider(MinecraftProvider.class); + MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo; TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); @@ -139,8 +141,8 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.projectName = project.getName(); ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; - ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + version.assetIndex.id + " --assetsDir \"" + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath() + "\" --fabricMappingFile \"" + Constants.MAPPINGS_TINY.get(extension).getAbsolutePath() + "\""; + 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(ideaClient.genRuns(runManager)); @@ -150,7 +152,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaServer.vmArgs = "-Dfabric.development=true"; - ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + Constants.MAPPINGS_TINY.get(extension).getAbsolutePath() + "\""; + ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; runManager.appendChild(ideaServer.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java deleted file mode 100644 index aa99332..0000000 --- a/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.task; - -import com.google.gson.*; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.Version; -import org.apache.commons.io.FileUtils; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.TaskAction; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Install https://marketplace.visualstudio.com/items?itemName=georgewfraser.vscode-javac into vscode - */ -public class GenVSCodeProjectTask extends DefaultTask { - - @TaskAction - public void genVsCodeProject() throws IOException { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - File classPathFile = new File("vscodeClasspath.txt"); - File configFile = new File("javaconfig.json"); - - Gson gson = new Gson(); - Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); - - List libs = new ArrayList<>(); - for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile(extension) != null && library.getFile(extension).exists()) { - libs.add(library.getFile(extension).getAbsolutePath()); - } - } - libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); - for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { - libs.add(file.getAbsolutePath()); - } - FileUtils.writeLines(classPathFile, libs); - - JsonObject jsonObject = new JsonObject(); - JsonArray jsonArray = new JsonArray(); - jsonArray.add("src/main/java"); - jsonArray.add("src/main/resources"); - jsonArray.add("src/test/java"); - jsonArray.add("src/test/resources"); - jsonObject.add("sourcePath", jsonArray); - JsonElement element = new JsonPrimitive(classPathFile.getName()); - jsonObject.add("classPathFile", element); - element = new JsonPrimitive("vscode"); - jsonObject.add("outputDirectory", element); - - FileUtils.writeStringToFile(configFile, gson.toJson(jsonObject), "UTF-8"); - } - -} diff --git a/src/main/java/net/fabricmc/loom/task/LoomBaseTask.java b/src/main/java/net/fabricmc/loom/task/LoomBaseTask.java deleted file mode 100644 index 7c8cd19..0000000 --- a/src/main/java/net/fabricmc/loom/task/LoomBaseTask.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.task; - -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.delayed.IDelayed; -import org.gradle.api.DefaultTask; - -import java.io.File; - -public class LoomBaseTask extends DefaultTask { - protected final File getFile(IDelayed file) { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - return file.get(extension); - } -} diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsEnigma.java b/src/main/java/net/fabricmc/loom/task/MapJarsEnigma.java deleted file mode 100644 index 193c5dd..0000000 --- a/src/main/java/net/fabricmc/loom/task/MapJarsEnigma.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.task; - - -/* import cuchaz.enigma.Deobfuscator; -import cuchaz.enigma.TranslatingTypeLoader; -import cuchaz.enigma.mapping.MappingsEnigmaReader; -import cuchaz.enigma.mapping.TranslationDirection; -import cuchaz.enigma.mapping.Translator; -import cuchaz.enigma.mapping.entry.ReferencedEntryPool; -import cuchaz.enigma.throwables.MappingParseException; */ -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.tinyremapper.TinyUtils; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.TaskAction; -import org.zeroturnaround.zip.ZipUtil; -import org.zeroturnaround.zip.commons.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.jar.JarFile; - -public class MapJarsEnigma { - public void mapJars(MapJarsTask task) { - throw new RuntimeException("Currently unsupported!"); - } - - /* Deobfuscator deobfuscator; - - public void mapJars(MapJarsTask task) throws IOException, MappingParseException { - LoomGradleExtension extension = task.getProject().getExtensions().getByType(LoomGradleExtension.class); - if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || true) { - if(Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ - Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); - } - - if (!extension.hasPomf()) { - task.getLogger().lifecycle("POMF version not set, skipping mapping!"); - FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); - return; - } - - if (!Constants.MAPPINGS_ENIGMA_DIR.get(extension).exists() || extension.localMappings) { - task.getLogger().lifecycle(":unpacking mappings"); - FileUtils.deleteDirectory(Constants.MAPPINGS_ENIGMA_DIR.get(extension)); - ZipUtil.unpack(Constants.MAPPINGS_ENIGMA_ZIP.get(extension), Constants.MAPPINGS_ENIGMA_DIR.get(extension)); - } - - task.getLogger().lifecycle(":remapping jar (Enigma)"); - deobfuscator = new Deobfuscator(new JarFile(Constants.MINECRAFT_MERGED_JAR.get(extension))); - deobfuscator.setMappings(new MappingsEnigmaReader().read(Constants.MAPPINGS_ENIGMA_DIR.get(extension))); - writeJar(Constants.MINECRAFT_PARTIAL_ENIGMA_JAR.get(extension), new ProgressListener(), deobfuscator); - - File tempAssets = new File(Constants.CACHE_FILES, "tempAssets"); - if (tempAssets.exists()) { - FileUtils.deleteDirectory(tempAssets); - } - tempAssets.mkdir(); - - ZipUtil.unpack(Constants.MINECRAFT_CLIENT_JAR.get(extension), tempAssets, name -> { - if (!name.endsWith(".class") && !name.startsWith("META-INF")) { - return name; - } else { - return null; - } - }); - ZipUtil.unpack(Constants.MINECRAFT_PARTIAL_ENIGMA_JAR.get(extension), tempAssets); - - ZipUtil.pack(tempAssets, Constants.MINECRAFT_MAPPED_JAR.get(extension)); - FileUtils.deleteDirectory(tempAssets); - } else { - task.getLogger().lifecycle(Constants.MINECRAFT_MAPPED_JAR.get(extension).getAbsolutePath()); - task.getLogger().lifecycle(":mapped jar found, skipping mapping"); - } - } - - public void writeJar(File out, Deobfuscator.ProgressListener progress, Deobfuscator deobfuscator) { - Translator obfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.OBFUSCATING); - Translator deobfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.DEOBFUSCATING); - TranslatingTypeLoader loader = new TranslatingTypeLoader(deobfuscator.getJar(), deobfuscator.getJarIndex(), new ReferencedEntryPool(), obfuscationTranslator, deobfuscationTranslator); - deobfuscator.transformJar(out, progress, loader::transformInto); - } - - public static class ProgressListener implements Deobfuscator.ProgressListener { - @Override - public void init(int i, String s) { - - } - - @Override - public void onProgress(int i, String s) { - - } - } */ -} diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java deleted file mode 100644 index 6f0a733..0000000 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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.task; - -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.*; -import org.zeroturnaround.zip.commons.FileUtils; - -import java.io.File; -import java.util.Collection; - -public class MapJarsTask extends LoomBaseTask { - @InputFiles - @Classpath - public Collection getMapperPaths() { - return this.getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles(); - } - - @InputFile - public File getMappingFile() { - return getFile(Constants.MAPPINGS_TINY); - } - - @InputFile - public File getInputJar() { - return getFile(Constants.MINECRAFT_MERGED_JAR); - } - - @OutputFile - public File getIntermediaryJar() { - return getFile(Constants.MINECRAFT_INTERMEDIARY_JAR); - } - - @OutputFile - public File getMappedJar() { - return getFile(Constants.MINECRAFT_MAPPED_JAR); - } - - @Input - public boolean localMappings() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - return extension.localMappings; - } - - @Input - public String pomfVersion() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - return extension.pomfVersion; - } - - @Input - public String jarMapper() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - return extension.jarMapper; - } - - @TaskAction - public void mapJars() throws Exception { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - - if (getMappedJar().exists()) { - getMappedJar().delete(); - } - - if (getIntermediaryJar().exists()) { - getIntermediaryJar().delete(); - } - - if (!extension.hasPomf()) { - this.getLogger().lifecycle("Mapping version not set, skipping mapping!"); - FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), getMappedJar()); - return; - } - - if (Constants.JAR_MAPPER_ENIGMA.equals(jarMapper())) { - new MapJarsEnigma().mapJars(this); - } else if (Constants.JAR_MAPPER_TINY.equals(jarMapper())) { - new MapJarsTiny().mapJars(this); - } else { - throw new RuntimeException("Unknown JAR mapper type: " + jarMapper()); - } - } -} diff --git a/src/main/java/net/fabricmc/loom/task/MergeJarsTask.java b/src/main/java/net/fabricmc/loom/task/MergeJarsTask.java deleted file mode 100644 index ea18197..0000000 --- a/src/main/java/net/fabricmc/loom/task/MergeJarsTask.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.task; - -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.delayed.IDelayed; -import net.fabricmc.stitch.merge.JarMerger; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.TaskAction; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -public class MergeJarsTask extends LoomBaseTask { - @InputFile - public File getClientJar() { - return getFile(Constants.MINECRAFT_CLIENT_JAR); - } - - @InputFile - public File getServerJar() { - return getFile(Constants.MINECRAFT_SERVER_JAR); - } - - @OutputFile - public File getMergedJar() { - return getFile(Constants.MINECRAFT_MERGED_JAR); - } - - @TaskAction - public void mergeJars() throws IOException { - this.getLogger().lifecycle(":merging jars"); - FileInputStream client = new FileInputStream(getClientJar()); - FileInputStream server = new FileInputStream(getServerJar()); - FileOutputStream merged = new FileOutputStream(getMergedJar()); - - JarMerger jarMerger = new JarMerger(client, server, merged); - - jarMerger.merge(); - jarMerger.close(); - - client.close(); - server.close(); - merged.close(); - } - -} diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index ef030a7..43b06b5 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -24,15 +24,12 @@ package net.fabricmc.loom.task; -import com.google.gson.Gson; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.Version; +import net.fabricmc.loom.util.MinecraftVersionInfo; import org.gradle.api.tasks.JavaExec; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; import java.util.ArrayList; import java.util.List; @@ -41,35 +38,22 @@ public class RunClientTask extends JavaExec { @Override public void exec() { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - Gson gson = new Gson(); - Version version = null; - try { - version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); - } catch (FileNotFoundException e) { - getLogger().error("Failed to retrieve version from minecraft json", e); - } + MinecraftVersionInfo minecraftVersionInfo = extension.getMinecraftProvider().versionInfo; + List libs = new ArrayList<>(); for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { libs.add(file.getAbsolutePath()); } - for (File file : getProject().getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()) { - libs.add(file.getAbsolutePath()); - } //Used to add the fabric jar that has been built for (File file : new File(getProject().getBuildDir(), "libs").listFiles()) { if (file.isFile()) { libs.add(file.getAbsolutePath()); } } - libs.add(Constants.MINECRAFT_CLIENT_JAR.get(extension).getAbsolutePath()); - - //Removes the deobf jars - libs.removeIf(s -> s.contains(Constants.MINECRAFT_FINAL_JAR.get(extension).getName())); classpath(libs); - - args("--tweakClass", Constants.FABRIC_CLIENT_TWEAKER, "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(), "--fabricMappingFile", Constants.MAPPINGS_TINY.get(extension).getAbsolutePath()); + args("--tweakClass", Constants.FABRIC_CLIENT_TWEAKER, "--assetIndex", minecraftVersionInfo.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.getMinecraftProvider().minecraftVersion).getAbsolutePath(), "--fabricMappingFile", extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); @@ -93,7 +77,7 @@ 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=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); + 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/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index 3d62eb7..e47d69c 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -24,15 +24,11 @@ package net.fabricmc.loom.task; -import com.google.gson.Gson; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.Version; import org.gradle.api.tasks.JavaExec; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; import java.util.ArrayList; import java.util.List; @@ -41,31 +37,20 @@ public class RunServerTask extends JavaExec { @Override public void exec() { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - Gson gson = new Gson(); - Version version = null; - try { - version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } List libs = new ArrayList<>(); for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { libs.add(file.getAbsolutePath()); } - for (File file : getProject().getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()) { - libs.add(file.getAbsolutePath()); - } //Used to add the fabric jar that has been built for (File file : new File(getProject().getBuildDir(), "libs").listFiles()) { if (file.isFile()) { libs.add(file.getAbsolutePath()); } } - libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", Constants.FABRIC_SERVER_TWEAKER, "--fabricMappingFile", Constants.MAPPINGS_TINY.get(extension).getAbsolutePath()); + args("--tweakClass", Constants.FABRIC_SERVER_TWEAKER, "--fabricMappingFile", extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); @@ -89,7 +74,6 @@ public class RunServerTask extends JavaExec { public List getJvmArgs() { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); List args = new ArrayList<>(); - args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); args.add("-Dfabric.development=true"); return args; } diff --git a/src/main/java/net/fabricmc/loom/task/SetupTask.java b/src/main/java/net/fabricmc/loom/task/SetupTask.java deleted file mode 100644 index 3b8c6c9..0000000 --- a/src/main/java/net/fabricmc/loom/task/SetupTask.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.task; - -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.ModProcessor; -import org.gradle.api.DefaultTask; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.tasks.TaskAction; - -import java.io.File; - -public class SetupTask extends DefaultTask { - - @TaskAction - public void setup(){ - configureModRemapper(); - } - - public void configureModRemapper(){ - LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); - Configuration inputConfig = getProject().getConfigurations().getByName(Constants.COMPILE_MODS); - - inputConfig.getResolvedConfiguration().getFiles().stream() - .filter(file -> file.getName().endsWith(".jar")) - .forEach(input -> { - String outputName = input.getName().substring(0, input.getName().length() - 4) + "-mapped-" + extension.pomfVersion + ".jar";//TODO use the hash of the input file or something? - File output = new File(Constants.REMAPPED_MODS_STORE.get(extension), outputName); - if(!output.getParentFile().exists()){ - output.mkdirs(); - } - ModProcessor.handleMod(input, output, getProject()); - if (!output.exists()) { - throw new RuntimeException("Output does not exist!"); - } - getProject().getDependencies().add(Constants.CONFIG_MINECRAFT, getProject().files(output.getPath())); - }); - } -} diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 7bb1943..d44cc7e 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -24,49 +24,14 @@ package net.fabricmc.loom.util; -import net.fabricmc.loom.util.delayed.DelayedFile; -import net.fabricmc.loom.util.delayed.IDelayed; - import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.List; public class Constants { public static final File WORKING_DIRECTORY = new File("."); public static final File CACHE_FILES = new File(WORKING_DIRECTORY, ".gradle/minecraft"); - public static final String JAR_MAPPER_ENIGMA = "enigma"; - public static final String JAR_MAPPER_TINY = "tiny"; + public static final File REMAPPED_MODS_STORE = new File(CACHE_FILES, "remapped_mods"); - public static final IDelayed MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-client.jar")); - public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-server.jar")); - public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-merged.jar")); - public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-mapped-" + extension.pomfVersion + ".jar")); - public static final IDelayed MINECRAFT_INTERMEDIARY_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-intermediary.jar")); -// public static final IDelayed MINECRAFT_PARTIAL_ENIGMA_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-partial-enigma-" + extension.pomfVersion + ".jar")); -// public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-final-" + extension.pomfVersion + ".jar")); - public static final IDelayed MINECRAFT_FINAL_JAR = MINECRAFT_MAPPED_JAR; - - public static final IDelayed POMF_DIR = new DelayedFile(extension -> new File(extension.getUserCache(), "pomf")); - public static IDelayed MAPPINGS_TINY_GZ = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz")); - public static final IDelayed MAPPINGS_TINY = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion)); - public static final IDelayed MAPPINGS_MIXIN_EXPORT = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-map-" + extension.version + "." + extension.pomfVersion + ".tiny")); - public static IDelayed MAPPINGS_ENIGMA_ZIP = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip")); - public static final IDelayed MAPPINGS_ENIGMA_DIR = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + "")); - - public static final IDelayed MAPPINGS_DIR_LOCAL = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings")); - public static final IDelayed MAPPINGS_ENIGMA_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); - public static final IDelayed MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); - - public static final IDelayed REMAPPED_MODS_STORE = new DelayedFile(extension -> new File(CACHE_FILES, "remapped_mods")); - - public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); - public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); - public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); - - public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getUserCache(), "version_manifest.json")); public static final String FABRIC_CLIENT_TWEAKER = "net.fabricmc.loader.launch.FabricClientTweaker"; public static final String FABRIC_SERVER_TWEAKER = "net.fabricmc.loader.launch.FabricServerTweaker"; @@ -75,21 +40,8 @@ public class Constants { public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; - public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"; - - public static final String CONFIG_NATIVES = "MC_NATIVES"; - public static final String CONFIG_MC_DEPENDENCIES = "MC_DEPENDENCIES"; - public static final String CONFIG_MINECRAFT = "MINECRAFT"; - public static final String CONFIG_MC_DEPENDENCIES_CLIENT = "MC_DEPENDENCIES_CLIENT"; public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; - public static final String COMPILE_MODS = "modCompile"; - public static List getClassPath() { - URL[] urls = ((URLClassLoader) Constants.class.getClassLoader()).getURLs(); - ArrayList list = new ArrayList<>(); - for (URL url : urls) { - list.add(url.getPath()); - } - return list; - } + public static final String COMPILE_MODS = "modCompile"; + public static final String MINECRAFT = "minecraft"; } diff --git a/src/main/java/net/fabricmc/loom/util/DependencyProvider.java b/src/main/java/net/fabricmc/loom/util/DependencyProvider.java new file mode 100644 index 0000000..56e03e2 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/DependencyProvider.java @@ -0,0 +1,92 @@ +/* + * 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.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; + +import java.io.File; +import java.util.Set; + +public abstract class DependencyProvider { + + private LoomDependencyManager dependencyManager; + + public abstract void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) throws Exception; + + public abstract String getTargetConfig(); + + public void addDep(Object object, Project project){ + if(object instanceof File){ + object = project.files(object); + } + project.getDependencies().add("compile", object); + } + + public void register(LoomDependencyManager dependencyManager){ + this.dependencyManager = dependencyManager; + } + + public LoomDependencyManager getDependencyManager() { + return dependencyManager; + } + + public static class DependcyInfo { + final Dependency dependency; + final Configuration sourceConfiguration; + + public DependcyInfo(Dependency dependency, Configuration sourceConfiguration) { + this.dependency = dependency; + this.sourceConfiguration = sourceConfiguration; + } + + public Dependency getDependency() { + return dependency; + } + + public Configuration getSourceConfiguration() { + return sourceConfiguration; + } + + public Set resolve(){ + return sourceConfiguration.files(dependency); + } + + public File resolveFile(){ + Set files = resolve(); + if(files.size() != 1){ + throw new RuntimeException(dependency + " resolves to more than one file"); + } + File file = files.stream().findFirst().orElse(null); + return file; + } + + public String getDepString(){ + return dependency.getGroup() + ":" + dependency.getName() + ":" + dependency.getVersion(); + } + } +} diff --git a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java new file mode 100644 index 0000000..132863c --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java @@ -0,0 +1,84 @@ +/* + * 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.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class LoomDependencyManager { + + private List dependencyProviderList = new ArrayList<>(); + + public void addProvider(DependencyProvider provider){ + if(dependencyProviderList.contains(provider)){ + throw new RuntimeException("Provider is already registered"); + } + if(getProvider(provider.getClass()) != null){ + throw new RuntimeException("Provider of this type is already registered"); + } + provider.register(this); + dependencyProviderList.add(provider); + } + + public T getProvider(Class clazz){ + for(DependencyProvider provider : dependencyProviderList){ + if(provider.getClass() == clazz){ + return (T) provider; + } + } + return null; + } + + public void handleDependencies(Project project){ + project.getLogger().lifecycle(":setting up loom dependencies"); + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + Set targetConfigs = new HashSet<>(); + for(DependencyProvider provider : dependencyProviderList){ + targetConfigs.add(provider.getTargetConfig()); + } + for(String config : targetConfigs){ + Configuration configuration = project.getConfigurations().getByName(config); + configuration.getDependencies().stream().forEach(dependency -> { + for(DependencyProvider provider : dependencyProviderList){ + if(provider.getTargetConfig().equals(config)){ + DependencyProvider.DependcyInfo info = new DependencyProvider.DependcyInfo(dependency, configuration); + try { + provider.provide(info, project, extension); + } catch (Exception e) { + throw new RuntimeException("Failed to provide", e); + } + } + } + }); + + } + } +} diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTiny.java b/src/main/java/net/fabricmc/loom/util/MapJarsTiny.java similarity index 78% rename from src/main/java/net/fabricmc/loom/task/MapJarsTiny.java rename to src/main/java/net/fabricmc/loom/util/MapJarsTiny.java index e2ac534..4e7f561 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTiny.java +++ b/src/main/java/net/fabricmc/loom/util/MapJarsTiny.java @@ -22,15 +22,14 @@ * SOFTWARE. */ -package net.fabricmc.loom.task; +package net.fabricmc.loom.util; -import com.google.common.base.Joiner; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.providers.MinecraftJarProvider; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.TinyUtils; +import org.gradle.api.Project; import java.io.File; import java.io.IOException; @@ -39,22 +38,22 @@ import java.util.Arrays; public class MapJarsTiny { - public void mapJars(MapJarsTask task) throws IOException { + public void mapJars(MinecraftJarProvider jarProvider, Project project) throws IOException { String fromM = "official"; - Path mappings = task.getMappingFile().toPath(); - Path[] classpath = task.getMapperPaths().stream() + Path mappings = jarProvider.getMappingFile().toPath(); + Path[] classpath = jarProvider.getMapperPaths().stream() .map(File::toPath) .toArray(Path[]::new); - Path input = task.getInputJar().toPath(); - Path outputMapped = task.getMappedJar().toPath(); - Path outputIntermediary = task.getIntermediaryJar().toPath(); + Path input = jarProvider.getInputJar().toPath(); + Path outputMapped = jarProvider.getMappedJar().toPath(); + Path outputIntermediary = jarProvider.getIntermediaryJar().toPath(); for (String toM : Arrays.asList("named", "intermediary")) { Path output = "named".equals(toM) ? outputMapped : outputIntermediary; - task.getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); + project.getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); TinyRemapper remapper = TinyRemapper.newRemapper() .withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) diff --git a/src/main/java/net/fabricmc/loom/util/Version.java b/src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java similarity index 93% rename from src/main/java/net/fabricmc/loom/util/Version.java rename to src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java index d0fa2bd..fb780c8 100644 --- a/src/main/java/net/fabricmc/loom/util/Version.java +++ b/src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java @@ -27,12 +27,13 @@ package net.fabricmc.loom.util; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.providers.MinecraftLibraryProvider; import java.io.File; import java.util.List; import java.util.Map; -public class Version { +public class MinecraftVersionInfo { public List libraries; public Map downloads; public AssetIndex assetIndex; @@ -62,9 +63,9 @@ public class Version { return Constants.LIBRARIES_BASE + path; } - public File getFile(LoomGradleExtension extension) { + public File getFile(File baseDir) { String[] parts = this.name.split(":", 3); - return new File(Constants.MINECRAFT_LIBS.get(extension), parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); + return new File(baseDir, parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); } public String getSha1() { diff --git a/src/main/java/net/fabricmc/loom/util/ModProcessor.java b/src/main/java/net/fabricmc/loom/util/ModProcessor.java index bde2791..af46062 100644 --- a/src/main/java/net/fabricmc/loom/util/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/util/ModProcessor.java @@ -29,6 +29,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.providers.MinecraftProvider; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.TinyUtils; @@ -77,10 +78,12 @@ public class ModProcessor { String fromM = "intermediary"; String toM = "named"; - File mappingsFile = Constants.MAPPINGS_TINY.get(extension); + MinecraftProvider minecraftProvider = extension.getMinecraftProvider(); + + File mappingsFile = minecraftProvider.pomfProvider.MAPPINGS_TINY; Path mappings = mappingsFile.toPath(); - Path mc = Constants.MINECRAFT_INTERMEDIARY_JAR.get(extension).toPath(); - Path[] mcDeps = project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles().stream() + Path mc = minecraftProvider.jarProvider.MINECRAFT_INTERMEDIARY_JAR.toPath(); + Path[] mcDeps = minecraftProvider.jarProvider.getMapperPaths().stream() .map(File::toPath) .toArray(Path[]::new); Collection modCompileFiles = project.getConfigurations().getByName(Constants.COMPILE_MODS).getFiles(); diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index 03b127c..3753917 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.util; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.providers.MinecraftProvider; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.TinyUtils; @@ -49,18 +50,19 @@ public class ModRemapper { return; } - Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); + MinecraftProvider minecraftProvider = extension.getMinecraftProvider(); + + Path mappings = minecraftProvider.pomfProvider.MAPPINGS_TINY.toPath(); String fromM = "named"; String toM = "intermediary"; List classpathFiles = new ArrayList<>(); classpathFiles.addAll(project.getConfigurations().getByName("compile").getFiles()); - classpathFiles.addAll(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()); Path[] classpath = classpathFiles.stream().map(File::toPath).toArray(Path[]::new); - File mixinMapFile = Constants.MAPPINGS_MIXIN_EXPORT.get(extension); + File mixinMapFile = extension.getMinecraftProvider().jarProvider.MINECRAFT_MAPPED_JAR; Path mixinMapPath = mixinMapFile.toPath(); TinyRemapper.Builder remapperBuilder = TinyRemapper.newRemapper(); diff --git a/src/main/java/net/fabricmc/loom/util/delayed/DelayedFile.java b/src/main/java/net/fabricmc/loom/util/delayed/DelayedFile.java deleted file mode 100644 index 33afedd..0000000 --- a/src/main/java/net/fabricmc/loom/util/delayed/DelayedFile.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.delayed; - -import net.fabricmc.loom.LoomGradleExtension; - -import java.io.File; -import java.util.function.Function; - -public class DelayedFile implements IDelayed { - private File file; - private Function function; - - public DelayedFile(Function function) { - this.function = function; - } - - @Override - public File get(LoomGradleExtension extension) { - // TODO: Figure out caching issues - this.file = this.function.apply(extension); - return this.file; - } -} diff --git a/src/main/java/net/fabricmc/loom/util/delayed/IDelayed.java b/src/main/java/net/fabricmc/loom/util/delayed/IDelayed.java deleted file mode 100644 index 9ab89d2..0000000 --- a/src/main/java/net/fabricmc/loom/util/delayed/IDelayed.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.delayed; - -import net.fabricmc.loom.LoomGradleExtension; - -public interface IDelayed { - T get(LoomGradleExtension extension); -}