From 3ab757363cb11807a3551d0f7396c4564d00bcc9 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 19:31:47 +0000 Subject: [PATCH 01/18] Start 0.6 dev cycle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 95befe14..b990d853 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ targetCompatibility = 1.8 group = 'net.fabricmc' archivesBaseName = project.name -def baseVersion = '0.5' +def baseVersion = '0.6' def build = 'local' def ENV = System.getenv() From 78c934aed58e28b2128ef8969d74110e8050fa84 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 19:33:23 +0000 Subject: [PATCH 02/18] Move remapped mods into a full local maven repo (#300) --- .../net/fabricmc/loom/AbstractPlugin.java | 6 +- .../dependency/ModDependencyInfo.java | 59 +++++++++++++++++-- .../loom/providers/MappingsProvider.java | 4 ++ .../loom/util/LoomDependencyManager.java | 5 +- .../loom/util/ModCompileRemapper.java | 6 +- .../net/fabricmc/loom/util/ModProcessor.java | 2 + src/main/resources/mod_compile_template.pom | 8 +++ 7 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/mod_compile_template.pom diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 82d164e8..3aa6f285 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -207,9 +207,9 @@ public class AbstractPlugin implements Plugin { flatDirectoryArtifactRepository.setName("UserLocalCacheFiles"); }); - project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> { - flatDirectoryArtifactRepository.dir(extension.getRemappedModCache()); - flatDirectoryArtifactRepository.setName("UserLocalRemappedMods"); + project1.getRepositories().maven(mavenArtifactRepository -> { + mavenArtifactRepository.setUrl(extension.getRemappedModCache()); + mavenArtifactRepository.setName("UserLocalRemappedMods"); }); project1.getRepositories().maven(mavenArtifactRepository -> { diff --git a/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java b/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java index 19658457..fa488411 100644 --- a/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java +++ b/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java @@ -28,16 +28,19 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.jar.JarEntry; import java.util.jar.JarFile; import com.google.gson.JsonObject; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.gradle.api.artifacts.Configuration; import net.fabricmc.loom.util.ModProcessor; public class ModDependencyInfo { - public final String group; + private final String group; public final String name; public final String version; public final String classifier; @@ -61,15 +64,39 @@ public class ModDependencyInfo { } public String getRemappedNotation() { - return String.format("%s:%s:%s@%s%s", group, name, version, remapData.mappingsSuffix, classifier); + if (classifier == null || classifier.isEmpty()) { + return String.format("%s:%s:%s", getGroup(), name, version); + } + + return String.format("%s:%s:%s:%s", getGroup(), name, version, classifier); } - public String getRemappedFilename() { - return String.format("%s-%s@%s", name, version, remapData.mappingsSuffix + classifier.replace(':', '-')); + private String getRemappedFilename() { + if (classifier == null || classifier.isEmpty()) { + return String.format("%s-%s", name, version); + } + + return String.format("%s-%s@%s", name, version, classifier.replace(':', '-')); + } + + private File getRemappedDir() { + return new File(remapData.modStore, String.format("%s/%s/%s", getGroup().replace(".", "/"), name, version)); } public File getRemappedOutput() { - return new File(remapData.modStore, getRemappedFilename() + ".jar"); + return new File(getRemappedDir(), getRemappedFilename() + ".jar"); + } + + private File getRemappedPom() { + return new File(getRemappedOutput().getAbsolutePath().replace(".jar", ".pom")); + } + + private String getGroup() { + return getMappingsPrefix(remapData.mappingsSuffix) + "." + group; + } + + public static String getMappingsPrefix(String mappings) { + return mappings.replace(".", "_").replace("-", "_").replace("+", "_"); } public File getInputFile() { @@ -77,11 +104,31 @@ public class ModDependencyInfo { } public boolean requiresRemapping() { - return !getRemappedOutput().exists() || inputFile.lastModified() <= 0 || inputFile.lastModified() > getRemappedOutput().lastModified() || forceRemap; + return !getRemappedOutput().exists() || inputFile.lastModified() <= 0 || inputFile.lastModified() > getRemappedOutput().lastModified() || forceRemap || !getRemappedPom().exists(); } public void finaliseRemapping() { getRemappedOutput().setLastModified(inputFile.lastModified()); + savePom(); + } + + private void savePom() { + try { + String pomTemplate; + + try (InputStream input = ModDependencyInfo.class.getClassLoader().getResourceAsStream("mod_compile_template.pom")) { + pomTemplate = IOUtils.toString(input, StandardCharsets.UTF_8); + } + + pomTemplate = pomTemplate + .replace("%GROUP%", getGroup()) + .replace("%NAME%", name) + .replace("%VERSION%", version); + + FileUtils.writeStringToFile(getRemappedPom(), pomTemplate, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException("Failed to write mod pom", e); + } } public void forceRemap() { diff --git a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java index 1de20456..3330b862 100644 --- a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java @@ -331,4 +331,8 @@ public class MappingsProvider extends DependencyProvider { return intermediaryTiny; } + + public String getMappingsKey() { + return mappingsName + "." + minecraftVersion.replace(' ', '_').replace('.', '_').replace('-', '_') + "." + mappingsVersion; + } } diff --git a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java index e5ec0578..b365ba15 100644 --- a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java @@ -54,7 +54,7 @@ public class LoomDependencyManager { private final List dependencyProviderList = new ArrayList<>(); - public void addProvider(DependencyProvider provider) { + public T addProvider(T provider) { if (dependencyProviderList.contains(provider)) { throw new RuntimeException("Provider is already registered"); } @@ -65,6 +65,7 @@ public class LoomDependencyManager { provider.register(this); dependencyProviderList.add(provider); + return provider; } public T getProvider(Class clazz) { @@ -132,7 +133,7 @@ public class LoomDependencyManager { } SourceRemapper sourceRemapper = new SourceRemapper(project, true); - String mappingsKey = mappingsProvider.mappingsName + "." + mappingsProvider.minecraftVersion.replace(' ', '_').replace('.', '_').replace('-', '_') + "." + mappingsProvider.mappingsVersion; + String mappingsKey = mappingsProvider.getMappingsKey(); ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); diff --git a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java index 640dd459..aa02c6d5 100644 --- a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java @@ -92,7 +92,7 @@ public class ModCompileRemapper { project.getLogger().info(":providing " + remappedLog); if (sources != null) { - scheduleSourcesRemapping(project, sourceRemapper, info.sourcesFile, info.getRemappedNotation(), info.getRemappedFilename(), modStore); + scheduleSourcesRemapping(project, sourceRemapper, info.sourcesFile, info.getRemappedNotation(), info.getRemappedOutput(), modStore); } } @@ -156,10 +156,10 @@ public class ModCompileRemapper { return null; } - private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, String remappedFilename, File modStore) { + private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, File remappedJar, File modStore) { project.getLogger().debug(":providing " + remappedLog + " sources"); - File remappedSources = new File(modStore, remappedFilename + "-sources.jar"); + File remappedSources = new File(remappedJar.getAbsolutePath().replace(".jar", "-sources.jar")); boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); if (!remappedSources.exists() || sources.lastModified() <= 0 || sources.lastModified() > remappedSources.lastModified() || refreshDeps) { diff --git a/src/main/java/net/fabricmc/loom/util/ModProcessor.java b/src/main/java/net/fabricmc/loom/util/ModProcessor.java index 1932f21f..01be5a15 100644 --- a/src/main/java/net/fabricmc/loom/util/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/util/ModProcessor.java @@ -196,6 +196,8 @@ public class ModProcessor { if (accessWidener != null) { ZipUtil.replaceEntry(info.getRemappedOutput(), info.getAccessWidener(), accessWidener); } + + info.finaliseRemapping(); } } diff --git a/src/main/resources/mod_compile_template.pom b/src/main/resources/mod_compile_template.pom new file mode 100644 index 00000000..8ef63430 --- /dev/null +++ b/src/main/resources/mod_compile_template.pom @@ -0,0 +1,8 @@ + + + 4.0.0 + %GROUP% + %NAME% + %VERSION% + From 3bdccee02e624c7e0905ec8b2d92608f423adb0b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 19:34:00 +0000 Subject: [PATCH 03/18] Refactor and fix game/loader library handling (#298) Update fernflower --- build.gradle | 2 +- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 5 ++++- .../net/fabricmc/loom/providers/LaunchProvider.java | 2 +- .../loom/providers/MinecraftLibraryProvider.java | 8 -------- .../loom/providers/MinecraftMappedProvider.java | 8 ++------ .../net/fabricmc/loom/task/GenerateSourcesTask.java | 3 ++- src/main/java/net/fabricmc/loom/util/Constants.java | 2 ++ .../fabricmc/loom/util/LoomDependencyManager.java | 13 ++++++------- .../java/net/fabricmc/loom/util/ModProcessor.java | 3 ++- .../java/net/fabricmc/loom/util/SourceRemapper.java | 2 +- 10 files changed, 21 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index b990d853..9de53ac1 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ dependencies { // decompilers implementation ('net.fabricmc:procyon-fabric-compilertools:0.5.35.13') - implementation ('org.jetbrains:intellij-fernflower:1.2.1.16') + implementation ('net.fabricmc:fabric-fernflower:1.3.0') implementation ('org.benf:cfr:0.150') // source code remapping diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 3aa6f285..4c1b70a4 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -119,6 +119,8 @@ public class AbstractPlugin implements Plugin { minecraftNamedConfig.setTransitive(false); // The launchers do not recurse dependencies Configuration minecraftDependenciesConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MINECRAFT_DEPENDENCIES); minecraftDependenciesConfig.setTransitive(false); + Configuration loaderDependenciesConfig = project.getConfigurations().maybeCreate(Constants.Configurations.LOADER_DEPENDENCIES); + loaderDependenciesConfig.setTransitive(false); Configuration minecraftConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MINECRAFT); minecraftConfig.setTransitive(false); @@ -147,7 +149,8 @@ public class AbstractPlugin implements Plugin { extendsFrom("testCompileClasspath", Constants.Configurations.MINECRAFT_NAMED); extendsFrom("testRuntimeClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.MINECRAFT_DEPENDENCIES); + extendsFrom(Constants.Configurations.LOADER_DEPENDENCIES, Constants.Configurations.MINECRAFT_DEPENDENCIES); + extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.LOADER_DEPENDENCIES); extendsFrom("compile", Constants.Configurations.MAPPINGS_FINAL); diff --git a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java b/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java index 3697874c..a9284286 100644 --- a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java @@ -104,7 +104,7 @@ public class LaunchProvider extends DependencyProvider { private void writeRemapClassPath() { List inputConfigurations = new ArrayList<>(); - inputConfigurations.add(Constants.Configurations.MINECRAFT_DEPENDENCIES); + inputConfigurations.add(Constants.Configurations.LOADER_DEPENDENCIES); inputConfigurations.addAll(Constants.MOD_COMPILE_ENTRIES.stream().map(RemappedConfigurationEntry::getSourceConfiguration).collect(Collectors.toList())); List remapClasspath = new ArrayList<>(); diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java index ed74ef29..6ee9c0b5 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java @@ -25,8 +25,6 @@ package net.fabricmc.loom.providers; import java.io.File; -import java.util.Collection; -import java.util.HashSet; import org.gradle.api.Project; @@ -37,8 +35,6 @@ import net.fabricmc.loom.util.MinecraftVersionInfo; public class MinecraftLibraryProvider { public File MINECRAFT_LIBS; - private final Collection libs = new HashSet<>(); - public void provide(MinecraftProvider minecraftProvider, Project project) { MinecraftVersionInfo versionInfo = minecraftProvider.getVersionInfo(); @@ -60,10 +56,6 @@ public class MinecraftLibraryProvider { } } - 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(), "libraries"); diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java index 905ec231..1767f4a5 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java @@ -28,7 +28,6 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.Arrays; -import java.util.Collection; import java.util.Map; import java.util.function.Consumer; @@ -135,7 +134,8 @@ public class MinecraftMappedProvider extends DependencyProvider { } public Path[] getRemapClasspath() { - return getMapperPaths().stream().map(File::toPath).toArray(Path[]::new); + return getProject().getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles() + .stream().map(File::toPath).toArray(Path[]::new); } protected void addDependencies(DependencyInfo dependency, Consumer postPopulationScheduler) { @@ -159,10 +159,6 @@ public class MinecraftMappedProvider extends DependencyProvider { return String.format("%s-%s-%s-%s", minecraftProvider.getMinecraftVersion(), type, getExtension().getMappingsProvider().mappingsName, getExtension().getMappingsProvider().mappingsVersion); } - public Collection getMapperPaths() { - return minecraftProvider.getLibraryProvider().getLibraries(); - } - public File getIntermediaryJar() { return minecraftIntermediaryJar; } diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 8f449d45..0a4c181b 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -36,6 +36,7 @@ import javax.inject.Inject; import org.gradle.api.tasks.TaskAction; +import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.api.decompilers.DecompilationMetadata; import net.fabricmc.loom.api.decompilers.LoomDecompiler; @@ -58,7 +59,7 @@ public class GenerateSourcesTask extends AbstractLoomTask { public void doTask() throws Throwable { int threads = Runtime.getRuntime().availableProcessors(); Path javaDocs = getExtension().getMappingsProvider().tinyMappings.toPath(); - Collection libraries = getExtension().getMinecraftProvider().getLibraryProvider().getLibraries() + Collection libraries = getProject().getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles() .stream().map(File::toPath).collect(Collectors.toSet()); DecompilationMetadata metadata = new DecompilationMetadata(threads, javaDocs, libraries); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 7caa8657..7f779304 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -58,9 +58,11 @@ public class Constants { public static final String INCLUDE = "include"; public static final String MINECRAFT = "minecraft"; public static final String MINECRAFT_DEPENDENCIES = "minecraftLibraries"; + public static final String MINECRAFT_REMAP_CLASSPATH = "minecraftRemapClasspath"; public static final String MINECRAFT_NAMED = "minecraftNamed"; public static final String MAPPINGS = "mappings"; public static final String MAPPINGS_FINAL = "mappingsFinal"; + public static final String LOADER_DEPENDENCIES = "loaderLibraries"; private Configurations() { } diff --git a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java index b365ba15..755992e5 100644 --- a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java @@ -135,8 +135,6 @@ public class LoomDependencyManager { SourceRemapper sourceRemapper = new SourceRemapper(project, true); String mappingsKey = mappingsProvider.getMappingsKey(); - ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); - if (extension.getInstallerJson() == null) { //If we've not found the installer JSON we've probably skipped remapping Fabric loader, let's go looking project.getLogger().info("Searching through modCompileClasspath for installer JSON"); @@ -153,16 +151,17 @@ public class LoomDependencyManager { project.getLogger().info("Found installer JSON in " + input); extension.setInstallerJson(jsonObject); + handleInstallerJson(extension.getInstallerJson(), project); } } } - if (extension.getInstallerJson() != null) { - handleInstallerJson(extension.getInstallerJson(), project); - } else { + if (extension.getInstallerJson() == null) { project.getLogger().warn("fabric-installer.json not found in classpath!"); } + ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); + sourceRemapper.remapAll(); for (Runnable runnable : afterTasks) { @@ -174,7 +173,7 @@ public class LoomDependencyManager { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); JsonObject libraries = jsonObject.get("libraries").getAsJsonObject(); - Configuration mcDepsConfig = project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES); + Configuration loaderDepsConfig = project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES); Configuration apDepsConfig = project.getConfigurations().getByName("annotationProcessor"); libraries.get("common").getAsJsonArray().forEach(jsonElement -> { @@ -182,7 +181,7 @@ public class LoomDependencyManager { ExternalModuleDependency modDep = (ExternalModuleDependency) project.getDependencies().create(name); modDep.setTransitive(false); - mcDepsConfig.getDependencies().add(modDep); + loaderDepsConfig.getDependencies().add(modDep); if (!extension.ideSync()) { apDepsConfig.getDependencies().add(modDep); diff --git a/src/main/java/net/fabricmc/loom/util/ModProcessor.java b/src/main/java/net/fabricmc/loom/util/ModProcessor.java index 01be5a15..75f5581d 100644 --- a/src/main/java/net/fabricmc/loom/util/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/util/ModProcessor.java @@ -136,7 +136,8 @@ public class ModProcessor { MappingsProvider mappingsProvider = extension.getMappingsProvider(); Path mc = mappedProvider.getIntermediaryJar().toPath(); - Path[] mcDeps = mappedProvider.getMapperPaths().stream().map(File::toPath).toArray(Path[]::new); + Path[] mcDeps = project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES).getFiles() + .stream().map(File::toPath).toArray(Path[]::new); List remapList = processList.stream().filter(ModDependencyInfo::requiresRemapping).collect(Collectors.toList()); diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 1f901aea..387990f9 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -214,7 +214,7 @@ public class SourceRemapper { Mercury m = new Mercury(); m.setGracefulClasspathChecks(true); - for (File file : project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles()) { + for (File file : project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES).getFiles()) { m.getClassPath().add(file.toPath()); } From b27bc3d39a1ee321ccdb573e0710261935582169 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 19:37:35 +0000 Subject: [PATCH 04/18] Use launcher metadata manifest v2. Closes #290 --- src/main/java/net/fabricmc/loom/util/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 7f779304..a07b8002 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -32,7 +32,7 @@ import org.objectweb.asm.Opcodes; 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 VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest.json"; + public static final String VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; From 9f6c8486fbaccf81d9dc73d3af9b8a76e87fdb47 Mon Sep 17 00:00:00 2001 From: user11681 <44427720+user11681@users.noreply.github.com> Date: Mon, 21 Dec 2020 19:44:39 +0000 Subject: [PATCH 05/18] Add nogui to server program arguments (#310) Closes #276 --- src/main/java/net/fabricmc/loom/util/RunConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/util/RunConfig.java b/src/main/java/net/fabricmc/loom/util/RunConfig.java index 74c98e1b..8fa9c1b7 100644 --- a/src/main/java/net/fabricmc/loom/util/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/util/RunConfig.java @@ -113,10 +113,9 @@ public class RunConfig { if ("launchwrapper".equals(extension.getLoaderLaunchMethod())) { runConfig.mainClass = "net.minecraft.launchwrapper.Launch"; - runConfig.programArgs = "--tweakClass " + ("client".equals(mode) ? Constants.LaunchWrapper.DEFAULT_FABRIC_CLIENT_TWEAKER : Constants.LaunchWrapper.DEFAULT_FABRIC_SERVER_TWEAKER); + runConfig.programArgs += "--tweakClass " + ("client".equals(mode) ? Constants.LaunchWrapper.DEFAULT_FABRIC_CLIENT_TWEAKER : Constants.LaunchWrapper.DEFAULT_FABRIC_SERVER_TWEAKER); } else { runConfig.mainClass = "net.fabricmc.devlaunchinjector.Main"; - runConfig.programArgs = ""; runConfig.vmArgs = "-Dfabric.dli.config=" + encodeEscaped(extension.getDevLauncherConfig().getAbsolutePath()) + " -Dfabric.dli.env=" + mode.toLowerCase(); } @@ -155,6 +154,7 @@ public class RunConfig { RunConfig ideaClient = new RunConfig(); ideaClient.configName = "Minecraft Client"; + ideaClient.programArgs = ""; populate(project, extension, ideaClient, "client"); ideaClient.vmArgs += getOSClientJVMArgs(); ideaClient.vmArgs += " -Dfabric.dli.main=" + getMainClass("client", extension); @@ -167,6 +167,7 @@ public class RunConfig { RunConfig ideaServer = new RunConfig(); ideaServer.configName = "Minecraft Server"; + ideaServer.programArgs = "nogui "; populate(project, extension, ideaServer, "server"); ideaServer.vmArgs += " -Dfabric.dli.main=" + getMainClass("server", extension); From 7e5053b0c501f786d8ca2cc7afa5b24ed7e90f1f Mon Sep 17 00:00:00 2001 From: Cool_Mineman <62723322+CoolMineman@users.noreply.github.com> Date: Mon, 21 Dec 2020 13:47:08 -0600 Subject: [PATCH 06/18] Respect reproducibleFileOrder and preserveFileTimestamps (#304) * Respect reproducibleFileOrder and preserveFileTimestamps * Also Respect On Sources Jars * java 8 * checkstyle * Please Rerun Actions --- .../net/fabricmc/loom/task/RemapJarTask.java | 14 +--- .../loom/task/RemapSourcesJarTask.java | 14 +++- .../loom/util/ModCompileRemapper.java | 2 +- .../fabricmc/loom/util/SourceRemapper.java | 8 +- .../loom/util/ZipReprocessorUtil.java | 79 +++++++++++++++++++ 5 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index dca964ca..af0e5031 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -48,6 +48,7 @@ import net.fabricmc.loom.util.GradleSupport; import net.fabricmc.loom.util.MixinRefmapHelper; import net.fabricmc.loom.util.NestedJars; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; +import net.fabricmc.loom.util.ZipReprocessorUtil; import net.fabricmc.loom.util.accesswidener.AccessWidenerJarProcessor; import net.fabricmc.loom.util.JarRemapper; import net.fabricmc.stitch.util.Pair; @@ -151,16 +152,9 @@ public class RemapJarTask extends Jar { } } - /*try { - if (modJar.exists()) { - Files.move(modJar, modJarUnmappedCopy); - extension.addUnmappedMod(modJarUnmappedCopy); - } - - Files.move(modJarOutput, modJar); - } catch (IOException e) { - throw new RuntimeException(e); - }*/ + if (isReproducibleFileOrder() || isPreserveFileTimestamps()) { + ZipReprocessorUtil.reprocessZip(output.toFile(), isReproducibleFileOrder(), isPreserveFileTimestamps()); + } } public void scheduleRemap() throws Throwable { diff --git a/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java index e518ad57..2d388fba 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java @@ -26,6 +26,8 @@ package net.fabricmc.loom.task; import java.io.File; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Internal; @@ -33,19 +35,29 @@ import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; import net.fabricmc.loom.util.SourceRemapper; +import net.fabricmc.loom.util.ZipReprocessorUtil; public class RemapSourcesJarTask extends AbstractLoomTask { private Object input; private Object output; private String direction = "intermediary"; private SourceRemapper sourceRemapper = null; + private final Property archivePreserveFileTimestamps; + private final Property archiveReproducibleFileOrder; + + public RemapSourcesJarTask() { + ObjectFactory objectFactory = getProject().getObjects(); + archivePreserveFileTimestamps = objectFactory.property(Boolean.class); + archiveReproducibleFileOrder = objectFactory.property(Boolean.class); + } @TaskAction public void remap() throws Exception { if (sourceRemapper == null) { SourceRemapper.remapSources(getProject(), getInput(), getOutput(), direction.equals("named")); + ZipReprocessorUtil.reprocessZip(getOutput(), archivePreserveFileTimestamps.getOrElse(true), archiveReproducibleFileOrder.getOrElse(false)); } else { - sourceRemapper.scheduleRemapSources(getInput(), getOutput()); + sourceRemapper.scheduleRemapSources(getInput(), getOutput(), archivePreserveFileTimestamps.getOrElse(true), archiveReproducibleFileOrder.getOrElse(false)); } } diff --git a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java index aa02c6d5..4652f7cd 100644 --- a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java @@ -164,7 +164,7 @@ public class ModCompileRemapper { if (!remappedSources.exists() || sources.lastModified() <= 0 || sources.lastModified() > remappedSources.lastModified() || refreshDeps) { try { - sourceRemapper.scheduleRemapSources(sources, remappedSources); + sourceRemapper.scheduleRemapSources(sources, remappedSources, false, true); // Depenedency sources are used in ide only so don't need to be reproducable // Set the remapped sources creation date to match the sources if we're likely succeeded in making it remappedSources.setLastModified(sources.lastModified()); diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 387990f9..36420d7f 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -62,15 +62,21 @@ public class SourceRemapper { public static void remapSources(Project project, File input, File output, boolean named) throws Exception { SourceRemapper sourceRemapper = new SourceRemapper(project, named); - sourceRemapper.scheduleRemapSources(input, output); + sourceRemapper.scheduleRemapSources(input, output, false, true); sourceRemapper.remapAll(); } + @Deprecated public void scheduleRemapSources(File source, File destination) throws Exception { + scheduleRemapSources(source, destination, false, true); // Not reproducable by default, old behavior + } + + public void scheduleRemapSources(File source, File destination, boolean reproducibleFileOrder, boolean preserveFileTimestamps) throws Exception { remapTasks.add((logger) -> { try { logger.progress("remapping sources - " + source.getName()); remapSourcesInner(source, destination); + ZipReprocessorUtil.reprocessZip(destination, reproducibleFileOrder, preserveFileTimestamps); } catch (Exception e) { throw new RuntimeException("Failed to remap sources for " + source, e); } diff --git a/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java b/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java new file mode 100644 index 00000000..662acf82 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java @@ -0,0 +1,79 @@ +/* + * 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 java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +public class ZipReprocessorUtil { + private ZipReprocessorUtil() { } + + public static void reprocessZip(File file, boolean reproducibleFileOrder, boolean preserveFileTimestamps) throws IOException { + if (!reproducibleFileOrder && preserveFileTimestamps) { + return; + } + + try (ZipFile zipFile = new ZipFile(file)) { + ZipEntry[] entries; + + if (reproducibleFileOrder) { + entries = zipFile.stream().sorted((a, b) -> a.getName().compareTo(b.getName())).toArray(ZipEntry[]::new); + } else { + entries = zipFile.stream().toArray(ZipEntry[]::new); + } + + ByteArrayOutputStream outZip = new ByteArrayOutputStream(zipFile.size()); + + try (ZipOutputStream zipOutputStream = new ZipOutputStream(outZip)) { + for (ZipEntry entry : entries) { + if (!preserveFileTimestamps) { + entry.setTime(0); + } + + zipOutputStream.putNextEntry(entry); + InputStream inputStream = zipFile.getInputStream(entry); + byte[] buf = new byte[1024]; + int length; + + while ((length = inputStream.read(buf)) > 0) { + zipOutputStream.write(buf, 0, length); + } + + zipOutputStream.closeEntry(); + } + } + + try (FileOutputStream fileOutputStream = new FileOutputStream(file)) { + outZip.writeTo(fileOutputStream); + } + } + } +} From c96396fb2732e76ee460be622b8ba928ee95f24e Mon Sep 17 00:00:00 2001 From: solonovamax Date: Mon, 21 Dec 2020 14:48:26 -0500 Subject: [PATCH 07/18] Fix genSources not working when root project doesnt have loom applied#308. (#309) loom now runs genSources on root project if the plugin exists in the root project, else it will build in the current project. Signed-off-by: solonovamax --- .../AbstractFernFlowerDecompiler.java | 76 ++++++++++--------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/decompilers/fernflower/AbstractFernFlowerDecompiler.java b/src/main/java/net/fabricmc/loom/decompilers/fernflower/AbstractFernFlowerDecompiler.java index 1d82c918..61dbaf07 100644 --- a/src/main/java/net/fabricmc/loom/decompilers/fernflower/AbstractFernFlowerDecompiler.java +++ b/src/main/java/net/fabricmc/loom/decompilers/fernflower/AbstractFernFlowerDecompiler.java @@ -99,46 +99,48 @@ public abstract class AbstractFernFlowerDecompiler implements LoomDecompiler { Map inUseLoggers = new HashMap<>(); progressGroup.started(); - ExecResult result = ForkingJavaExec.javaexec(project.getRootProject(), spec -> { - spec.setMain(fernFlowerExecutor().getName()); - spec.jvmArgs("-Xms200m", "-Xmx3G"); - spec.setArgs(args); - spec.setErrorOutput(System.err); - spec.setStandardOutput(new ConsumingOutputStream(line -> { - if (line.startsWith("Listening for transport") || !line.contains("::")) { - System.out.println(line); - return; - } - - int sepIdx = line.indexOf("::"); - String id = line.substring(0, sepIdx).trim(); - String data = line.substring(sepIdx + 2).trim(); - - ProgressLogger logger = inUseLoggers.get(id); - - String[] segs = data.split(" "); - - if (segs[0].equals("waiting")) { - if (logger != null) { - logger.progress("Idle.."); - inUseLoggers.remove(id); - freeLoggers.push(logger); - } - } else { - if (logger == null) { - if (!freeLoggers.isEmpty()) { - logger = freeLoggers.pop(); - } else { - logger = loggerFactory.get(); + ExecResult result = ForkingJavaExec.javaexec( + project.getRootProject().getPlugins().hasPlugin("fabric-loom") ? project.getRootProject() : project, + spec -> { + spec.setMain(fernFlowerExecutor().getName()); + spec.jvmArgs("-Xms200m", "-Xmx3G"); + spec.setArgs(args); + spec.setErrorOutput(System.err); + spec.setStandardOutput(new ConsumingOutputStream(line -> { + if (line.startsWith("Listening for transport") || !line.contains("::")) { + System.out.println(line); + return; } - inUseLoggers.put(id, logger); - } + int sepIdx = line.indexOf("::"); + String id = line.substring(0, sepIdx).trim(); + String data = line.substring(sepIdx + 2).trim(); - logger.progress(data); - } - })); - }); + ProgressLogger logger = inUseLoggers.get(id); + + String[] segs = data.split(" "); + + if (segs[0].equals("waiting")) { + if (logger != null) { + logger.progress("Idle.."); + inUseLoggers.remove(id); + freeLoggers.push(logger); + } + } else { + if (logger == null) { + if (!freeLoggers.isEmpty()) { + logger = freeLoggers.pop(); + } else { + logger = loggerFactory.get(); + } + + inUseLoggers.put(id, logger); + } + + logger.progress(data); + } + })); + }); inUseLoggers.values().forEach(ProgressLogger::completed); freeLoggers.forEach(ProgressLogger::completed); progressGroup.completed(); From 36954809ece363c690c9baebf9266ebe2f71876a Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 19:51:17 +0000 Subject: [PATCH 08/18] Update editorconfig to set import order, thanks to @user11681 --- .editorconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.editorconfig b/.editorconfig index 3cf20d90..d8e8a537 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,2 +1,4 @@ [*.{gradle,java}] indent_style = tab +ij_continuation_indent_size = 8 +ij_java_imports_layout = $*,|,java.**,|,*,|,net.fabricmc.** From e20993daf86a4716b8b28d1c51806ddffcae71d0 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 21 Dec 2020 20:42:23 +0000 Subject: [PATCH 09/18] Allow setting the RemapJarTask classpath. Closes #307 --- .../net/fabricmc/loom/task/RemapJarTask.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index af0e5031..3a8b271e 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -29,11 +29,10 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.LinkedHashSet; -import java.util.Set; import com.google.common.base.Preconditions; import org.gradle.api.Project; +import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; @@ -61,6 +60,7 @@ public class RemapJarTask extends Jar { private final Property addNestedDependencies; private final Property remapAccessWidener; public JarRemapper jarRemapper; + private FileCollection classpath; public RemapJarTask() { super(); @@ -95,10 +95,7 @@ public class RemapJarTask extends Jar { String fromM = "named"; String toM = "intermediary"; - Set classpathFiles = new LinkedHashSet<>( - project.getConfigurations().getByName("compileClasspath").getFiles() - ); - Path[] classpath = classpathFiles.stream().map(File::toPath).filter((p) -> !input.equals(p) && Files.exists(p)).toArray(Path[]::new); + Path[] classpath = getRemapClasspath(); TinyRemapper.Builder remapperBuilder = TinyRemapper.newRemapper(); @@ -173,16 +170,7 @@ public class RemapJarTask extends Jar { String toM = "intermediary"; if (extension.isRootProject()) { - Set classpathFiles = new LinkedHashSet<>( - project.getConfigurations().getByName("compileClasspath").getFiles() - ); - - Path[] classpath = classpathFiles.stream() - .map(File::toPath) - .filter(Files::exists) - .toArray(Path[]::new); - - jarRemapper.addToClasspath(classpath); + jarRemapper.addToClasspath(getRemapClasspath()); jarRemapper.addMappings(TinyRemapperMappingsHelper.create(mappingsProvider.getMappings(), fromM, toM, false)); } @@ -235,6 +223,19 @@ public class RemapJarTask extends Jar { }); } + private Path[] getRemapClasspath() { + FileCollection files = this.classpath; + + if (files == null) { + files = getProject().getConfigurations().getByName("compileClasspath"); + } + + return files.getFiles().stream() + .map(File::toPath) + .filter(Files::exists) + .toArray(Path[]::new); + } + @InputFile public RegularFileProperty getInput() { return input; @@ -249,4 +250,14 @@ public class RemapJarTask extends Jar { public Property getRemapAccessWidener() { return remapAccessWidener; } + + public RemapJarTask classpath(FileCollection collection) { + if (this.classpath == null) { + this.classpath = collection; + } else { + this.classpath = this.classpath.plus(collection); + } + + return this; + } } From b0860c36d64ddcbee39770af1f9fbb8370641bdd Mon Sep 17 00:00:00 2001 From: i509VCB Date: Mon, 21 Dec 2020 15:02:39 -0600 Subject: [PATCH 10/18] Add ability to specify additional tiny remapper options in remapJar (#292) * Add ability to specify additional tiny remapper options in remapJar * Imports go brr * Fix checkstyle Co-authored-by: modmuss50 --- .../net/fabricmc/loom/task/RemapJarTask.java | 16 ++++++++++++++++ .../java/net/fabricmc/loom/util/JarRemapper.java | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 3a8b271e..04522648 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -29,8 +29,11 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import com.google.common.base.Preconditions; +import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFileProperty; @@ -59,6 +62,7 @@ public class RemapJarTask extends Jar { private final RegularFileProperty input; private final Property addNestedDependencies; private final Property remapAccessWidener; + private final List> remapOptions = new ArrayList<>(); public JarRemapper jarRemapper; private FileCollection classpath; @@ -107,6 +111,11 @@ public class RemapJarTask extends Jar { } } + // Apply any requested options to tiny remapper + for (Action remapOption : this.remapOptions) { + remapOption.execute(remapperBuilder); + } + project.getLogger().lifecycle(":remapping " + input.getFileName()); StringBuilder rc = new StringBuilder("Remap classpath: "); @@ -181,6 +190,9 @@ public class RemapJarTask extends Jar { } } + // Add remap options to the jar remapper + jarRemapper.addOptions(this.remapOptions); + jarRemapper.scheduleRemap(input, output) .supplyAccessWidener((remapData, remapper) -> { if (getRemapAccessWidener().getOrElse(false) && extension.accessWidener != null) { @@ -251,6 +263,10 @@ public class RemapJarTask extends Jar { return remapAccessWidener; } + public void remapOptions(Action action) { + this.remapOptions.add(action); + } + public RemapJarTask classpath(FileCollection collection) { if (this.classpath == null) { this.classpath = collection; diff --git a/src/main/java/net/fabricmc/loom/util/JarRemapper.java b/src/main/java/net/fabricmc/loom/util/JarRemapper.java index bd070c56..1b7b841c 100644 --- a/src/main/java/net/fabricmc/loom/util/JarRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/JarRemapper.java @@ -34,6 +34,7 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import org.gradle.api.Action; import org.objectweb.asm.commons.Remapper; import net.fabricmc.stitch.util.Pair; @@ -46,6 +47,7 @@ public class JarRemapper { private final List mappingProviders = new ArrayList<>(); private final Set classPath = new HashSet<>(); private final List remapData = new ArrayList<>(); + private List> remapOptions; public void addMappings(IMappingProvider mappingProvider) { mappingProviders.add(mappingProvider); @@ -65,6 +67,12 @@ public class JarRemapper { TinyRemapper.Builder remapperBuilder = TinyRemapper.newRemapper(); mappingProviders.forEach(remapperBuilder::withMappings); + if (remapOptions != null) { + for (Action remapOption : remapOptions) { + remapOption.execute(remapperBuilder); + } + } + TinyRemapper remapper = remapperBuilder.build(); Path[] remapClasspath = classPath.stream() @@ -102,6 +110,10 @@ public class JarRemapper { remapData.forEach(RemapData::complete); } + public void addOptions(List> remapOptions) { + this.remapOptions = remapOptions; + } + public static class RemapData { public final Path input; public final Path output; From 03444f26b0fbcc6924440208c9e97f5cdfccdc0b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 24 Dec 2020 20:58:30 +0000 Subject: [PATCH 11/18] General code cleanup (#313) * First general cleanup pass * Review feedback * Fix build * Fix tests --- .editorconfig | 2 +- build.gradle | 3 + .../fabricmc/loom/LoomGradleExtension.java | 25 ++- .../net/fabricmc/loom/LoomGradlePlugin.java | 135 +++--------- .../loom/{util => build}/JarRemapper.java | 2 +- .../{util => build}/MixinRefmapHelper.java | 2 +- .../{util => build}/ModCompileRemapper.java | 10 +- .../loom/{util => build}/NestedJars.java | 15 +- .../mixin/AnnotationProcessorInvoker.java | 2 +- .../{util => build}/mixin/JavaApInvoker.java | 2 +- .../{util => build}/mixin/KaptApInvoker.java | 2 +- .../{util => build}/mixin/ScalaApInvoker.java | 2 +- .../CompileConfiguration.java} | 198 ++++-------------- .../DependencyProvider.java | 2 +- .../FabricApiExtension.java | 3 +- .../LoomDependencyManager.java | 10 +- .../loom/configuration/MavenPublication.java | 119 +++++++++++ .../RemappedConfigurationEntry.java | 2 +- .../AccessWidenerJarProcessor.java | 8 +- .../ide/IdeConfiguration.java} | 31 ++- .../ide}/RunConfig.java | 12 +- .../ide}/SetupIntelijRunConfigs.java | 6 +- .../mods}/ModProcessor.java | 15 +- .../processors/JarProcessor.java | 2 +- .../processors/JarProcessorManager.java | 2 +- .../MinecraftProcessedProvider.java | 8 +- .../dependency/ModDependencyInfo.java | 4 +- .../processors/dependency/RemapData.java | 2 +- .../providers/LaunchProvider.java | 6 +- .../providers/MinecraftProvider.java | 9 +- .../providers/mappings}/MappingsCache.java | 2 +- .../providers/mappings}/MappingsProvider.java | 12 +- .../mappings/MojangMappingsDependency.java | 4 +- .../providers/minecraft}/ManifestVersion.java | 2 +- .../minecraft}/MinecraftLibraryProvider.java | 4 +- .../minecraft}/MinecraftMappedProvider.java | 8 +- .../minecraft}/MinecraftNativesProvider.java | 6 +- .../minecraft}/MinecraftVersionInfo.java | 5 +- .../minecraft}/assets/AssetIndex.java | 2 +- .../minecraft}/assets/AssetObject.java | 2 +- .../assets}/MinecraftAssetsProvider.java | 9 +- .../DecompilerConfiguration.java} | 29 +-- .../LineNumberRemapper.java | 5 +- .../fabricmc/loom/task/AbstractRunTask.java | 2 +- .../loom/task/DownloadAssetsTask.java | 4 +- .../loom/task/GenEclipseRunsTask.java | 2 +- .../loom/task/GenIdeaProjectTask.java | 12 +- .../loom/task/GenVsCodeProjectTask.java | 2 +- .../loom/task/GenerateSourcesTask.java | 33 ++- .../net/fabricmc/loom/task/LoomTasks.java | 108 ++++++++++ .../loom/task/MigrateMappingsTask.java | 6 +- .../net/fabricmc/loom/task/RemapJarTask.java | 12 +- .../net/fabricmc/loom/task/RunClientTask.java | 2 +- .../net/fabricmc/loom/task/RunServerTask.java | 2 +- .../net/fabricmc/loom/util/Constants.java | 2 + .../net/fabricmc/loom/util/DownloadUtil.java | 6 +- .../fabricmc/loom/util/SourceRemapper.java | 7 +- .../loom/util/{ => gradle}/GradleSupport.java | 2 +- .../{progress => gradle}/ProgressLogger.java | 2 +- 59 files changed, 498 insertions(+), 437 deletions(-) rename src/main/java/net/fabricmc/loom/{util => build}/JarRemapper.java (99%) rename src/main/java/net/fabricmc/loom/{util => build}/MixinRefmapHelper.java (99%) rename src/main/java/net/fabricmc/loom/{util => build}/ModCompileRemapper.java (95%) rename src/main/java/net/fabricmc/loom/{util => build}/NestedJars.java (99%) rename src/main/java/net/fabricmc/loom/{util => build}/mixin/AnnotationProcessorInvoker.java (99%) rename src/main/java/net/fabricmc/loom/{util => build}/mixin/JavaApInvoker.java (98%) rename src/main/java/net/fabricmc/loom/{util => build}/mixin/KaptApInvoker.java (99%) rename src/main/java/net/fabricmc/loom/{util => build}/mixin/ScalaApInvoker.java (98%) rename src/main/java/net/fabricmc/loom/{AbstractPlugin.java => configuration/CompileConfiguration.java} (63%) rename src/main/java/net/fabricmc/loom/{util => configuration}/DependencyProvider.java (99%) rename src/main/java/net/fabricmc/loom/{util => configuration}/FabricApiExtension.java (98%) rename src/main/java/net/fabricmc/loom/{util => configuration}/LoomDependencyManager.java (95%) create mode 100644 src/main/java/net/fabricmc/loom/configuration/MavenPublication.java rename src/main/java/net/fabricmc/loom/{util => configuration}/RemappedConfigurationEntry.java (98%) rename src/main/java/net/fabricmc/loom/{util => configuration}/accesswidener/AccessWidenerJarProcessor.java (98%) rename src/main/java/net/fabricmc/loom/{task/CleanLoomMappings.java => configuration/ide/IdeConfiguration.java} (60%) rename src/main/java/net/fabricmc/loom/{util => configuration/ide}/RunConfig.java (97%) rename src/main/java/net/fabricmc/loom/{util => configuration/ide}/SetupIntelijRunConfigs.java (93%) rename src/main/java/net/fabricmc/loom/{util => configuration/mods}/ModProcessor.java (94%) rename src/main/java/net/fabricmc/loom/{ => configuration}/processors/JarProcessor.java (96%) rename src/main/java/net/fabricmc/loom/{ => configuration}/processors/JarProcessorManager.java (97%) rename src/main/java/net/fabricmc/loom/{ => configuration}/processors/MinecraftProcessedProvider.java (92%) rename src/main/java/net/fabricmc/loom/{ => configuration}/processors/dependency/ModDependencyInfo.java (97%) rename src/main/java/net/fabricmc/loom/{ => configuration}/processors/dependency/RemapData.java (95%) rename src/main/java/net/fabricmc/loom/{ => configuration}/providers/LaunchProvider.java (97%) rename src/main/java/net/fabricmc/loom/{ => configuration}/providers/MinecraftProvider.java (95%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/mappings}/MappingsCache.java (97%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/mappings}/MappingsProvider.java (96%) rename src/main/java/net/fabricmc/loom/{util => configuration/providers}/mappings/MojangMappingsDependency.java (98%) rename src/main/java/net/fabricmc/loom/{util => configuration/providers/minecraft}/ManifestVersion.java (95%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/minecraft}/MinecraftLibraryProvider.java (95%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/minecraft}/MinecraftMappedProvider.java (96%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/minecraft}/MinecraftNativesProvider.java (95%) rename src/main/java/net/fabricmc/loom/{util => configuration/providers/minecraft}/MinecraftVersionInfo.java (97%) rename src/main/java/net/fabricmc/loom/{util => configuration/providers/minecraft}/assets/AssetIndex.java (96%) rename src/main/java/net/fabricmc/loom/{util => configuration/providers/minecraft}/assets/AssetObject.java (96%) rename src/main/java/net/fabricmc/loom/{providers => configuration/providers/minecraft/assets}/MinecraftAssetsProvider.java (95%) rename src/main/java/net/fabricmc/loom/{task/CleanLoomBinaries.java => decompilers/DecompilerConfiguration.java} (65%) rename src/main/java/net/fabricmc/loom/{util => decompilers}/LineNumberRemapper.java (97%) create mode 100644 src/main/java/net/fabricmc/loom/task/LoomTasks.java rename src/main/java/net/fabricmc/loom/util/{ => gradle}/GradleSupport.java (98%) rename src/main/java/net/fabricmc/loom/util/{progress => gradle}/ProgressLogger.java (99%) diff --git a/.editorconfig b/.editorconfig index d8e8a537..996493f3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ [*.{gradle,java}] indent_style = tab ij_continuation_indent_size = 8 -ij_java_imports_layout = $*,|,java.**,|,*,|,net.fabricmc.** +ij_java_imports_layout = $*,|,java.**,|,javax.**,|,*,|,net.fabricmc.** diff --git a/build.gradle b/build.gradle index 9de53ac1..55b8ce6f 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,9 @@ dependencies { testImplementation('org.spockframework:spock-core:1.3-groovy-2.4') { exclude module: 'groovy-all' } + + compileOnly 'org.jetbrains:annotations:20.1.0' + } jar { diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 74fa23a8..dfbcf8da 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -38,8 +38,6 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import javax.annotation.Nullable; - import com.google.gson.JsonObject; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.mercury.Mercury; @@ -48,15 +46,16 @@ import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.plugins.BasePluginConvention; +import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.api.decompilers.LoomDecompiler; -import net.fabricmc.loom.processors.JarProcessor; -import net.fabricmc.loom.processors.JarProcessorManager; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.MinecraftMappedProvider; -import net.fabricmc.loom.providers.MinecraftProvider; -import net.fabricmc.loom.util.LoomDependencyManager; -import net.fabricmc.loom.util.mappings.MojangMappingsDependency; +import net.fabricmc.loom.configuration.LoomDependencyManager; +import net.fabricmc.loom.configuration.processors.JarProcessor; +import net.fabricmc.loom.configuration.processors.JarProcessorManager; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.configuration.providers.mappings.MojangMappingsDependency; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; public class LoomGradleExtension { public String runDir = "run"; @@ -116,7 +115,7 @@ public class LoomGradleExtension { public LoomGradleExtension(Project project) { this.project = project; - this.autoGenIDERuns = AbstractPlugin.isRootProject(project); + this.autoGenIDERuns = isRootProject(); this.unmappedMods = project.files(); } @@ -281,7 +280,7 @@ public class LoomGradleExtension { Project p = this.project; T result; - while (!AbstractPlugin.isRootProject(p)) { + while (!isRootProject()) { if ((result = projectTFunction.apply(p)) != null) { return result; } @@ -425,4 +424,8 @@ public class LoomGradleExtension { public Set getAllMixinMappings() { return Collections.unmodifiableSet(mixinMappings); } + + public List getDecompilers() { + return decompilers; + } } diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index 735f2799..e9486d43 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -24,118 +24,47 @@ package net.fabricmc.loom; -import java.io.File; -import java.util.Locale; - +import com.google.common.collect.ImmutableMap; +import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.tasks.TaskContainer; -import net.fabricmc.loom.api.decompilers.LoomDecompiler; -import net.fabricmc.loom.decompilers.cfr.FabricCFRDecompiler; -import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.task.CleanEclipseRunsTask; -import net.fabricmc.loom.task.CleanLoomBinaries; -import net.fabricmc.loom.task.CleanLoomMappings; -import net.fabricmc.loom.task.DownloadAssetsTask; -import net.fabricmc.loom.task.GenEclipseRunsTask; -import net.fabricmc.loom.task.GenIdeaProjectTask; -import net.fabricmc.loom.task.GenVsCodeProjectTask; -import net.fabricmc.loom.task.GenerateSourcesTask; -import net.fabricmc.loom.task.MigrateMappingsTask; -import net.fabricmc.loom.task.RemapJarTask; -import net.fabricmc.loom.task.RemapSourcesJarTask; -import net.fabricmc.loom.task.RunClientTask; -import net.fabricmc.loom.task.RunServerTask; +import net.fabricmc.loom.configuration.CompileConfiguration; +import net.fabricmc.loom.configuration.FabricApiExtension; +import net.fabricmc.loom.configuration.MavenPublication; +import net.fabricmc.loom.configuration.ide.IdeConfiguration; +import net.fabricmc.loom.configuration.providers.mappings.MappingsCache; +import net.fabricmc.loom.decompilers.DecompilerConfiguration; +import net.fabricmc.loom.task.LoomTasks; -public class LoomGradlePlugin extends AbstractPlugin { - public static File getMappedByproduct(Project project, String suffix) { - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - MappingsProvider mappingsProvider = extension.getMappingsProvider(); - File mappedJar = mappingsProvider.mappedProvider.getMappedJar(); - String path = mappedJar.getAbsolutePath(); - - if (!path.toLowerCase(Locale.ROOT).endsWith(".jar")) { - throw new RuntimeException("Invalid mapped JAR path: " + path); - } - - return new File(path.substring(0, path.length() - 4) + suffix); - } +public class LoomGradlePlugin implements Plugin { + public static boolean refreshDeps; @Override - public void apply(Project target) { - super.apply(target); + public void apply(Project project) { + project.getLogger().lifecycle("Fabric Loom: " + LoomGradlePlugin.class.getPackage().getImplementationVersion()); - TaskContainer tasks = target.getTasks(); + refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); - tasks.register("cleanLoomBinaries", CleanLoomBinaries.class, t -> t.setDescription("Removes binary jars created by Loom.")); - tasks.register("cleanLoomMappings", CleanLoomMappings.class, t -> t.setDescription("Removes mappings downloaded by Loom.")); + if (refreshDeps) { + MappingsCache.INSTANCE.invalidate(); + project.getLogger().lifecycle("Refresh dependencies is in use, loom will be significantly slower."); + } - tasks.register("cleanLoom").configure(task -> { - task.setGroup("fabric"); - task.setDescription("Runs all Loom cleanup tasks."); - task.dependsOn(tasks.getByName("cleanLoomBinaries")); - task.dependsOn(tasks.getByName("cleanLoomMappings")); - }); + // Apply default plugins + project.apply(ImmutableMap.of("plugin", "java")); + project.apply(ImmutableMap.of("plugin", "eclipse")); + project.apply(ImmutableMap.of("plugin", "idea")); - tasks.register("migrateMappings", MigrateMappingsTask.class, t -> { - t.setDescription("Migrates mappings to a new version."); - t.getOutputs().upToDateWhen((o) -> false); - }); + // Setup extensions, loom shadows minecraft + project.getExtensions().create("minecraft", LoomGradleExtension.class, project); + project.getExtensions().add("loom", project.getExtensions().getByName("minecraft")); + project.getExtensions().create("fabricApi", FabricApiExtension.class, project); - tasks.register("remapJar", RemapJarTask.class, t -> { - t.setDescription("Remaps the built project jar to intermediary mappings."); - t.setGroup("fabric"); - }); - - tasks.register("downloadAssets", DownloadAssetsTask.class, t -> t.setDescription("Downloads required assets for Fabric.")); - - tasks.register("genIdeaWorkspace", GenIdeaProjectTask.class, t -> { - t.setDescription("Generates an IntelliJ IDEA workspace from this project."); - t.dependsOn("idea", "downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("genEclipseRuns", GenEclipseRunsTask.class, t -> { - t.setDescription("Generates Eclipse run configurations for this project."); - t.dependsOn("downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("cleanEclipseRuns", CleanEclipseRunsTask.class, t -> { - t.setDescription("Removes Eclipse run configurations for this project."); - t.setGroup("ide"); - }); - - tasks.register("vscode", GenVsCodeProjectTask.class, t -> { - t.setDescription("Generates VSCode launch configurations."); - t.dependsOn("downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("remapSourcesJar", RemapSourcesJarTask.class, t -> t.setDescription("Remaps the project sources jar to intermediary names.")); - - tasks.register("runClient", RunClientTask.class, t -> { - t.setDescription("Starts a development version of the Minecraft client."); - t.dependsOn("downloadAssets"); - t.setGroup("fabric"); - }); - - tasks.register("runServer", RunServerTask.class, t -> { - t.setDescription("Starts a development version of the Minecraft server."); - t.setGroup("fabric"); - }); - - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - extension.addDecompiler(new FabricFernFlowerDecompiler(project)); - extension.addDecompiler(new FabricCFRDecompiler(project)); - - project.afterEvaluate((p) -> { - for (LoomDecompiler decompiler : extension.decompilers) { - String taskName = (decompiler instanceof FabricFernFlowerDecompiler) ? "genSources" : "genSourcesWith" + decompiler.name(); - // decompiler will be passed to the constructor of GenerateSourcesTask - tasks.register(taskName, GenerateSourcesTask.class, decompiler); - } - }); + CompileConfiguration.setupConfigurations(project); + IdeConfiguration.setup(project); + CompileConfiguration.configureCompile(project); + MavenPublication.configure(project); + LoomTasks.registerTasks(project); + DecompilerConfiguration.setup(project); } } diff --git a/src/main/java/net/fabricmc/loom/util/JarRemapper.java b/src/main/java/net/fabricmc/loom/build/JarRemapper.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/JarRemapper.java rename to src/main/java/net/fabricmc/loom/build/JarRemapper.java index 1b7b841c..17896428 100644 --- a/src/main/java/net/fabricmc/loom/util/JarRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/JarRemapper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.IOException; import java.nio.file.Path; diff --git a/src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java rename to src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java index a48cc2d8..dd90e2fa 100644 --- a/src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java +++ b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; diff --git a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java similarity index 95% rename from src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java rename to src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 4652f7cd..eb9d87e0 100644 --- a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; @@ -45,8 +45,12 @@ import org.gradle.jvm.JvmLibrary; import org.gradle.language.base.artifact.SourcesArtifact; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.processors.dependency.ModDependencyInfo; -import net.fabricmc.loom.processors.dependency.RemapData; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; +import net.fabricmc.loom.configuration.mods.ModProcessor; +import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; +import net.fabricmc.loom.configuration.processors.dependency.RemapData; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.SourceRemapper; public class ModCompileRemapper { public static void remapDependencies(Project project, String mappingsSuffix, LoomGradleExtension extension, SourceRemapper sourceRemapper) { diff --git a/src/main/java/net/fabricmc/loom/util/NestedJars.java b/src/main/java/net/fabricmc/loom/build/NestedJars.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/NestedJars.java rename to src/main/java/net/fabricmc/loom/build/NestedJars.java index 2d57c8c0..c088af47 100644 --- a/src/main/java/net/fabricmc/loom/util/NestedJars.java +++ b/src/main/java/net/fabricmc/loom/build/NestedJars.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; @@ -41,24 +41,25 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; -import org.gradle.api.artifacts.ResolvedConfiguration; +import org.gradle.api.Project; +import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ResolvedDependency; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.DependencySet; import org.gradle.api.artifacts.ProjectDependency; import org.gradle.api.artifacts.ResolvedArtifact; -import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.artifacts.ResolvedConfiguration; +import org.gradle.api.artifacts.ResolvedDependency; +import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.zeroturnaround.zip.FileSource; import org.zeroturnaround.zip.ZipEntrySource; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; -import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.tasks.bundling.AbstractArchiveTask; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.task.RemapJarTask; +import net.fabricmc.loom.util.Constants; public class NestedJars { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); diff --git a/src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java index 2d7934d7..ecdaf152 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.io.IOException; diff --git a/src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java index 8ec52158..2e52d0d7 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.util.List; diff --git a/src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java index 8d6d1d17..668a7741 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.io.IOException; diff --git a/src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java index ba1ad823..7fed5610 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java similarity index 63% rename from src/main/java/net/fabricmc/loom/AbstractPlugin.java rename to src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 4c1b70a4..836b3207 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -22,93 +22,50 @@ * SOFTWARE. */ -package net.fabricmc.loom; +package net.fabricmc.loom.configuration; import java.io.IOException; -import java.util.HashSet; import java.util.Map; -import java.util.Optional; import java.util.Set; -import com.google.common.collect.ImmutableMap; -import groovy.util.Node; -import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.UnknownTaskException; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.Dependency; -import org.gradle.api.artifacts.ExcludeRule; -import org.gradle.api.artifacts.ModuleDependency; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.publish.Publication; -import org.gradle.api.publish.PublishingExtension; -import org.gradle.api.publish.maven.MavenPublication; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.javadoc.Javadoc; -import org.gradle.plugins.ide.idea.model.IdeaModel; -import net.fabricmc.loom.providers.LaunchProvider; -import net.fabricmc.loom.providers.MappingsCache; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.MinecraftProvider; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.build.JarRemapper; +import net.fabricmc.loom.build.NestedJars; +import net.fabricmc.loom.build.mixin.JavaApInvoker; +import net.fabricmc.loom.build.mixin.KaptApInvoker; +import net.fabricmc.loom.build.mixin.ScalaApInvoker; +import net.fabricmc.loom.configuration.ide.SetupIntelijRunConfigs; +import net.fabricmc.loom.configuration.providers.LaunchProvider; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; import net.fabricmc.loom.task.AbstractLoomTask; +import net.fabricmc.loom.task.RemapAllSourcesTask; import net.fabricmc.loom.task.RemapJarTask; import net.fabricmc.loom.task.RemapSourcesJarTask; -import net.fabricmc.loom.task.RemapAllSourcesTask; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.FabricApiExtension; -import net.fabricmc.loom.util.GroovyXmlUtil; -import net.fabricmc.loom.util.LoomDependencyManager; -import net.fabricmc.loom.util.NestedJars; -import net.fabricmc.loom.util.RemappedConfigurationEntry; -import net.fabricmc.loom.util.SetupIntelijRunConfigs; -import net.fabricmc.loom.util.mixin.JavaApInvoker; -import net.fabricmc.loom.util.mixin.KaptApInvoker; -import net.fabricmc.loom.util.mixin.ScalaApInvoker; import net.fabricmc.loom.util.SourceRemapper; -import net.fabricmc.loom.util.JarRemapper; -public class AbstractPlugin implements Plugin { - protected Project project; - - public static boolean isRootProject(Project project) { - return project.getRootProject() == project; +/** + * Add Minecraft dependencies to compile time. + */ +public final class CompileConfiguration { + private CompileConfiguration() { } - private void extendsFrom(String a, String b) { - project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); - } - - @Override - public void apply(Project target) { - this.project = target; - - project.getLogger().lifecycle("Fabric Loom: " + AbstractPlugin.class.getPackage().getImplementationVersion()); - - boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); - DownloadUtil.refreshDeps = refreshDeps; - - if (refreshDeps) { - MappingsCache.INSTANCE.invalidate(); - project.getLogger().lifecycle("Refresh dependencies is in use, loom will be significantly slower."); - } - - // Apply default plugins - project.apply(ImmutableMap.of("plugin", "java")); - project.apply(ImmutableMap.of("plugin", "eclipse")); - project.apply(ImmutableMap.of("plugin", "idea")); - - project.getExtensions().create("minecraft", LoomGradleExtension.class, project); - project.getExtensions().add("loom", project.getExtensions().getByName("minecraft")); - project.getExtensions().create("fabricApi", FabricApiExtension.class, project); - + public static void setupConfigurations(Project project) { // Force add Mojang repository - addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); + addMavenRepo(project, "Mojang", "https://libraries.minecraft.net/"); Configuration modCompileClasspathConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MOD_COMPILE_CLASSPATH); modCompileClasspathConfig.setTransitive(true); @@ -136,31 +93,23 @@ public class AbstractPlugin implements Plugin { Configuration compileModsMappedConfig = project.getConfigurations().maybeCreate(entry.getRemappedConfiguration()); compileModsMappedConfig.setTransitive(false); // Don't get transitive deps of already remapped mods - extendsFrom(entry.getTargetConfiguration(project.getConfigurations()), entry.getRemappedConfiguration()); + extendsFrom(entry.getTargetConfiguration(project.getConfigurations()), entry.getRemappedConfiguration(), project); if (entry.isOnModCompileClasspath()) { - extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.getSourceConfiguration()); - extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration()); + extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.getSourceConfiguration(), project); + extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration(), project); } } - extendsFrom("compileClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("runtimeClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("testCompileClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("testRuntimeClasspath", Constants.Configurations.MINECRAFT_NAMED); + extendsFrom(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); - extendsFrom(Constants.Configurations.LOADER_DEPENDENCIES, Constants.Configurations.MINECRAFT_DEPENDENCIES); - extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.LOADER_DEPENDENCIES); + extendsFrom(Constants.Configurations.LOADER_DEPENDENCIES, Constants.Configurations.MINECRAFT_DEPENDENCIES, project); + extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.LOADER_DEPENDENCIES, project); - extendsFrom("compile", Constants.Configurations.MAPPINGS_FINAL); - - configureIDEs(); - configureCompile(); - configureMaven(); - } - - public Project getProject() { - return project; + extendsFrom(JavaPlugin.COMPILE_CONFIGURATION_NAME, Constants.Configurations.MAPPINGS_FINAL, project); } /** @@ -171,30 +120,14 @@ public class AbstractPlugin implements Plugin { * @param url The URL of the repository * @return An object containing the name and the URL of the repository that can be modified later */ - public MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) { + public static MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) { return target.getRepositories().maven(repo -> { repo.setName(name); repo.setUrl(url); }); } - /** - * Add Minecraft dependencies to IDE dependencies. - */ - protected void configureIDEs() { - // IDEA - IdeaModel ideaModel = (IdeaModel) project.getExtensions().getByName("idea"); - - ideaModel.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles()); - ideaModel.getModule().setDownloadJavadoc(true); - ideaModel.getModule().setDownloadSources(true); - ideaModel.getModule().setInheritOutputDirs(true); - } - - /** - * Add Minecraft dependencies to compile time. - */ - protected void configureCompile() { + public static void configureCompile(Project project) { JavaPluginConvention javaModule = (JavaPluginConvention) project.getConvention().getPlugins().get("java"); SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); @@ -231,9 +164,9 @@ public class AbstractPlugin implements Plugin { LoomDependencyManager dependencyManager = new LoomDependencyManager(); extension.setDependencyManager(dependencyManager); - dependencyManager.addProvider(new MinecraftProvider(getProject())); - dependencyManager.addProvider(new MappingsProvider(getProject())); - dependencyManager.addProvider(new LaunchProvider(getProject())); + dependencyManager.addProvider(new MinecraftProvider(project)); + dependencyManager.addProvider(new MappingsProvider(project)); + dependencyManager.addProvider(new LaunchProvider(project)); dependencyManager.handleDependencies(project1); @@ -365,66 +298,7 @@ public class AbstractPlugin implements Plugin { } } - protected void configureMaven() { - project.afterEvaluate((p) -> { - for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { - if (!entry.hasMavenScope()) { - continue; - } - - Configuration compileModsConfig = p.getConfigurations().getByName(entry.getSourceConfiguration()); - - // add modsCompile to maven-publish - PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class); - - if (mavenPublish != null) { - mavenPublish.publications((publications) -> { - for (Publication publication : publications) { - if (publication instanceof MavenPublication) { - ((MavenPublication) publication).pom((pom) -> pom.withXml((xml) -> { - Node dependencies = GroovyXmlUtil.getOrCreateNode(xml.asNode(), "dependencies"); - Set foundArtifacts = new HashSet<>(); - - GroovyXmlUtil.childrenNodesStream(dependencies).filter((n) -> "dependency".equals(n.name())).forEach((n) -> { - Optional groupId = GroovyXmlUtil.getNode(n, "groupId"); - Optional artifactId = GroovyXmlUtil.getNode(n, "artifactId"); - - if (groupId.isPresent() && artifactId.isPresent()) { - foundArtifacts.add(groupId.get().text() + ":" + artifactId.get().text()); - } - }); - - for (Dependency dependency : compileModsConfig.getAllDependencies()) { - if (foundArtifacts.contains(dependency.getGroup() + ":" + dependency.getName())) { - continue; - } - - Node depNode = dependencies.appendNode("dependency"); - depNode.appendNode("groupId", dependency.getGroup()); - depNode.appendNode("artifactId", dependency.getName()); - depNode.appendNode("version", dependency.getVersion()); - depNode.appendNode("scope", entry.getMavenScope()); - - if (dependency instanceof ModuleDependency) { - final Set exclusions = ((ModuleDependency) dependency).getExcludeRules(); - - if (!exclusions.isEmpty()) { - Node exclusionsNode = depNode.appendNode("exclusions"); - - for (ExcludeRule rule : exclusions) { - Node exclusionNode = exclusionsNode.appendNode("exclusion"); - exclusionNode.appendNode("groupId", rule.getGroup() == null ? "*" : rule.getGroup()); - exclusionNode.appendNode("artifactId", rule.getModule() == null ? "*" : rule.getModule()); - } - } - } - } - })); - } - } - }); - } - } - }); + private static void extendsFrom(String a, String b, Project project) { + project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); } } diff --git a/src/main/java/net/fabricmc/loom/util/DependencyProvider.java b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/DependencyProvider.java rename to src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java index 10da3424..4b1b800f 100644 --- a/src/main/java/net/fabricmc/loom/util/DependencyProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/net/fabricmc/loom/util/FabricApiExtension.java b/src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/FabricApiExtension.java rename to src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java index 71cf0e62..a09262cd 100644 --- a/src/main/java/net/fabricmc/loom/util/FabricApiExtension.java +++ b/src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.io.IOException; @@ -40,6 +40,7 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.DownloadUtil; public class FabricApiExtension { private final Project project; diff --git a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java similarity index 95% rename from src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java rename to src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index 755992e5..2bd1fb54 100644 --- a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.util.ArrayList; @@ -39,8 +39,12 @@ import org.gradle.api.artifacts.ExternalModuleDependency; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.util.DependencyProvider.DependencyInfo; +import net.fabricmc.loom.build.ModCompileRemapper; +import net.fabricmc.loom.configuration.DependencyProvider.DependencyInfo; +import net.fabricmc.loom.configuration.mods.ModProcessor; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.SourceRemapper; public class LoomDependencyManager { private static class ProviderList { diff --git a/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java b/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java new file mode 100644 index 00000000..92acad95 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java @@ -0,0 +1,119 @@ +/* + * 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.configuration; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import groovy.util.Node; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.ExcludeRule; +import org.gradle.api.artifacts.ModuleDependency; +import org.gradle.api.publish.Publication; +import org.gradle.api.publish.PublishingExtension; + +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.GroovyXmlUtil; + +public final class MavenPublication { + private MavenPublication() { + } + + public static void configure(Project project) { + project.afterEvaluate((p) -> { + for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { + if (!entry.hasMavenScope()) { + continue; + } + + Configuration compileModsConfig = p.getConfigurations().getByName(entry.getSourceConfiguration()); + + // add modsCompile to maven-publish + PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class); + + if (mavenPublish != null) { + processEntry(entry, compileModsConfig, mavenPublish); + } + } + }); + } + + private static void processEntry(RemappedConfigurationEntry entry, Configuration compileModsConfig, PublishingExtension mavenPublish) { + mavenPublish.publications((publications) -> { + for (Publication publication : publications) { + if (!(publication instanceof org.gradle.api.publish.maven.MavenPublication)) { + continue; + } + + ((org.gradle.api.publish.maven.MavenPublication) publication).pom((pom) -> pom.withXml((xml) -> { + Node dependencies = GroovyXmlUtil.getOrCreateNode(xml.asNode(), "dependencies"); + Set foundArtifacts = new HashSet<>(); + + GroovyXmlUtil.childrenNodesStream(dependencies).filter((n) -> "dependency".equals(n.name())).forEach((n) -> { + Optional groupId = GroovyXmlUtil.getNode(n, "groupId"); + Optional artifactId = GroovyXmlUtil.getNode(n, "artifactId"); + + if (groupId.isPresent() && artifactId.isPresent()) { + foundArtifacts.add(groupId.get().text() + ":" + artifactId.get().text()); + } + }); + + for (Dependency dependency : compileModsConfig.getAllDependencies()) { + if (foundArtifacts.contains(dependency.getGroup() + ":" + dependency.getName())) { + continue; + } + + Node depNode = dependencies.appendNode("dependency"); + depNode.appendNode("groupId", dependency.getGroup()); + depNode.appendNode("artifactId", dependency.getName()); + depNode.appendNode("version", dependency.getVersion()); + depNode.appendNode("scope", entry.getMavenScope()); + + if (!(dependency instanceof ModuleDependency)) { + continue; + } + + final Set exclusions = ((ModuleDependency) dependency).getExcludeRules(); + + if (exclusions.isEmpty()) { + continue; + } + + Node exclusionsNode = depNode.appendNode("exclusions"); + + for (ExcludeRule rule : exclusions) { + Node exclusionNode = exclusionsNode.appendNode("exclusion"); + exclusionNode.appendNode("groupId", rule.getGroup() == null ? "*" : rule.getGroup()); + exclusionNode.appendNode("artifactId", rule.getModule() == null ? "*" : rule.getModule()); + } + } + })); + } + }); + } +} diff --git a/src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java b/src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java rename to src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java index 767c3a85..2b0949d5 100644 --- a/src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java +++ b/src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import org.gradle.api.artifacts.ConfigurationContainer; diff --git a/src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java rename to src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java index aa02c2d1..64241eaf 100644 --- a/src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.accesswidener; +package net.fabricmc.loom.configuration.accesswidener; import java.io.BufferedReader; import java.io.File; @@ -48,14 +48,14 @@ import org.zeroturnaround.zip.transform.ZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; import net.fabricmc.accesswidener.AccessWidener; -import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerReader; +import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerVisitor; import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.processors.JarProcessor; -import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.util.Checksum; +import net.fabricmc.loom.util.Constants; import net.fabricmc.tinyremapper.TinyRemapper; public class AccessWidenerJarProcessor implements JarProcessor { diff --git a/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java b/src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java similarity index 60% rename from src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java rename to src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java index 57c71152..364981c1 100644 --- a/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java @@ -22,28 +22,21 @@ * SOFTWARE. */ -package net.fabricmc.loom.task; +package net.fabricmc.loom.configuration.ide; -import java.io.IOException; -import java.nio.file.Files; +import org.gradle.api.Project; +import org.gradle.plugins.ide.idea.model.IdeaModel; -import org.gradle.api.tasks.TaskAction; +public final class IdeConfiguration { + private IdeConfiguration() { + } -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.DeletingFileVisitor; + public static void setup(Project project) { + IdeaModel ideaModel = (IdeaModel) project.getExtensions().getByName("idea"); -public class CleanLoomMappings extends AbstractLoomTask { - @TaskAction - public void run() { - try { - LoomGradleExtension extension = getExtension(); - extension.getMappingsProvider().clean(); - extension.getMinecraftMappedProvider().getIntermediaryJar().delete(); - extension.getMinecraftMappedProvider().getMappedJar().delete(); - Files.walkFileTree(extension.getRootProjectBuildCache().toPath(), new DeletingFileVisitor()); - getExtension().getMappingsProvider().cleanFiles(); - } catch (IOException e) { - throw new RuntimeException(e); - } + ideaModel.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles()); + ideaModel.getModule().setDownloadJavadoc(true); + ideaModel.getModule().setDownloadSources(true); + ideaModel.getModule().setInheritOutputDirs(true); } } diff --git a/src/main/java/net/fabricmc/loom/util/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java similarity index 97% rename from src/main/java/net/fabricmc/loom/util/RunConfig.java rename to src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java index 8fa9c1b7..4b68da53 100644 --- a/src/main/java/net/fabricmc/loom/util/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java @@ -22,9 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; - -import static net.fabricmc.loom.AbstractPlugin.isRootProject; +package net.fabricmc.loom.configuration.ide; import java.io.File; import java.io.IOException; @@ -41,13 +39,15 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.gradle.api.Project; +import org.gradle.plugins.ide.eclipse.model.EclipseModel; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import org.gradle.api.Project; -import org.gradle.plugins.ide.eclipse.model.EclipseModel; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.OperatingSystem; public class RunConfig { public String configName; @@ -105,7 +105,7 @@ public class RunConfig { } private static void populate(Project project, LoomGradleExtension extension, RunConfig runConfig, String mode) { - runConfig.configName += isRootProject(project) ? "" : " (" + project.getPath() + ")"; + runConfig.configName += extension.isRootProject() ? "" : " (" + project.getPath() + ")"; runConfig.eclipseProjectName = project.getExtensions().getByType(EclipseModel.class).getProject().getName(); runConfig.ideaModuleName = getIdeaModuleName(project); runConfig.runDir = "file://$PROJECT_DIR$/" + extension.runDir; diff --git a/src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java b/src/main/java/net/fabricmc/loom/configuration/ide/SetupIntelijRunConfigs.java similarity index 93% rename from src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java rename to src/main/java/net/fabricmc/loom/configuration/ide/SetupIntelijRunConfigs.java index 1934d9e4..d2413f0d 100644 --- a/src/main/java/net/fabricmc/loom/util/SetupIntelijRunConfigs.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/SetupIntelijRunConfigs.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration.ide; import java.io.File; import java.io.IOException; @@ -32,8 +32,8 @@ import org.apache.commons.io.FileUtils; import org.gradle.api.Project; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MinecraftAssetsProvider; -import net.fabricmc.loom.providers.MinecraftNativesProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftNativesProvider; +import net.fabricmc.loom.configuration.providers.minecraft.assets.MinecraftAssetsProvider; public class SetupIntelijRunConfigs { public static void setup(Project project) { diff --git a/src/main/java/net/fabricmc/loom/util/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java similarity index 94% rename from src/main/java/net/fabricmc/loom/util/ModProcessor.java rename to src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index 75f5581d..38370044 100644 --- a/src/main/java/net/fabricmc/loom/util/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration.mods; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -56,12 +56,15 @@ import net.fabricmc.accesswidener.AccessWidenerReader; import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.MinecraftMappedProvider; -import net.fabricmc.loom.processors.dependency.ModDependencyInfo; -import net.fabricmc.tinyremapper.TinyRemapper; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; +import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.tinyremapper.InputTag; import net.fabricmc.tinyremapper.OutputConsumerPath; +import net.fabricmc.tinyremapper.TinyRemapper; public class ModProcessor { public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @@ -202,7 +205,7 @@ public class ModProcessor { } } - static JsonObject readInstallerJson(File file, Project project) { + public static JsonObject readInstallerJson(File file, Project project) { try { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); String launchMethod = extension.getLoaderLaunchMethod(); diff --git a/src/main/java/net/fabricmc/loom/processors/JarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java similarity index 96% rename from src/main/java/net/fabricmc/loom/processors/JarProcessor.java rename to src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java index 0a028942..85624ce1 100644 --- a/src/main/java/net/fabricmc/loom/processors/JarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.processors; +package net.fabricmc.loom.configuration.processors; import java.io.File; diff --git a/src/main/java/net/fabricmc/loom/processors/JarProcessorManager.java b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java similarity index 97% rename from src/main/java/net/fabricmc/loom/processors/JarProcessorManager.java rename to src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java index ab0d86d3..634f4bba 100644 --- a/src/main/java/net/fabricmc/loom/processors/JarProcessorManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.processors; +package net.fabricmc.loom.configuration.processors; import java.io.File; import java.util.List; diff --git a/src/main/java/net/fabricmc/loom/processors/MinecraftProcessedProvider.java b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java similarity index 92% rename from src/main/java/net/fabricmc/loom/processors/MinecraftProcessedProvider.java rename to src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java index 6e4a4bb2..38547817 100644 --- a/src/main/java/net/fabricmc/loom/processors/MinecraftProcessedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.processors; +package net.fabricmc.loom.configuration.processors; import java.io.File; import java.io.IOException; @@ -31,9 +31,9 @@ import java.util.function.Consumer; import org.apache.commons.io.FileUtils; import org.gradle.api.Project; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.MinecraftMappedProvider; -import net.fabricmc.loom.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.Constants; public class MinecraftProcessedProvider extends MinecraftMappedProvider { diff --git a/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java similarity index 97% rename from src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java rename to src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java index fa488411..95872aa3 100644 --- a/src/main/java/net/fabricmc/loom/processors/dependency/ModDependencyInfo.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.processors.dependency; +package net.fabricmc.loom.configuration.processors.dependency; import java.io.File; import java.io.IOException; @@ -37,7 +37,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.gradle.api.artifacts.Configuration; -import net.fabricmc.loom.util.ModProcessor; +import net.fabricmc.loom.configuration.mods.ModProcessor; public class ModDependencyInfo { private final String group; diff --git a/src/main/java/net/fabricmc/loom/processors/dependency/RemapData.java b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/RemapData.java similarity index 95% rename from src/main/java/net/fabricmc/loom/processors/dependency/RemapData.java rename to src/main/java/net/fabricmc/loom/configuration/processors/dependency/RemapData.java index 7854278a..08ce7cff 100644 --- a/src/main/java/net/fabricmc/loom/processors/dependency/RemapData.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/RemapData.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.processors.dependency; +package net.fabricmc.loom.configuration.processors.dependency; import java.io.File; diff --git a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java similarity index 97% rename from src/main/java/net/fabricmc/loom/providers/LaunchProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java index a9284286..07b8c04e 100644 --- a/src/main/java/net/fabricmc/loom/providers/LaunchProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers; import java.io.File; import java.io.IOException; @@ -42,9 +42,9 @@ import org.apache.commons.io.FileUtils; import org.gradle.api.Project; import org.gradle.api.artifacts.Dependency; +import net.fabricmc.loom.configuration.DependencyProvider; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.DependencyProvider; -import net.fabricmc.loom.util.RemappedConfigurationEntry; public class LaunchProvider extends DependencyProvider { public Dependency annotationDependency; diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java similarity index 95% rename from src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java index 54252d80..d6df8ad5 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers; import java.io.File; import java.io.FileReader; @@ -40,11 +40,12 @@ import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.logging.Logger; +import net.fabricmc.loom.configuration.DependencyProvider; +import net.fabricmc.loom.configuration.providers.minecraft.ManifestVersion; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftLibraryProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.DependencyProvider; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.ManifestVersion; -import net.fabricmc.loom.util.MinecraftVersionInfo; import net.fabricmc.loom.util.StaticPathWatcher; import net.fabricmc.stitch.merge.JarMerger; diff --git a/src/main/java/net/fabricmc/loom/providers/MappingsCache.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsCache.java similarity index 97% rename from src/main/java/net/fabricmc/loom/providers/MappingsCache.java rename to src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsCache.java index e0855477..cbe020d9 100644 --- a/src/main/java/net/fabricmc/loom/providers/MappingsCache.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsCache.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.mappings; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java similarity index 96% rename from src/main/java/net/fabricmc/loom/providers/MappingsProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java index 3330b862..ba2d8271 100644 --- a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.mappings; import java.io.BufferedReader; import java.io.File; @@ -46,13 +46,15 @@ import org.zeroturnaround.zip.ZipEntrySource; import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.processors.JarProcessorManager; -import net.fabricmc.loom.processors.MinecraftProcessedProvider; +import net.fabricmc.loom.configuration.DependencyProvider; +import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; +import net.fabricmc.loom.configuration.processors.JarProcessorManager; +import net.fabricmc.loom.configuration.processors.MinecraftProcessedProvider; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DeletingFileVisitor; -import net.fabricmc.loom.util.DependencyProvider; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.accesswidener.AccessWidenerJarProcessor; import net.fabricmc.mapping.reader.v2.TinyV2Factory; import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.stitch.Command; diff --git a/src/main/java/net/fabricmc/loom/util/mappings/MojangMappingsDependency.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/mappings/MojangMappingsDependency.java rename to src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java index b84d8d2b..b86e04f2 100644 --- a/src/main/java/net/fabricmc/loom/util/mappings/MojangMappingsDependency.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mappings; +package net.fabricmc.loom.configuration.providers.mappings; import java.io.BufferedReader; import java.io.File; @@ -54,8 +54,8 @@ import org.zeroturnaround.zip.ZipEntrySource; import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.MinecraftVersionInfo; import net.fabricmc.lorenztiny.TinyMappingsReader; import net.fabricmc.mapping.tree.TinyMappingFactory; diff --git a/src/main/java/net/fabricmc/loom/util/ManifestVersion.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/ManifestVersion.java similarity index 95% rename from src/main/java/net/fabricmc/loom/util/ManifestVersion.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/ManifestVersion.java index d8d9323e..4cc2e33e 100644 --- a/src/main/java/net/fabricmc/loom/util/ManifestVersion.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/ManifestVersion.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration.providers.minecraft; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java similarity index 95% rename from src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index 6ee9c0b5..8822140c 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -22,15 +22,15 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.minecraft; import java.io.File; import org.gradle.api.Project; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.MinecraftVersionInfo; public class MinecraftLibraryProvider { public File MINECRAFT_LIBS; diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java similarity index 96% rename from src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java index 1767f4a5..6301050a 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.minecraft; import java.io.File; import java.io.IOException; @@ -34,11 +34,13 @@ import java.util.function.Consumer; import com.google.common.collect.ImmutableMap; import org.gradle.api.Project; +import net.fabricmc.loom.configuration.DependencyProvider; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.DependencyProvider; public class MinecraftMappedProvider extends DependencyProvider { private static final Map JSR_TO_JETBRAINS = new ImmutableMap.Builder() diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftNativesProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftNativesProvider.java similarity index 95% rename from src/main/java/net/fabricmc/loom/providers/MinecraftNativesProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftNativesProvider.java index 0bec8f9f..9f338ef8 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftNativesProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftNativesProvider.java @@ -22,19 +22,19 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.minecraft; import java.io.File; import java.io.IOException; import java.net.URL; import org.gradle.api.GradleException; -import org.zeroturnaround.zip.ZipUtil; import org.gradle.api.Project; +import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.MinecraftVersionInfo; public class MinecraftNativesProvider { public static void provide(MinecraftProvider minecraftProvider, Project project) throws IOException { diff --git a/src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionInfo.java similarity index 97% rename from src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionInfo.java index b85982a7..0994b4cc 100644 --- a/src/main/java/net/fabricmc/loom/util/MinecraftVersionInfo.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionInfo.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration.providers.minecraft; import java.io.File; import java.util.List; @@ -31,6 +31,9 @@ import java.util.Map; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.OperatingSystem; + public class MinecraftVersionInfo { public List libraries; public Map downloads; diff --git a/src/main/java/net/fabricmc/loom/util/assets/AssetIndex.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetIndex.java similarity index 96% rename from src/main/java/net/fabricmc/loom/util/assets/AssetIndex.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetIndex.java index 96ef46cc..bbe96f97 100644 --- a/src/main/java/net/fabricmc/loom/util/assets/AssetIndex.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetIndex.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.assets; +package net.fabricmc.loom.configuration.providers.minecraft.assets; import java.util.HashSet; import java.util.LinkedHashMap; diff --git a/src/main/java/net/fabricmc/loom/util/assets/AssetObject.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetObject.java similarity index 96% rename from src/main/java/net/fabricmc/loom/util/assets/AssetObject.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetObject.java index 1f71bc83..32d16d6e 100644 --- a/src/main/java/net/fabricmc/loom/util/assets/AssetObject.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/AssetObject.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.assets; +package net.fabricmc.loom.configuration.providers.minecraft.assets; @SuppressWarnings("unused") public class AssetObject { diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftAssetsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java similarity index 95% rename from src/main/java/net/fabricmc/loom/providers/MinecraftAssetsProvider.java rename to src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java index 3f2e39d9..7b1ff144 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftAssetsProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.providers; +package net.fabricmc.loom.configuration.providers.minecraft.assets; import java.io.File; import java.io.FileReader; @@ -40,13 +40,12 @@ import org.gradle.api.GradleException; import org.gradle.api.Project; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DownloadUtil; -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 net.fabricmc.loom.util.gradle.ProgressLogger; public class MinecraftAssetsProvider { public static void provide(MinecraftProvider minecraftProvider, Project project) throws IOException { diff --git a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java b/src/main/java/net/fabricmc/loom/decompilers/DecompilerConfiguration.java similarity index 65% rename from src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java rename to src/main/java/net/fabricmc/loom/decompilers/DecompilerConfiguration.java index 56895fd4..5ec54664 100644 --- a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java +++ b/src/main/java/net/fabricmc/loom/decompilers/DecompilerConfiguration.java @@ -22,28 +22,21 @@ * SOFTWARE. */ -package net.fabricmc.loom.task; +package net.fabricmc.loom.decompilers; -import java.io.IOException; - -import org.apache.commons.io.FileUtils; -import org.gradle.api.tasks.TaskAction; +import org.gradle.api.Project; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.decompilers.cfr.FabricCFRDecompiler; +import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; -public class CleanLoomBinaries extends AbstractLoomTask { - @TaskAction - public void run() { - LoomGradleExtension extension = getExtension(); - extension.getMinecraftProvider().getMergedJar().delete(); - extension.getMinecraftMappedProvider().getIntermediaryJar().delete(); - extension.getMinecraftMappedProvider().getMappedJar().delete(); +public final class DecompilerConfiguration { + private DecompilerConfiguration() { + } - try { - FileUtils.deleteDirectory(extension.getNativesDirectory()); - FileUtils.deleteDirectory(extension.getNativesJarStore()); - } catch (IOException e) { - e.printStackTrace(); - } + public static void setup(Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + extension.addDecompiler(new FabricFernFlowerDecompiler(project)); + extension.addDecompiler(new FabricCFRDecompiler(project)); } } diff --git a/src/main/java/net/fabricmc/loom/util/LineNumberRemapper.java b/src/main/java/net/fabricmc/loom/decompilers/LineNumberRemapper.java similarity index 97% rename from src/main/java/net/fabricmc/loom/util/LineNumberRemapper.java rename to src/main/java/net/fabricmc/loom/decompilers/LineNumberRemapper.java index 74cb0d6c..3b899c8c 100644 --- a/src/main/java/net/fabricmc/loom/util/LineNumberRemapper.java +++ b/src/main/java/net/fabricmc/loom/decompilers/LineNumberRemapper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.decompilers; import static java.text.MessageFormat.format; @@ -46,7 +46,8 @@ import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; -import net.fabricmc.loom.util.progress.ProgressLogger; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.gradle.ProgressLogger; /** * TODO, Move to stitch. diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 138bed98..0f2f94a9 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -35,7 +35,7 @@ import org.gradle.api.Project; import org.gradle.api.tasks.JavaExec; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; public abstract class AbstractRunTask extends JavaExec { private final Function configProvider; diff --git a/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java b/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java index 26c9cfb2..8607dbeb 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java @@ -30,8 +30,8 @@ import org.gradle.api.Project; import org.gradle.api.tasks.TaskAction; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MinecraftAssetsProvider; -import net.fabricmc.loom.providers.MinecraftNativesProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftNativesProvider; +import net.fabricmc.loom.configuration.providers.minecraft.assets.MinecraftAssetsProvider; public class DownloadAssetsTask extends AbstractLoomTask { @TaskAction diff --git a/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java b/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java index 11124df3..f3c81222 100644 --- a/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java @@ -32,7 +32,7 @@ import org.apache.commons.io.FileUtils; import org.gradle.api.tasks.TaskAction; import org.gradle.plugins.ide.eclipse.model.EclipseModel; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; public class GenEclipseRunsTask extends AbstractLoomTask { @TaskAction diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index a021214d..f7214b06 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -37,28 +37,28 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.gradle.api.Project; +import org.gradle.api.tasks.TaskAction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import org.gradle.api.Project; -import org.gradle.api.tasks.TaskAction; -import net.fabricmc.loom.AbstractPlugin; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; public class GenIdeaProjectTask extends AbstractLoomTask { @TaskAction public void genIdeaRuns() throws IOException, ParserConfigurationException, SAXException, TransformerException { Project project = this.getProject(); + LoomGradleExtension extension = getExtension(); + // Only generate the idea runs on the root project - if (!AbstractPlugin.isRootProject(project)) { + if (!extension.isRootProject()) { return; } - LoomGradleExtension extension = getExtension(); project.getLogger().lifecycle(":Building idea workspace"); File file = project.file(project.getName() + ".iws"); diff --git a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java index f9a61134..c2e9ab31 100644 --- a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java @@ -37,7 +37,7 @@ import org.gradle.api.Project; import org.gradle.api.tasks.TaskAction; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; // Recommended vscode plugins: // https://marketplace.visualstudio.com/items?itemName=redhat.java diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 0a4c181b..7c5862e4 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -30,18 +30,20 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.Collection; +import java.util.Locale; import java.util.stream.Collectors; import javax.inject.Inject; import org.gradle.api.tasks.TaskAction; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.LoomGradlePlugin; +import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.decompilers.DecompilationMetadata; import net.fabricmc.loom.api.decompilers.LoomDecompiler; -import net.fabricmc.loom.util.LineNumberRemapper; -import net.fabricmc.loom.util.progress.ProgressLogger; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.decompilers.LineNumberRemapper; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.gradle.ProgressLogger; import net.fabricmc.stitch.util.StitchUtil; public class GenerateSourcesTask extends AbstractLoomTask { @@ -64,18 +66,18 @@ public class GenerateSourcesTask extends AbstractLoomTask { DecompilationMetadata metadata = new DecompilationMetadata(threads, javaDocs, libraries); Path compiledJar = getExtension().getMappingsProvider().mappedProvider.getMappedJar().toPath(); - Path sourcesDestination = LoomGradlePlugin.getMappedByproduct(getProject(), "-sources.jar").toPath(); - Path linemap = LoomGradlePlugin.getMappedByproduct(getProject(), "-sources.lmap").toPath(); + Path sourcesDestination = getMappedJarFileWithSuffix("-sources.jar").toPath(); + Path linemap = getMappedJarFileWithSuffix("-sources.lmap").toPath(); decompiler.decompile(compiledJar, sourcesDestination, linemap, metadata); if (Files.exists(linemap)) { - Path linemappedJarDestination = LoomGradlePlugin.getMappedByproduct(getProject(), "-linemapped.jar").toPath(); + Path linemappedJarDestination = getMappedJarFileWithSuffix("-linemapped.jar").toPath(); remapLineNumbers(compiledJar, linemap, linemappedJarDestination); // In order for IDEs to recognize the new line mappings, we need to overwrite the existing compiled jar // with the linemapped one. In the name of not destroying the existing jar, we will copy it to somewhere else. - Path unlinemappedJar = LoomGradlePlugin.getMappedByproduct(getProject(), "-unlinemapped.jar").toPath(); + Path unlinemappedJar = getMappedJarFileWithSuffix("-unlinemapped.jar").toPath(); // The second time genSources is ran, we want to keep the existing unlinemapped jar. if (!Files.exists(unlinemappedJar)) { @@ -92,7 +94,7 @@ public class GenerateSourcesTask extends AbstractLoomTask { LineNumberRemapper remapper = new LineNumberRemapper(); remapper.readMappings(linemap.toFile()); - ProgressLogger progressLogger = net.fabricmc.loom.util.progress.ProgressLogger.getProgressFactory(getProject(), getClass().getName()); + ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); progressLogger.start("Adjusting line numbers", "linemap"); try (StitchUtil.FileSystemDelegate inFs = StitchUtil.getJarFileSystem(oldCompiledJar.toFile(), true); @@ -102,4 +104,17 @@ public class GenerateSourcesTask extends AbstractLoomTask { progressLogger.completed(); } + + private File getMappedJarFileWithSuffix(String suffix) { + LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); + MappingsProvider mappingsProvider = extension.getMappingsProvider(); + File mappedJar = mappingsProvider.mappedProvider.getMappedJar(); + String path = mappedJar.getAbsolutePath(); + + if (!path.toLowerCase(Locale.ROOT).endsWith(".jar")) { + throw new RuntimeException("Invalid mapped JAR path: " + path); + } + + return new File(path.substring(0, path.length() - 4) + suffix); + } } diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java new file mode 100644 index 00000000..eda8cb5e --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -0,0 +1,108 @@ +/* + * 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 org.gradle.api.Project; +import org.gradle.api.tasks.TaskContainer; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.api.decompilers.LoomDecompiler; +import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; + +public final class LoomTasks { + private LoomTasks() { + } + + public static void registerTasks(Project project) { + TaskContainer tasks = project.getTasks(); + + tasks.register("migrateMappings", MigrateMappingsTask.class, t -> { + t.setDescription("Migrates mappings to a new version."); + t.getOutputs().upToDateWhen((o) -> false); + }); + + tasks.register("remapJar", RemapJarTask.class, t -> { + t.setDescription("Remaps the built project jar to intermediary mappings."); + t.setGroup("fabric"); + }); + + tasks.register("downloadAssets", DownloadAssetsTask.class, t -> t.setDescription("Downloads required assets for Fabric.")); + tasks.register("remapSourcesJar", RemapSourcesJarTask.class, t -> t.setDescription("Remaps the project sources jar to intermediary names.")); + + registerIDETasks(tasks); + registerRunTasks(tasks); + registerDecompileTasks(tasks, project); + } + + private static void registerIDETasks(TaskContainer tasks) { + tasks.register("genIdeaWorkspace", GenIdeaProjectTask.class, t -> { + t.setDescription("Generates an IntelliJ IDEA workspace from this project."); + t.dependsOn("idea", "downloadAssets"); + t.setGroup("ide"); + }); + + tasks.register("genEclipseRuns", GenEclipseRunsTask.class, t -> { + t.setDescription("Generates Eclipse run configurations for this project."); + t.dependsOn("downloadAssets"); + t.setGroup("ide"); + }); + + tasks.register("cleanEclipseRuns", CleanEclipseRunsTask.class, t -> { + t.setDescription("Removes Eclipse run configurations for this project."); + t.setGroup("ide"); + }); + + tasks.register("vscode", GenVsCodeProjectTask.class, t -> { + t.setDescription("Generates VSCode launch configurations."); + t.dependsOn("downloadAssets"); + t.setGroup("ide"); + }); + } + + private static void registerRunTasks(TaskContainer tasks) { + tasks.register("runClient", RunClientTask.class, t -> { + t.setDescription("Starts a development version of the Minecraft client."); + t.dependsOn("downloadAssets"); + t.setGroup("fabric"); + }); + + tasks.register("runServer", RunServerTask.class, t -> { + t.setDescription("Starts a development version of the Minecraft server."); + t.setGroup("fabric"); + }); + } + + private static void registerDecompileTasks(TaskContainer tasks, Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + + project.afterEvaluate((p) -> { + for (LoomDecompiler decompiler : extension.getDecompilers()) { + String taskName = (decompiler instanceof FabricFernFlowerDecompiler) ? "genSources" : "genSourcesWith" + decompiler.name(); + // decompiler will be passed to the constructor of GenerateSourcesTask + tasks.register(taskName, GenerateSourcesTask.class, decompiler); + } + }); + } +} diff --git a/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java b/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java index c3b1d264..4de1997b 100644 --- a/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java @@ -49,10 +49,10 @@ import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.MinecraftMappedProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.configuration.providers.mappings.MojangMappingsDependency; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.SourceRemapper; -import net.fabricmc.loom.util.mappings.MojangMappingsDependency; import net.fabricmc.lorenztiny.TinyMappingsJoiner; import net.fabricmc.mapping.tree.TinyMappingFactory; import net.fabricmc.mapping.tree.TinyTree; diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 04522648..ab6306c8 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -45,14 +45,14 @@ import org.gradle.jvm.tasks.Jar; import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.util.GradleSupport; -import net.fabricmc.loom.util.MixinRefmapHelper; -import net.fabricmc.loom.util.NestedJars; +import net.fabricmc.loom.build.JarRemapper; +import net.fabricmc.loom.build.MixinRefmapHelper; +import net.fabricmc.loom.build.NestedJars; +import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.loom.util.ZipReprocessorUtil; -import net.fabricmc.loom.util.accesswidener.AccessWidenerJarProcessor; -import net.fabricmc.loom.util.JarRemapper; +import net.fabricmc.loom.util.gradle.GradleSupport; import net.fabricmc.stitch.util.Pair; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 0200b1ee..de0cc377 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -24,7 +24,7 @@ package net.fabricmc.loom.task; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; public class RunClientTask extends AbstractRunTask { public RunClientTask() { diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index d1d3d954..977b65c7 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -24,7 +24,7 @@ package net.fabricmc.loom.task; -import net.fabricmc.loom.util.RunConfig; +import net.fabricmc.loom.configuration.ide.RunConfig; public class RunServerTask extends AbstractRunTask { public RunServerTask() { diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index a07b8002..1af3bf28 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -29,6 +29,8 @@ import java.util.List; import com.google.common.collect.ImmutableList; import org.objectweb.asm.Opcodes; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; + public class Constants { public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; diff --git a/src/main/java/net/fabricmc/loom/util/DownloadUtil.java b/src/main/java/net/fabricmc/loom/util/DownloadUtil.java index 6eaaea7a..506adae8 100644 --- a/src/main/java/net/fabricmc/loom/util/DownloadUtil.java +++ b/src/main/java/net/fabricmc/loom/util/DownloadUtil.java @@ -35,9 +35,9 @@ import org.apache.commons.io.FileUtils; import org.gradle.api.Project; import org.gradle.api.logging.Logger; -public class DownloadUtil { - public static boolean refreshDeps = false; +import net.fabricmc.loom.LoomGradlePlugin; +public class DownloadUtil { /** * Download from the given {@link URL} to the given {@link File} so long as there are differences between them. * @@ -62,7 +62,7 @@ public class DownloadUtil { public static void downloadIfChanged(URL from, File to, Logger logger, boolean quiet) throws IOException { HttpURLConnection connection = (HttpURLConnection) from.openConnection(); - if (refreshDeps) { + if (LoomGradlePlugin.refreshDeps) { getETagFile(to).delete(); to.delete(); } diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 36420d7f..e7a5bef6 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -41,9 +41,10 @@ import org.gradle.api.artifacts.Dependency; import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.providers.LaunchProvider; -import net.fabricmc.loom.util.progress.ProgressLogger; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; +import net.fabricmc.loom.configuration.providers.LaunchProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.util.gradle.ProgressLogger; import net.fabricmc.lorenztiny.TinyMappingsReader; import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.stitch.util.StitchUtil; diff --git a/src/main/java/net/fabricmc/loom/util/GradleSupport.java b/src/main/java/net/fabricmc/loom/util/gradle/GradleSupport.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/GradleSupport.java rename to src/main/java/net/fabricmc/loom/util/gradle/GradleSupport.java index 600118d8..2ead1f70 100644 --- a/src/main/java/net/fabricmc/loom/util/GradleSupport.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/GradleSupport.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.util.gradle; import java.lang.reflect.Method; diff --git a/src/main/java/net/fabricmc/loom/util/progress/ProgressLogger.java b/src/main/java/net/fabricmc/loom/util/gradle/ProgressLogger.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/progress/ProgressLogger.java rename to src/main/java/net/fabricmc/loom/util/gradle/ProgressLogger.java index 3cce7057..448331d5 100644 --- a/src/main/java/net/fabricmc/loom/util/progress/ProgressLogger.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/ProgressLogger.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.progress; +package net.fabricmc.loom.util.gradle; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; From c95e3459a400077964e5d9ed52392b77330487ba Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sat, 26 Dec 2020 15:15:31 +0000 Subject: [PATCH 12/18] Remove jcenter as a default maven repo. This will make builds faster and more reliable. It is trivial to add back manually for projects that require it. Closes #314 --- .../net/fabricmc/loom/configuration/CompileConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 836b3207..b5f7ee2b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -159,7 +159,6 @@ public final class CompileConfiguration { }); project1.getRepositories().mavenCentral(); - project1.getRepositories().jcenter(); LoomDependencyManager dependencyManager = new LoomDependencyManager(); extension.setDependencyManager(dependencyManager); From 792a64e2efecb850e4752a298a4e3d6f50f55a64 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 27 Dec 2020 16:25:30 +0000 Subject: [PATCH 13/18] Optimise loom configuration, saves 1.2 seconds in my testing. #319 --- .../fabricmc/loom/LoomGradleExtension.java | 6 +- .../net/fabricmc/loom/LoomGradlePlugin.java | 3 + .../loom/build/MixinRefmapHelper.java | 12 +- .../loom/build/ModCompileRemapper.java | 19 ++- .../net/fabricmc/loom/build/NestedJars.java | 11 +- .../configuration/CompileConfiguration.java | 17 +-- .../configuration/DependencyProvider.java | 12 +- .../configuration/LoomDependencyManager.java | 2 +- .../loom/configuration/mods/ModProcessor.java | 11 +- .../dependency/ModDependencyInfo.java | 8 +- .../providers/MinecraftProvider.java | 71 ++++++--- .../providers/mappings/MappingsProvider.java | 10 +- .../fabricmc/loom/task/AbstractRunTask.java | 6 +- .../java/net/fabricmc/loom/util/Checksum.java | 13 +- .../net/fabricmc/loom/util/DownloadUtil.java | 2 +- .../loom/util/HashedDownloadUtil.java | 136 ++++++++++++++++++ 16 files changed, 252 insertions(+), 87 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/util/HashedDownloadUtil.java diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index dfbcf8da..22ee0929 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -235,10 +235,8 @@ public class LoomGradleExtension { } public File getNativesDirectory() { - Object customNativesDir = project.getProperties().get("fabric.loom.natives.dir"); - - if (customNativesDir != null) { - return new File((String) customNativesDir); + if (project.hasProperty("fabric.loom.natives.dir")) { + return new File((String) project.property("fabric.loom.natives.dir")); } File natives = new File(getUserCache(), "natives/" + getMinecraftProvider().getMinecraftVersion()); diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index e9486d43..cac0b324 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -25,6 +25,8 @@ package net.fabricmc.loom; import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.gradle.api.Plugin; import org.gradle.api.Project; @@ -38,6 +40,7 @@ import net.fabricmc.loom.task.LoomTasks; public class LoomGradlePlugin implements Plugin { public static boolean refreshDeps; + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @Override public void apply(Project project) { diff --git a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java index dd90e2fa..dace6895 100644 --- a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java +++ b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java @@ -32,16 +32,14 @@ import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; -public final class MixinRefmapHelper { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); +import net.fabricmc.loom.LoomGradlePlugin; +public final class MixinRefmapHelper { private MixinRefmapHelper() { } public static boolean addRefmapName(String filename, String mixinVersion, Path outputPath) { @@ -52,7 +50,7 @@ public final class MixinRefmapHelper { return ZipUtil.transformEntries(output, mixinFilenames.stream().map((f) -> new ZipEntryTransformerEntry(f, new StringZipEntryTransformer("UTF-8") { @Override protected String transform(ZipEntry zipEntry, String input) throws IOException { - JsonObject json = GSON.fromJson(input, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); if (!json.has("refmap")) { json.addProperty("refmap", filename); @@ -62,7 +60,7 @@ public final class MixinRefmapHelper { json.addProperty("minVersion", mixinVersion); } - return GSON.toJson(json); + return LoomGradlePlugin.GSON.toJson(json); } })).toArray(ZipEntryTransformerEntry[]::new)); } else { @@ -78,7 +76,7 @@ public final class MixinRefmapHelper { if (!entry.isDirectory() && entry.getName().endsWith(".json") && !entry.getName().contains("/") && !entry.getName().contains("\\")) { // JSON file in root directory try (InputStreamReader inputStreamReader = new InputStreamReader(stream)) { - JsonObject json = GSON.fromJson(inputStreamReader, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(inputStreamReader, JsonObject.class); if (json != null) { boolean hasMixins = json.has("mixins") && json.get("mixins").isJsonArray(); diff --git a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index eb9d87e0..5fc7771e 100644 --- a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -52,6 +52,7 @@ import net.fabricmc.loom.configuration.processors.dependency.RemapData; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.SourceRemapper; +@SuppressWarnings("UnstableApiUsage") public class ModCompileRemapper { public static void remapDependencies(Project project, String mappingsSuffix, LoomGradleExtension extension, SourceRemapper sourceRemapper) { Logger logger = project.getLogger(); @@ -82,9 +83,7 @@ public class ModCompileRemapper { continue; } - File sources = findSources(dependencies, artifact); - - ModDependencyInfo info = new ModDependencyInfo(group, name, version, classifierSuffix, artifact.getFile(), sources, remappedConfig, remapData); + ModDependencyInfo info = new ModDependencyInfo(group, name, version, classifierSuffix, artifact.getFile(), remappedConfig, remapData); if (refreshDeps) { info.forceRemap(); @@ -95,8 +94,14 @@ public class ModCompileRemapper { String remappedLog = group + ":" + name + ":" + version + classifierSuffix + " (" + mappingsSuffix + ")"; project.getLogger().info(":providing " + remappedLog); - if (sources != null) { - scheduleSourcesRemapping(project, sourceRemapper, info.sourcesFile, info.getRemappedNotation(), info.getRemappedOutput(), modStore); + File remappedSources = new File(info.getRemappedOutput().getAbsolutePath().replace(".jar", "-sources.jar")); + + if (!remappedSources.exists() || refreshDeps) { + File sources = findSources(dependencies, artifact); + + if (sources != null) { + scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), info.getRemappedOutput(), modStore); + } } } @@ -145,8 +150,8 @@ public class ModCompileRemapper { } public static File findSources(DependencyHandler dependencies, ResolvedArtifact artifact) { - @SuppressWarnings("unchecked") ArtifactResolutionQuery query = dependencies.createArtifactResolutionQuery()// - .forComponents(artifact.getId().getComponentIdentifier())// + @SuppressWarnings("unchecked") ArtifactResolutionQuery query = dependencies.createArtifactResolutionQuery() + .forComponents(artifact.getId().getComponentIdentifier()) .withArtifacts(JvmLibrary.class, SourcesArtifact.class); for (ComponentArtifactsResult result : query.execute().getResolvedComponents()) { diff --git a/src/main/java/net/fabricmc/loom/build/NestedJars.java b/src/main/java/net/fabricmc/loom/build/NestedJars.java index c088af47..172efca9 100644 --- a/src/main/java/net/fabricmc/loom/build/NestedJars.java +++ b/src/main/java/net/fabricmc/loom/build/NestedJars.java @@ -36,8 +36,6 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.zip.ZipEntry; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; @@ -58,12 +56,11 @@ import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.task.RemapJarTask; import net.fabricmc.loom.util.Constants; public class NestedJars { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static boolean addNestedJars(Project project, Path modJarPath) { List containedJars = getContainedJars(project); @@ -78,7 +75,7 @@ public class NestedJars { return ZipUtil.transformEntries(modJar, single(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { @Override protected String transform(ZipEntry zipEntry, String input) { - JsonObject json = GSON.fromJson(input, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); JsonArray nestedJars = json.getAsJsonArray("jars"); if (nestedJars == null || !json.has("jars")) { @@ -93,7 +90,7 @@ public class NestedJars { json.add("jars", nestedJars); - return GSON.toJson(json); + return LoomGradlePlugin.GSON.toJson(json); } }))); } @@ -229,7 +226,7 @@ public class NestedJars { custom.addProperty("fabric-loom:generated", true); jsonObject.add("custom", custom); - return GSON.toJson(jsonObject); + return LoomGradlePlugin.GSON.toJson(jsonObject); } private static ZipEntryTransformerEntry[] single(ZipEntryTransformerEntry element) { diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index b5f7ee2b..8b264a01 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -25,8 +25,6 @@ package net.fabricmc.loom.configuration; import java.io.IOException; -import java.util.Map; -import java.util.Set; import org.gradle.api.Project; import org.gradle.api.Task; @@ -198,18 +196,11 @@ public final class CompileConfiguration { remapJarTask.dependsOn(jarTask); project1.getTasks().getByName("build").dependsOn(remapJarTask); - Map> taskMap = project.getAllTasks(true); - - for (Map.Entry> entry : taskMap.entrySet()) { - Set taskSet = entry.getValue(); - - for (Task task : taskSet) { - if (task instanceof RemapJarTask && ((RemapJarTask) task).getAddNestedDependencies().getOrElse(false)) { - //Run all the sub project remap jars tasks before the root projects jar, this is to allow us to include projects - NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); - } + project.getTasks().withType(RemapJarTask.class).forEach(task -> { + if (task.getAddNestedDependencies().getOrElse(false)) { + NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); } - } + }); SourceRemapper remapper = null; Task parentTask = project1.getTasks().getByName("build"); diff --git a/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java index 4b1b800f..1795d3b7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java @@ -100,6 +100,8 @@ public abstract class DependencyProvider { final Dependency dependency; final Configuration sourceConfiguration; + private String resolvedVersion = null; + public static DependencyInfo create(Project project, Dependency dependency, Configuration sourceConfiguration) { if (dependency instanceof SelfResolvingDependency) { return new FileDependencyInfo(project, (SelfResolvingDependency) dependency, sourceConfiguration); @@ -119,13 +121,19 @@ public abstract class DependencyProvider { } public String getResolvedVersion() { + if (resolvedVersion != null) { + return resolvedVersion; + } + for (ResolvedDependency rd : sourceConfiguration.getResolvedConfiguration().getFirstLevelModuleDependencies()) { if (rd.getModuleGroup().equals(dependency.getGroup()) && rd.getModuleName().equals(dependency.getName())) { - return rd.getModuleVersion(); + resolvedVersion = rd.getModuleVersion(); + return resolvedVersion; } } - return dependency.getVersion(); + resolvedVersion = dependency.getVersion(); + return resolvedVersion; } public Configuration getSourceConfiguration() { diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index 2bd1fb54..5397794e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -87,7 +87,7 @@ public class LoomDependencyManager { MappingsProvider mappingsProvider = null; - project.getLogger().lifecycle(":setting up loom dependencies"); + project.getLogger().info(":setting up loom dependencies"); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); Map providerListMap = new HashMap<>(); List targetProviders = new ArrayList<>(); diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index 38370044..367a49a6 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -41,8 +41,6 @@ import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.zip.ZipEntry; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import org.apache.commons.io.IOUtils; import org.gradle.api.Project; @@ -56,6 +54,7 @@ import net.fabricmc.accesswidener.AccessWidenerReader; import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; @@ -67,8 +66,6 @@ import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; public class ModProcessor { - public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static void processMods(Project project, List processList) throws IOException { if (processList.stream().noneMatch(ModDependencyInfo::requiresRemapping)) { return; @@ -104,9 +101,9 @@ public class ModProcessor { ZipUtil.transformEntries(file, new ZipEntryTransformerEntry[] {(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { @Override protected String transform(ZipEntry zipEntry, String input) { - JsonObject json = GSON.fromJson(input, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); json.remove("jars"); - return GSON.toJson(json); + return LoomGradlePlugin.GSON.toJson(json); } }))}); } @@ -236,7 +233,7 @@ public class ModProcessor { } } - return GSON.fromJson(jsonStr, JsonObject.class); + return LoomGradlePlugin.GSON.fromJson(jsonStr, JsonObject.class); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java index 95872aa3..1f6682f4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java @@ -37,7 +37,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.gradle.api.artifacts.Configuration; -import net.fabricmc.loom.configuration.mods.ModProcessor; +import net.fabricmc.loom.LoomGradlePlugin; public class ModDependencyInfo { private final String group; @@ -45,20 +45,18 @@ public class ModDependencyInfo { public final String version; public final String classifier; public final File inputFile; - public final File sourcesFile; public final Configuration targetConfig; public final RemapData remapData; private boolean forceRemap = false; - public ModDependencyInfo(String group, String name, String version, String classifier, File inputFile, File sourcesFile, Configuration targetConfig, RemapData remapData) { + public ModDependencyInfo(String group, String name, String version, String classifier, File inputFile, Configuration targetConfig, RemapData remapData) { this.group = group; this.name = name; this.version = version; this.classifier = classifier; this.inputFile = inputFile; - this.sourcesFile = sourcesFile; this.targetConfig = targetConfig; this.remapData = remapData; } @@ -149,7 +147,7 @@ public class ModDependencyInfo { } try (InputStream inputStream = jarFile.getInputStream(modJsonEntry)) { - JsonObject json = ModProcessor.GSON.fromJson(new InputStreamReader(inputStream), JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(new InputStreamReader(inputStream), JsonObject.class); if (!json.has("accessWidener")) { return null; diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java index d6df8ad5..7a9737f4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java @@ -31,22 +31,24 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Optional; import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipError; import com.google.common.io.Files; -import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.logging.Logger; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.providers.minecraft.ManifestVersion; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftLibraryProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.StaticPathWatcher; +import net.fabricmc.loom.util.HashedDownloadUtil; import net.fabricmc.stitch.merge.JarMerger; public class MinecraftProvider extends DependencyProvider { @@ -59,8 +61,7 @@ public class MinecraftProvider extends DependencyProvider { private File minecraftClientJar; private File minecraftServerJar; private File minecraftMergedJar; - - Gson gson = new Gson(); + private File versionManifestJson; public MinecraftProvider(Project project) { super(project); @@ -77,7 +78,7 @@ public class MinecraftProvider extends DependencyProvider { downloadMcJson(offline); try (FileReader reader = new FileReader(minecraftJson)) { - versionInfo = gson.fromJson(reader, MinecraftVersionInfo.class); + versionInfo = LoomGradlePlugin.GSON.fromJson(reader, MinecraftVersionInfo.class); } // Add Loom as an annotation processor @@ -117,29 +118,30 @@ public class MinecraftProvider extends DependencyProvider { minecraftClientJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-client.jar"); minecraftServerJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-server.jar"); minecraftMergedJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-merged.jar"); + versionManifestJson = new File(getExtension().getUserCache(), "version_manifest.json"); } private void downloadMcJson(boolean offline) throws IOException { - File manifests = new File(getExtension().getUserCache(), "version_manifest.json"); - - if (getExtension().isShareCaches() && !getExtension().isRootProject() && manifests.exists() && !isRefreshDeps()) { + if (getExtension().isShareCaches() && !getExtension().isRootProject() && versionManifestJson.exists() && !isRefreshDeps()) { return; } - if (offline) { - if (manifests.exists()) { + if (!offline && !isRefreshDeps() && hasRecentValidManifest()) { + // We have a recent valid manifest file, so do nothing + } else if (offline) { + if (versionManifestJson.exists()) { // If there is the manifests already we'll presume that's good enough getProject().getLogger().debug("Found version manifests, presuming up-to-date"); } else { // If we don't have the manifests then there's nothing more we can do - throw new GradleException("Version manifests not found at " + manifests.getAbsolutePath()); + throw new GradleException("Version manifests not found at " + versionManifestJson.getAbsolutePath()); } } else { getProject().getLogger().debug("Downloading version manifests"); - DownloadUtil.downloadIfChanged(new URL(Constants.VERSION_MANIFESTS), manifests, getProject().getLogger()); + DownloadUtil.downloadIfChanged(new URL(Constants.VERSION_MANIFESTS), versionManifestJson, getProject().getLogger()); } - String versionManifest = Files.asCharSource(manifests, StandardCharsets.UTF_8).read(); + String versionManifest = Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read(); ManifestVersion mcManifest = new GsonBuilder().create().fromJson(versionManifest, ManifestVersion.class); Optional optionalVersion = Optional.empty(); @@ -166,9 +168,18 @@ public class MinecraftProvider extends DependencyProvider { throw new GradleException("Minecraft " + minecraftVersion + " manifest not found at " + minecraftJson.getAbsolutePath()); } } else { - if (StaticPathWatcher.INSTANCE.hasFileChanged(minecraftJson.toPath()) || isRefreshDeps()) { - getProject().getLogger().debug("Downloading Minecraft {} manifest", minecraftVersion); - DownloadUtil.downloadIfChanged(new URL(optionalVersion.get().url), minecraftJson, getProject().getLogger()); + getProject().getLogger().debug("Downloading Minecraft {} manifest", minecraftVersion); + + String url = optionalVersion.get().url; + // Find the sha1 of the json from the url, return true if it matches the local json + Pattern sha1Pattern = Pattern.compile("\\b[0-9a-f]{5,40}\\b"); + Matcher matcher = sha1Pattern.matcher(url); + + if (matcher.find()) { + HashedDownloadUtil.downloadIfInvalid(new URL(url), minecraftJson, matcher.group(), getProject().getLogger(), true); + } else { + // Use the etag if no hash found from url + DownloadUtil.downloadIfChanged(new URL(url), minecraftJson, getProject().getLogger()); } } } else { @@ -176,13 +187,37 @@ public class MinecraftProvider extends DependencyProvider { } } + private boolean hasRecentValidManifest() throws IOException { + if (getExtension().customManifest != null) { + return false; + } + + if (!versionManifestJson.exists() || !minecraftJson.exists()) { + return false; + } + + if (versionManifestJson.lastModified() > System.currentTimeMillis() - 24 * 3_600_000) { + // Version manifest hasn't been modified in 24 hours, time to get a new one. + return false; + } + + ManifestVersion manifest = new GsonBuilder().create().fromJson(Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read(), ManifestVersion.class); + Optional version = manifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst(); + + // fail if the expected mc version was not found, will download the file again. + return version.isPresent(); + } + private void downloadJars(Logger logger) throws IOException { if (getExtension().isShareCaches() && !getExtension().isRootProject() && minecraftClientJar.exists() && minecraftServerJar.exists() && !isRefreshDeps()) { return; } - DownloadUtil.downloadIfChanged(new URL(versionInfo.downloads.get("client").url), minecraftClientJar, logger); - DownloadUtil.downloadIfChanged(new URL(versionInfo.downloads.get("server").url), minecraftServerJar, logger); + MinecraftVersionInfo.Downloads client = versionInfo.downloads.get("client"); + MinecraftVersionInfo.Downloads server = versionInfo.downloads.get("server"); + + HashedDownloadUtil.downloadIfInvalid(new URL(client.url), minecraftClientJar, client.sha1, logger, false); + HashedDownloadUtil.downloadIfInvalid(new URL(server.url), minecraftServerJar, server.sha1, logger, false); } private void mergeJars(Logger logger) throws IOException { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java index ba2d8271..810a34f3 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java @@ -97,7 +97,7 @@ public class MappingsProvider extends DependencyProvider { public void provide(DependencyInfo dependency, Consumer postPopulationScheduler) throws Exception { MinecraftProvider minecraftProvider = getDependencyManager().getProvider(MinecraftProvider.class); - getProject().getLogger().lifecycle(":setting up mappings (" + dependency.getDependency().getName() + " " + dependency.getResolvedVersion() + ")"); + getProject().getLogger().info(":setting up mappings (" + dependency.getDependency().getName() + " " + dependency.getResolvedVersion() + ")"); String version = dependency.getResolvedVersion(); File mappingsJar = dependency.resolveFile().orElseThrow(() -> new RuntimeException("Could not find yarn mappings: " + dependency)); @@ -105,6 +105,8 @@ public class MappingsProvider extends DependencyProvider { this.mappingsName = StringUtils.removeSuffix(dependency.getDependency().getGroup() + "." + dependency.getDependency().getName(), "-unmerged"); this.minecraftVersion = minecraftProvider.getMinecraftVersion(); + boolean isV2; + // Only do this for official yarn, there isn't really a way we can get the mc version for all mappings if (dependency.getDependency().getGroup() != null && dependency.getDependency().getGroup().equals("net.fabricmc") && dependency.getDependency().getName().equals("yarn") && dependency.getDependency().getVersion() != null) { String yarnVersion = dependency.getDependency().getVersion(); @@ -114,9 +116,13 @@ public class MappingsProvider extends DependencyProvider { if (!yarnMinecraftVersion.equalsIgnoreCase(minecraftVersion)) { throw new RuntimeException(String.format("Minecraft Version (%s) does not match yarn's minecraft version (%s)", minecraftVersion, yarnMinecraftVersion)); } + + // We can save reading the zip file + header by checking the file name + isV2 = mappingsJar.getName().endsWith("-v2.jar"); + } else { + isV2 = doesJarContainV2Mappings(mappingsJar.toPath()); } - boolean isV2 = doesJarContainV2Mappings(mappingsJar.toPath()); this.mappingsVersion = version + (isV2 ? "-v2" : ""); initFiles(); diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 0f2f94a9..a1bee96a 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -45,9 +45,6 @@ public abstract class AbstractRunTask extends JavaExec { super(); setGroup("fabric"); this.configProvider = config; - - classpath(getProject().getConfigurations().getByName("runtimeClasspath")); - classpath(this.getProject().getExtensions().getByType(LoomGradleExtension.class).getUnmappedModCollection()); } @Override @@ -56,6 +53,9 @@ public abstract class AbstractRunTask extends JavaExec { config = configProvider.apply(getProject()); } + classpath(getProject().getConfigurations().getByName("runtimeClasspath")); + classpath(this.getProject().getExtensions().getByType(LoomGradleExtension.class).getUnmappedModCollection()); + List argsSplit = new ArrayList<>(); String[] args = config.programArgs.split(" "); int partPos = -1; diff --git a/src/main/java/net/fabricmc/loom/util/Checksum.java b/src/main/java/net/fabricmc/loom/util/Checksum.java index c83623e2..1b38a051 100644 --- a/src/main/java/net/fabricmc/loom/util/Checksum.java +++ b/src/main/java/net/fabricmc/loom/util/Checksum.java @@ -37,21 +37,14 @@ public class Checksum { private static final Logger log = Logging.getLogger(Checksum.class); public static boolean equals(File file, String checksum) { - if (file == null) { + if (file == null || !file.exists()) { return false; } try { - //noinspection deprecation HashCode hash = Files.asByteSource(file).hash(Hashing.sha1()); - StringBuilder builder = new StringBuilder(); - - for (Byte hashBytes : hash.asBytes()) { - builder.append(Integer.toString((hashBytes & 0xFF) + 0x100, 16).substring(1)); - } - - log.debug("Checksum check: '" + builder.toString() + "' == '" + checksum + "'?"); - return builder.toString().equals(checksum); + log.debug("Checksum check: '" + hash.toString() + "' == '" + checksum + "'?"); + return hash.toString().equals(checksum); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/net/fabricmc/loom/util/DownloadUtil.java b/src/main/java/net/fabricmc/loom/util/DownloadUtil.java index 506adae8..9bb2b7e2 100644 --- a/src/main/java/net/fabricmc/loom/util/DownloadUtil.java +++ b/src/main/java/net/fabricmc/loom/util/DownloadUtil.java @@ -192,7 +192,7 @@ public class DownloadUtil { * @param bytes The number of bytes * @return The given number of bytes formatted to kilobytes, megabytes or gigabytes if appropriate */ - private static String toNiceSize(long bytes) { + public static String toNiceSize(long bytes) { if (bytes < 1024) { return bytes + " B"; } else if (bytes < 1024 * 1024) { diff --git a/src/main/java/net/fabricmc/loom/util/HashedDownloadUtil.java b/src/main/java/net/fabricmc/loom/util/HashedDownloadUtil.java new file mode 100644 index 00000000..da294b8e --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/HashedDownloadUtil.java @@ -0,0 +1,136 @@ +/* + * 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 java.io.File; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import javax.annotation.Nullable; + +import com.google.common.hash.Hashing; +import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.gradle.api.logging.Logger; + +import net.fabricmc.loom.LoomGradlePlugin; + +public class HashedDownloadUtil { + public static void downloadIfInvalid(URL from, File to, String expectedHash, Logger logger, boolean quiet) throws IOException { + if (LoomGradlePlugin.refreshDeps) { + delete(to); + } + + if (to.exists()) { + String sha1 = getSha1(to, logger); + + if (expectedHash.equals(sha1)) { + // The hash in the sha1 file matches + return; + } + } + + HttpURLConnection connection = (HttpURLConnection) from.openConnection(); + connection.setRequestProperty("Accept-Encoding", "gzip"); + connection.connect(); + + int code = connection.getResponseCode(); + + if ((code < 200 || code > 299) && code != HttpURLConnection.HTTP_NOT_MODIFIED) { + //Didn't get what we expected + throw new IOException(connection.getResponseMessage() + " for " + from); + } + + long contentLength = connection.getContentLengthLong(); + + if (!quiet && contentLength >= 0) { + logger.info("'{}' Changed, downloading {}", to, DownloadUtil.toNiceSize(contentLength)); + } + + try { // Try download to the output + FileUtils.copyInputStreamToFile(connection.getInputStream(), to); + } catch (IOException e) { + delete(to); // Probably isn't good if it fails to copy/save + throw e; + } + + if (!Checksum.equals(to, expectedHash)) { + String actualHash = Files.asByteSource(to).hash(Hashing.sha1()).toString(); + delete(to); + + throw new IOException(String.format("Downloaded file from %s to %s and got unexpected hash of %s expected %s", from, to, actualHash, expectedHash)); + } + + saveSha1(to, expectedHash, logger); + } + + private static File getSha1File(File file) { + return new File(file.getAbsoluteFile().getParentFile(), file.getName() + ".sha1"); + } + + @Nullable + private static String getSha1(File to, Logger logger) { + File sha1File = getSha1File(to); + + if (!sha1File.exists()) { + return null; + } + + try { + return Files.asCharSource(sha1File, StandardCharsets.UTF_8).read(); + } catch (IOException e) { + logger.warn("Error reading sha1 file '{}'.", sha1File); + return null; + } + } + + private static void saveSha1(File to, String sha1, Logger logger) { + File sha1File = getSha1File(to); + + try { + if (!sha1File.exists()) { + sha1File.createNewFile(); + } + + Files.asCharSink(sha1File, StandardCharsets.UTF_8).write(sha1); + } catch (IOException e) { + logger.warn("Error saving sha1 file '{}'.", sha1File, e); + } + } + + public static void delete(File file) { + if (file.exists()) { + file.delete(); + } + + File sha1File = getSha1File(file); + + if (sha1File.exists()) { + sha1File.delete(); + } + } +} From 841fc5a4dbbb713e7698f45e74104334caa4ba01 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 30 Dec 2020 20:12:33 +0000 Subject: [PATCH 14/18] Fix classifier handling for remapped dependencies --- .../loom/build/ModCompileRemapper.java | 14 ++++------ .../dependency/ModDependencyInfo.java | 28 +++++++++++++------ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 5fc7771e..8fe879a4 100644 --- a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -76,14 +76,13 @@ public class ModCompileRemapper { String group = artifact.getModuleVersion().getId().getGroup(); String name = artifact.getModuleVersion().getId().getName(); String version = artifact.getModuleVersion().getId().getVersion(); - String classifierSuffix = artifact.getClassifier() == null ? "" : (":" + artifact.getClassifier()); if (!isFabricMod(logger, artifact)) { addToRegularCompile(project, regularConfig, artifact); continue; } - ModDependencyInfo info = new ModDependencyInfo(group, name, version, classifierSuffix, artifact.getFile(), remappedConfig, remapData); + ModDependencyInfo info = new ModDependencyInfo(group, name, version, artifact.getClassifier(), artifact.getFile(), remappedConfig, remapData); if (refreshDeps) { info.forceRemap(); @@ -91,16 +90,16 @@ public class ModCompileRemapper { modDependencies.add(info); - String remappedLog = group + ":" + name + ":" + version + classifierSuffix + " (" + mappingsSuffix + ")"; + String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")"; project.getLogger().info(":providing " + remappedLog); - File remappedSources = new File(info.getRemappedOutput().getAbsolutePath().replace(".jar", "-sources.jar")); + File remappedSources = info.getRemappedOutput("sources"); if (!remappedSources.exists() || refreshDeps) { File sources = findSources(dependencies, artifact); if (sources != null) { - scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), info.getRemappedOutput(), modStore); + scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); } } } @@ -113,7 +112,7 @@ public class ModCompileRemapper { // Add all of the remapped mods onto the config for (ModDependencyInfo info : modDependencies) { - project.getDependencies().add(info.targetConfig.getName(), project.getDependencies().module(info.getRemappedNotation())); + project.getDependencies().add(info.targetConfig.getName(), info.getRemappedNotation()); } } } @@ -165,10 +164,9 @@ public class ModCompileRemapper { return null; } - private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, File remappedJar, File modStore) { + private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, File remappedSources) { project.getLogger().debug(":providing " + remappedLog + " sources"); - File remappedSources = new File(remappedJar.getAbsolutePath().replace(".jar", "-sources.jar")); boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); if (!remappedSources.exists() || sources.lastModified() <= 0 || sources.lastModified() > remappedSources.lastModified() || refreshDeps) { diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java index 1f6682f4..34720051 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/dependency/ModDependencyInfo.java @@ -36,6 +36,7 @@ import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.gradle.api.artifacts.Configuration; +import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.LoomGradlePlugin; @@ -43,6 +44,7 @@ public class ModDependencyInfo { private final String group; public final String name; public final String version; + @Nullable public final String classifier; public final File inputFile; public final Configuration targetConfig; @@ -51,7 +53,7 @@ public class ModDependencyInfo { private boolean forceRemap = false; - public ModDependencyInfo(String group, String name, String version, String classifier, File inputFile, Configuration targetConfig, RemapData remapData) { + public ModDependencyInfo(String group, String name, String version, @Nullable String classifier, File inputFile, Configuration targetConfig, RemapData remapData) { this.group = group; this.name = name; this.version = version; @@ -62,31 +64,35 @@ public class ModDependencyInfo { } public String getRemappedNotation() { - if (classifier == null || classifier.isEmpty()) { + if (!hasClassifier()) { return String.format("%s:%s:%s", getGroup(), name, version); } return String.format("%s:%s:%s:%s", getGroup(), name, version, classifier); } - private String getRemappedFilename() { - if (classifier == null || classifier.isEmpty()) { + public String getRemappedFilename(boolean withClassifier) { + if (!hasClassifier() || !withClassifier) { return String.format("%s-%s", name, version); } - return String.format("%s-%s@%s", name, version, classifier.replace(':', '-')); + return String.format("%s-%s-%s", name, version, classifier); } - private File getRemappedDir() { + public File getRemappedDir() { return new File(remapData.modStore, String.format("%s/%s/%s", getGroup().replace(".", "/"), name, version)); } public File getRemappedOutput() { - return new File(getRemappedDir(), getRemappedFilename() + ".jar"); + return new File(getRemappedDir(), getRemappedFilename(true) + ".jar"); + } + + public File getRemappedOutput(String classifier) { + return new File(getRemappedDir(), getRemappedFilename(false) + "-" + classifier + ".jar"); } private File getRemappedPom() { - return new File(getRemappedOutput().getAbsolutePath().replace(".jar", ".pom")); + return new File(getRemappedDir(), String.format("%s-%s", name, version) + ".pom"); } private String getGroup() { @@ -135,7 +141,11 @@ public class ModDependencyInfo { @Override public String toString() { - return String.format("%s:%s:%s:%s", group, name, version, classifier); + return getRemappedNotation(); + } + + public boolean hasClassifier() { + return classifier != null && !classifier.isEmpty(); } public String getAccessWidener() throws IOException { From 11b62989e7887912542e633302bd6e693832790f Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 30 Dec 2020 20:34:34 +0000 Subject: [PATCH 15/18] Cleanup output files when remap fails. Fixes #321 --- .../net/fabricmc/loom/build/ModCompileRemapper.java | 11 +++-------- .../java/net/fabricmc/loom/util/SourceRemapper.java | 7 ++++++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 8fe879a4..c257a69d 100644 --- a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -107,6 +107,8 @@ public class ModCompileRemapper { try { ModProcessor.processMods(project, modDependencies); } catch (IOException e) { + // Failed to remap, lets clean up to ensure we try again next time + modDependencies.forEach(info -> info.getRemappedOutput().delete()); throw new RuntimeException("Failed to remap mods", e); } @@ -170,14 +172,7 @@ public class ModCompileRemapper { boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); if (!remappedSources.exists() || sources.lastModified() <= 0 || sources.lastModified() > remappedSources.lastModified() || refreshDeps) { - try { - sourceRemapper.scheduleRemapSources(sources, remappedSources, false, true); // Depenedency sources are used in ide only so don't need to be reproducable - - // Set the remapped sources creation date to match the sources if we're likely succeeded in making it - remappedSources.setLastModified(sources.lastModified()); - } catch (Exception e) { - e.printStackTrace(); - } + sourceRemapper.scheduleRemapSources(sources, remappedSources, false, true); // Depenedency sources are used in ide only so don't need to be reproducable } else { project.getLogger().info(remappedSources.getName() + " is up to date with " + sources.getName()); } diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index e7a5bef6..46642254 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -72,13 +72,18 @@ public class SourceRemapper { scheduleRemapSources(source, destination, false, true); // Not reproducable by default, old behavior } - public void scheduleRemapSources(File source, File destination, boolean reproducibleFileOrder, boolean preserveFileTimestamps) throws Exception { + public void scheduleRemapSources(File source, File destination, boolean reproducibleFileOrder, boolean preserveFileTimestamps) { remapTasks.add((logger) -> { try { logger.progress("remapping sources - " + source.getName()); remapSourcesInner(source, destination); ZipReprocessorUtil.reprocessZip(destination, reproducibleFileOrder, preserveFileTimestamps); + + // Set the remapped sources creation date to match the sources if we're likely succeeded in making it + destination.setLastModified(source.lastModified()); } catch (Exception e) { + // Failed to remap, lets clean up to ensure we try again next time + destination.delete(); throw new RuntimeException("Failed to remap sources for " + source, e); } }); From 1007c55ad69cb7f071a304ea8c90343c5c202c06 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 3 Jan 2021 21:39:45 +0000 Subject: [PATCH 16/18] Improve the readme a little. Feel free to improve via PRs --- README.md | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 968e67ff..f2c5d76f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,30 @@ -# fabric-loom -Gradle plugin for Fabric +# Fabric Loom -Usage: `gradlew setup idea` -(Use `./gradle` on macOS and Linux) +A [Gradle](https://gradle.org/) plugin to setup a deobfuscated development environment for minecraft mods. Primarily used in the Fabric toolchain. +* Has built in support for tiny mappings (Used by [Yarn](https://github.com/FabricMC/yarn)) +* Utilises the Fernflower and CFR decompilers to generate source code with comments. +* Designed to support modern versions of Minecraft (Tested with 1.14.4 and upwards) +* Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for minecraft. +* Loom target a wide range of Gradle versions. _Tested with 4.9 up to 6.7_ +* Supports the latest version of Java all the way down to java 8 + +## Use Loom to develop mods + +To get started developing your own mods please follow the guide on [Setting up a mod development environment](https://fabricmc.net/wiki/tutorial:setup). + +## Debugging loom (Only needed if you want to work on loom its self) + +_This guide assumes you are using IntelliJ IDEA, other IDE's have not been tested; your experience may vary._ + +1. Import as a Gradle project by opening the build.gradle +2. Create a Gradle run configuration to run the following tasks `build publishToMavenLocal -x test`. This will build loom and publish to a local maven repo without running the test suite. You can run it now. +3. Prepare a project for using the local version of loom: + * A good starting point is to clone the [fabric-example-mod](https://github.com/FabricMC/fabric-example-mod) into your working directory + * Add `mavenLocal()` to the buildscript repositories, usually found in `settings.gradle` or at the top of the `build.gradle` file + * Change the loom version to `0.6.local`. For example `id 'fabric-loom' version '0.6.local'` +4. Create a Gradle run configuration: + * Set the Gradle project path to the project you have just configured above + * Set some tasks to run, such as `clean build` you can change these to suit your needs. + * Add the run configuration you created earlier to the "Before Launch" section to rebuild loom each time you debug +5. You should now be able to run the configuration in debug mode, with working breakpoints. From e61f3fb3629451a7ad4a24526668e720989d3211 Mon Sep 17 00:00:00 2001 From: Juuxel <6596629+Juuxel@users.noreply.github.com> Date: Sun, 3 Jan 2021 23:53:39 +0200 Subject: [PATCH 17/18] Improve debugging repo instructions and fix typos (#323) * Improve debugging repo instructions and fix typos * Fix typo in README --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f2c5d76f..93930f02 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,29 @@ # Fabric Loom -A [Gradle](https://gradle.org/) plugin to setup a deobfuscated development environment for minecraft mods. Primarily used in the Fabric toolchain. +A [Gradle](https://gradle.org/) plugin to setup a deobfuscated development environment for Minecraft mods. Primarily used in the Fabric toolchain. * Has built in support for tiny mappings (Used by [Yarn](https://github.com/FabricMC/yarn)) * Utilises the Fernflower and CFR decompilers to generate source code with comments. * Designed to support modern versions of Minecraft (Tested with 1.14.4 and upwards) -* Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for minecraft. -* Loom target a wide range of Gradle versions. _Tested with 4.9 up to 6.7_ -* Supports the latest version of Java all the way down to java 8 +* Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for Minecraft. +* Loom targets a wide range of Gradle versions. _Tested with 4.9 up to 6.7_ +* Supports the latest version of Java all the way down to Java 8 ## Use Loom to develop mods To get started developing your own mods please follow the guide on [Setting up a mod development environment](https://fabricmc.net/wiki/tutorial:setup). -## Debugging loom (Only needed if you want to work on loom its self) +## Debugging Loom (Only needed if you want to work on Loom itself) _This guide assumes you are using IntelliJ IDEA, other IDE's have not been tested; your experience may vary._ 1. Import as a Gradle project by opening the build.gradle -2. Create a Gradle run configuration to run the following tasks `build publishToMavenLocal -x test`. This will build loom and publish to a local maven repo without running the test suite. You can run it now. -3. Prepare a project for using the local version of loom: +2. Create a Gradle run configuration to run the following tasks `build publishToMavenLocal -x test`. This will build Loom and publish to a local maven repo without running the test suite. You can run it now. +3. Prepare a project for using the local version of Loom: * A good starting point is to clone the [fabric-example-mod](https://github.com/FabricMC/fabric-example-mod) into your working directory - * Add `mavenLocal()` to the buildscript repositories, usually found in `settings.gradle` or at the top of the `build.gradle` file + * Add `mavenLocal()` to the repositories: + * If you're using `id 'fabric-loom'` inside `plugins`, the correct `repositories` block is inside `pluginManagement` in settings.gradle + * If you're using `apply plugin:` for Loom, the correct `repositories` block is inside `buildscript` in build.gradle * Change the loom version to `0.6.local`. For example `id 'fabric-loom' version '0.6.local'` 4. Create a Gradle run configuration: * Set the Gradle project path to the project you have just configured above From 9de836b2c45dc3cac7469f5f9ac6b1ddfec9ac79 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 7 Jan 2021 20:35:09 +0000 Subject: [PATCH 18/18] Remove usage of internal kotlin class, should fix crash with kotlin 1.4. Closes #324 --- .../fabricmc/loom/build/mixin/KaptApInvoker.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java index 668a7741..41d6d0ba 100644 --- a/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java @@ -35,9 +35,9 @@ import java.util.stream.Collectors; import kotlin.Unit; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.compile.JavaCompile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin; import org.jetbrains.kotlin.gradle.plugin.KaptExtension; import net.fabricmc.loom.LoomGradleExtension; @@ -92,10 +92,19 @@ public class KaptApInvoker extends AnnotationProcessorInvoker { // Kapt generates an AP configuration for every source set based off of the getKaptConfigurationName method. return AnnotationProcessorInvoker.getNonTestSourceSets(project) .map(sourceSet -> project.getConfigurations() - .getByName(Kapt3KotlinGradleSubplugin.Companion.getKaptConfigurationName(sourceSet.getName())) + .getByName(getKaptConfigurationName(sourceSet.getName())) ).collect(Collectors.toList()); } + // Pulled out from the internal class: https://github.com/JetBrains/kotlin/blob/33a0ec9b4f40f3d6f1f96b2db504ade4c2fafe03/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt#L92 + private static String getKaptConfigurationName(String sourceSetName) { + if (!sourceSetName.equals(SourceSet.MAIN_SOURCE_SET_NAME)) { + return "kapt" + (sourceSetName.substring(0, 1).toUpperCase() + sourceSetName.substring(1)); + } + + return "kapt"; + } + @Override protected void passArgument(JavaCompile compileTask, String key, String value) { // Note: this MUST be run early on, before kapt uses this data, and there is only a point to setting the value once since