aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/configuration
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-04-04 19:30:51 +0800
committershedaniel <daniel@shedaniel.me>2021-04-04 19:30:51 +0800
commitad1754a932ef0c6b2134f5d717f6e55f692d85ee (patch)
treee46d6f443b4b68698d494dc5de4aec71a0f74bd2 /src/main/java/net/fabricmc/loom/configuration
parent8bf5870c7f2d2cae6efe79ea46230e633db1e9c3 (diff)
parent98731532d57d31e3084ef932cce2435d872772c2 (diff)
downloadarchitectury-loom-ad1754a932ef0c6b2134f5d717f6e55f692d85ee.tar.gz
architectury-loom-ad1754a932ef0c6b2134f5d717f6e55f692d85ee.tar.bz2
architectury-loom-ad1754a932ef0c6b2134f5d717f6e55f692d85ee.zip
Merge remote-tracking branch 'FabricMC/dev/0.7' into dev/0.7-forge
# Conflicts: # .github/workflows/test-push.yml # build.gradle # src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java # src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java # src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java # src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java # src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java # src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java # src/main/java/net/fabricmc/loom/decompilers/fernflower/AbstractFernFlowerDecompiler.java # src/main/java/net/fabricmc/loom/decompilers/fernflower/ForkingJavaExec.java # src/main/java/net/fabricmc/loom/task/RemapJarTask.java # src/main/java/net/fabricmc/loom/util/GroovyXmlUtil.java # src/main/java/net/fabricmc/loom/util/HashedDownloadUtil.java # src/test/groovy/net/fabricmc/loom/BuildUtils.groovy
Diffstat (limited to 'src/main/java/net/fabricmc/loom/configuration')
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java207
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java57
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java159
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java2
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java3
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProvider.java76
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java10
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java6
8 files changed, 325 insertions, 195 deletions
diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java
index 01310e6d..23de41b2 100644
--- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java
+++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java
@@ -24,17 +24,8 @@
package net.fabricmc.loom.configuration;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.common.collect.ImmutableMap;
-import org.gradle.api.Action;
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.repositories.MavenArtifactRepository;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSet;
@@ -43,8 +34,6 @@ import org.gradle.api.tasks.bundling.Jar;
import org.gradle.api.tasks.javadoc.Javadoc;
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;
@@ -58,17 +47,8 @@ import net.fabricmc.loom.configuration.providers.forge.McpConfigProvider;
import net.fabricmc.loom.configuration.providers.forge.PatchProvider;
import net.fabricmc.loom.configuration.providers.forge.SrgProvider;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider;
-import net.fabricmc.loom.task.AbstractLoomTask;
-import net.fabricmc.loom.task.GenVsCodeProjectTask;
-import net.fabricmc.loom.task.RemapAllSourcesTask;
-import net.fabricmc.loom.task.RemapJarTask;
-import net.fabricmc.loom.task.RemapSourcesJarTask;
import net.fabricmc.loom.util.Constants;
-import net.fabricmc.loom.util.SourceRemapper;
-/**
- * Add Minecraft dependencies to compile time.
- */
public final class CompileConfiguration {
private CompileConfiguration() {
}
@@ -121,9 +101,13 @@ public final class CompileConfiguration {
Configuration includeConfig = project.getConfigurations().maybeCreate(Constants.Configurations.INCLUDE);
includeConfig.setTransitive(false); // Dont get transitive deps
+ project.getConfigurations().maybeCreate(Constants.Configurations.MAPPING_CONSTANTS);
+ extendsFrom(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME, Constants.Configurations.MAPPING_CONSTANTS, project);
+
project.getConfigurations().maybeCreate(Constants.Configurations.MAPPINGS);
project.getConfigurations().maybeCreate(Constants.Configurations.MAPPINGS_FINAL);
project.getConfigurations().maybeCreate(Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES);
+ project.getConfigurations().maybeCreate(Constants.Configurations.UNPICK_CLASSPATH);
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
Configuration compileModsConfig = project.getConfigurations().maybeCreate(entry.getSourceConfiguration());
@@ -152,75 +136,18 @@ public final class CompileConfiguration {
extendsFrom(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES, project);
}
- /**
- * Permit to add a Maven repository to a target project.
- *
- * @param target The target project
- * @param name The name of the repository
- * @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 static MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) {
- return addMavenRepo(target, name, url, repo -> {
- });
- }
-
- public static MavenArtifactRepository addMavenRepo(Project target, final String name, final String url, final Action<MavenArtifactRepository> action) {
- return target.getRepositories().maven(repo -> {
- repo.setName(name);
- repo.setUrl(url);
- action.execute(repo);
- });
- }
-
- public static void configureCompile(Project project) {
- JavaPluginConvention javaModule = (JavaPluginConvention) project.getConvention().getPlugins().get("java");
+ public static void configureCompile(Project p) {
+ JavaPluginConvention javaModule = (JavaPluginConvention) p.getConvention().getPlugins().get("java");
SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
- Javadoc javadoc = (Javadoc) project.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME);
+ Javadoc javadoc = (Javadoc) p.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME);
javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath()));
- project.afterEvaluate(project1 -> {
- LoomGradleExtension extension = project1.getExtensions().getByType(LoomGradleExtension.class);
-
- project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> {
- flatDirectoryArtifactRepository.dir(extension.getRootProjectBuildCache());
- flatDirectoryArtifactRepository.setName("UserLocalCacheFiles");
- });
-
- project1.getRepositories().maven(mavenArtifactRepository -> {
- mavenArtifactRepository.setUrl(extension.getRemappedModCache());
- mavenArtifactRepository.setName("UserLocalRemappedMods");
- });
-
- project1.getRepositories().maven(mavenArtifactRepository -> {
- mavenArtifactRepository.setName("Fabric");
- mavenArtifactRepository.setUrl("https://maven.fabricmc.net/");
- });
-
- project1.getRepositories().maven(mavenArtifactRepository -> {
- mavenArtifactRepository.setName("Mojang");
- mavenArtifactRepository.setUrl("https://libraries.minecraft.net/");
- });
-
- project1.getRepositories().maven(mavenArtifactRepository -> {
- mavenArtifactRepository.setName("Forge");
- mavenArtifactRepository.setUrl("https://files.minecraftforge.net/maven/");
-
- mavenArtifactRepository.metadataSources(sources -> {
- sources.mavenPom();
-
- try {
- MavenArtifactRepository.MetadataSources.class.getDeclaredMethod("ignoreGradleMetadataRedirection")
- .invoke(sources);
- } catch (Throwable ignored) {
- // Method not available
- }
- });
- });
+ p.afterEvaluate(project -> {
+ LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
- project1.getRepositories().mavenCentral();
+ MavenConfiguration.setup(project);
LoomDependencyManager dependencyManager = new LoomDependencyManager();
extension.setDependencyManager(dependencyManager);
@@ -245,118 +172,20 @@ public final class CompileConfiguration {
dependencyManager.addProvider(new MappingsProvider(project));
dependencyManager.addProvider(new LaunchProvider(project));
- dependencyManager.handleDependencies(project1);
+ dependencyManager.handleDependencies(project);
- project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace"));
- project1.getTasks().getByName("eclipse").finalizedBy(project1.getTasks().getByName("genEclipseRuns"));
- project1.getTasks().getByName("cleanEclipse").finalizedBy(project1.getTasks().getByName("cleanEclipseRuns"));
+ project.getTasks().getByName("idea").finalizedBy(project.getTasks().getByName("genIdeaWorkspace"));
+ project.getTasks().getByName("eclipse").finalizedBy(project.getTasks().getByName("genEclipseRuns"));
+ project.getTasks().getByName("cleanEclipse").finalizedBy(project.getTasks().getByName("cleanEclipseRuns"));
- SetupIntelijRunConfigs.setup(project1);
+ SetupIntelijRunConfigs.setup(project);
GenVsCodeProjectTask.generate(project1);
// Enables the default mod remapper
if (extension.remapMod) {
- AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar");
- RemapJarTask remapJarTask = (RemapJarTask) project1.getTasks().findByName("remapJar");
-
- assert remapJarTask != null;
-
- if (!remapJarTask.getInput().isPresent()) {
- jarTask.setClassifier("dev");
- remapJarTask.setClassifier("");
- remapJarTask.getInput().set(jarTask.getArchivePath());
- }
-
- if (extension.isForge()) {
- remapJarTask.getToM().set("srg");
- ((Jar) jarTask).manifest(manifest -> {
- List<String> configs = new ArrayList<>();
-
- if (extension.mixinConfig != null) {
- configs.add(extension.mixinConfig);
- }
-
- if (extension.mixinConfigs != null) {
- configs.addAll(extension.mixinConfigs);
- }
-
- manifest.attributes(ImmutableMap.of("MixinConfigs", String.join(",", configs)));
- });
- }
-
- extension.getUnmappedModCollection().from(jarTask);
- remapJarTask.getAddNestedDependencies().set(true);
- remapJarTask.getRemapAccessWidener().set(true);
-
- project1.getArtifacts().add("archives", remapJarTask);
- remapJarTask.dependsOn(jarTask);
- project1.getTasks().getByName("build").dependsOn(remapJarTask);
-
- 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");
-
- if (extension.isShareCaches()) {
- Project rootProject = project.getRootProject();
-
- if (extension.isRootProject()) {
- SourceRemapper sourceRemapper = new SourceRemapper(rootProject, false);
- JarRemapper jarRemapper = new JarRemapper();
-
- remapJarTask.jarRemapper = jarRemapper;
-
- rootProject.getTasks().register("remapAllSources", RemapAllSourcesTask.class, task -> {
- task.sourceRemapper = sourceRemapper;
- task.doLast(t -> sourceRemapper.remapAll());
- });
-
- parentTask = rootProject.getTasks().getByName("remapAllSources");
-
- rootProject.getTasks().register("remapAllJars", AbstractLoomTask.class, task -> {
- task.doLast(t -> {
- try {
- jarRemapper.remap(rootProject);
- } catch (IOException e) {
- throw new RuntimeException("Failed to remap jars", e);
- }
- });
- });
- } else {
- parentTask = rootProject.getTasks().getByName("remapAllSources");
- remapper = ((RemapAllSourcesTask) parentTask).sourceRemapper;
-
- remapJarTask.jarRemapper = ((RemapJarTask) rootProject.getTasks().getByName("remapJar")).jarRemapper;
-
- project1.getTasks().getByName("build").dependsOn(parentTask);
- project1.getTasks().getByName("build").dependsOn(rootProject.getTasks().getByName("remapAllJars"));
- rootProject.getTasks().getByName("remapAllJars").dependsOn(project1.getTasks().getByName("remapJar"));
- }
- }
-
- try {
- AbstractArchiveTask sourcesTask = (AbstractArchiveTask) project1.getTasks().getByName("sourcesJar");
-
- RemapSourcesJarTask remapSourcesJarTask = (RemapSourcesJarTask) project1.getTasks().findByName("remapSourcesJar");
- remapSourcesJarTask.setInput(sourcesTask.getArchivePath());
- remapSourcesJarTask.setOutput(sourcesTask.getArchivePath());
- remapSourcesJarTask.doLast(task -> project1.getArtifacts().add("archives", remapSourcesJarTask.getOutput()));
- remapSourcesJarTask.dependsOn(project1.getTasks().getByName("sourcesJar"));
-
- if (extension.isShareCaches()) {
- remapSourcesJarTask.setSourceRemapper(remapper);
- }
-
- parentTask.dependsOn(remapSourcesJarTask);
- } catch (UnknownTaskException ignored) {
- // pass
- }
+ RemapConfiguration.setupDefaultRemap(project);
} else {
- AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar");
+ AbstractArchiveTask jarTask = (AbstractArchiveTask) project.getTasks().getByName("jar");
extension.getUnmappedModCollection().from(jarTask);
}
@@ -379,7 +208,7 @@ public final class CompileConfiguration {
}
});
- if (project.getPluginManager().hasPlugin("org.jetbrains.kotlin.kapt")) {
+ if (p.getPluginManager().hasPlugin("org.jetbrains.kotlin.kapt")) {
// If loom is applied after kapt, then kapt will use the AP arguments too early for loom to pass the arguments we need for mixin.
throw new IllegalArgumentException("fabric-loom must be applied BEFORE kapt in the plugins { } block.");
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java
new file mode 100644
index 00000000..2fb2ae7c
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java
@@ -0,0 +1,57 @@
+/*
+ * 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 org.gradle.api.Project;
+
+import net.fabricmc.loom.LoomGradleExtension;
+
+public class MavenConfiguration {
+ public static void setup(Project project) {
+ LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
+
+ project.getRepositories().flatDir(repo -> {
+ repo.setName("UserLocalCacheFiles");
+ repo.dir(extension.getRootProjectBuildCache());
+ });
+
+ project.getRepositories().maven(repo -> {
+ repo.setName("UserLocalRemappedMods");
+ repo.setUrl(extension.getRemappedModCache());
+ });
+
+ project.getRepositories().maven(repo -> {
+ repo.setName("Fabric");
+ repo.setUrl("https://maven.fabricmc.net/");
+ });
+
+ project.getRepositories().maven(repo -> {
+ repo.setName("Mojang");
+ repo.setUrl("https://libraries.minecraft.net/");
+ });
+
+ project.getRepositories().mavenCentral();
+ }
+}
diff --git a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java
new file mode 100644
index 00000000..7534c27b
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java
@@ -0,0 +1,159 @@
+/*
+ * 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.io.IOException;
+
+import com.google.common.base.Preconditions;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.UnknownTaskException;
+import org.gradle.api.plugins.JavaPlugin;
+import org.gradle.api.tasks.bundling.AbstractArchiveTask;
+import org.jetbrains.annotations.ApiStatus;
+
+import net.fabricmc.loom.LoomGradleExtension;
+import net.fabricmc.loom.build.JarRemapper;
+import net.fabricmc.loom.build.nesting.NestedDependencyProvider;
+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.util.SourceRemapper;
+
+public class RemapConfiguration {
+ private static final String DEFAULT_JAR_TASK_NAME = JavaPlugin.JAR_TASK_NAME;
+ private static final String DEFAULT_SOURCES_JAR_TASK_NAME = "sourcesJar";
+ private static final String DEFAULT_REMAP_JAR_TASK_NAME = "remapJar";
+ private static final String DEFAULT_REMAP_SOURCES_JAR_TASK_NAME = "remapSourcesJar";
+ private static final String DEFAULT_REMAP_ALL_JARS_TASK_NAME = "remapAllJars";
+ private static final String DEFAULT_REMAP_ALL_SOURCES_TASK_NAME = "remapAllSources";
+
+ public static void setupDefaultRemap(Project project) {
+ setupRemap(project, true, DEFAULT_JAR_TASK_NAME, DEFAULT_SOURCES_JAR_TASK_NAME, DEFAULT_REMAP_JAR_TASK_NAME, DEFAULT_REMAP_SOURCES_JAR_TASK_NAME, DEFAULT_REMAP_ALL_JARS_TASK_NAME, DEFAULT_REMAP_ALL_SOURCES_TASK_NAME);
+ }
+
+ @ApiStatus.Experimental // This is only an api if you squint really hard, expect it to explode every 5 mins. If you must call in afterEvaluate on all projects
+ public static void setupRemap(Project project, String jarTaskName, String sourcesJarTaskName, String remapJarTaskName, String remapSourcesJarTaskName, String remapAllJarsTaskName, String remapAllSourcesTaskName) {
+ setupRemap(project, false, jarTaskName, sourcesJarTaskName, remapJarTaskName, remapSourcesJarTaskName, remapAllJarsTaskName, remapAllSourcesTaskName);
+ }
+
+ // isDefaultRemap is set to true for the standard remap task, some defaults are left out when this is false.
+ private static void setupRemap(Project project, boolean isDefaultRemap, String jarTaskName, String sourcesJarTaskName, String remapJarTaskName, String remapSourcesJarTaskName, String remapAllJarsTaskName, String remapAllSourcesTaskName) {
+ LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
+ AbstractArchiveTask jarTask = (AbstractArchiveTask) project.getTasks().getByName(jarTaskName);
+ RemapJarTask remapJarTask = (RemapJarTask) project.getTasks().findByName(remapJarTaskName);
+
+ assert remapJarTask != null;
+
+ if (!remapJarTask.getInput().isPresent() && isDefaultRemap) {
+ jarTask.setClassifier("dev");
+ remapJarTask.setClassifier("");
+ remapJarTask.getInput().set(jarTask.getArchivePath());
+ }
+
+ if (isDefaultRemap) {
+ extension.getUnmappedModCollection().from(jarTask);
+ remapJarTask.getAddNestedDependencies().set(true);
+ remapJarTask.getRemapAccessWidener().set(true);
+
+ project.getArtifacts().add("archives", remapJarTask);
+ }
+
+ remapJarTask.dependsOn(jarTask);
+ project.getTasks().getByName("build").dependsOn(remapJarTask);
+
+ // TODO this might be wrong?
+ project.getTasks().withType(RemapJarTask.class).forEach(task -> {
+ if (task.getAddNestedDependencies().getOrElse(false)) {
+ NestedDependencyProvider.getRequiredTasks(project).forEach(task::dependsOn);
+ }
+ });
+
+ SourceRemapper remapper = null;
+ // TODO what is this for?
+ Task parentTask = project.getTasks().getByName("build");
+
+ if (extension.isShareCaches()) {
+ Project rootProject = project.getRootProject();
+
+ if (extension.isRootProject()) {
+ SourceRemapper sourceRemapper = new SourceRemapper(rootProject, false);
+ JarRemapper jarRemapper = new JarRemapper();
+
+ remapJarTask.jarRemapper = jarRemapper;
+
+ rootProject.getTasks().register(remapAllSourcesTaskName, RemapAllSourcesTask.class, task -> {
+ task.sourceRemapper = sourceRemapper;
+ task.doLast(t -> sourceRemapper.remapAll());
+ });
+
+ parentTask = rootProject.getTasks().getByName(remapAllSourcesTaskName);
+
+ rootProject.getTasks().register(remapAllJarsTaskName, AbstractLoomTask.class, task -> {
+ task.doLast(t -> {
+ try {
+ jarRemapper.remap();
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to remap jars", e);
+ }
+ });
+ });
+ } else {
+ parentTask = rootProject.getTasks().getByName(remapAllSourcesTaskName);
+ remapper = ((RemapAllSourcesTask) parentTask).sourceRemapper;
+ Preconditions.checkNotNull(remapper);
+
+ remapJarTask.jarRemapper = ((RemapJarTask) rootProject.getTasks().getByName(remapJarTaskName)).jarRemapper;
+
+ project.getTasks().getByName("build").dependsOn(parentTask);
+ project.getTasks().getByName("build").dependsOn(rootProject.getTasks().getByName(remapAllJarsTaskName));
+ rootProject.getTasks().getByName(remapAllJarsTaskName).dependsOn(project.getTasks().getByName(remapJarTaskName));
+ }
+ }
+
+ try {
+ AbstractArchiveTask sourcesTask = (AbstractArchiveTask) project.getTasks().getByName(sourcesJarTaskName);
+
+ RemapSourcesJarTask remapSourcesJarTask = (RemapSourcesJarTask) project.getTasks().findByName(remapSourcesJarTaskName);
+ Preconditions.checkNotNull(remapSourcesJarTask, "Could not find " + remapSourcesJarTaskName + " in " + project.getName());
+ remapSourcesJarTask.setInput(sourcesTask.getArchivePath());
+ remapSourcesJarTask.setOutput(sourcesTask.getArchivePath());
+ remapSourcesJarTask.dependsOn(project.getTasks().getByName(sourcesJarTaskName));
+
+ if (isDefaultRemap) {
+ remapSourcesJarTask.doLast(task -> project.getArtifacts().add("archives", remapSourcesJarTask.getOutput()));
+ }
+
+ if (extension.isShareCaches()) {
+ remapSourcesJarTask.setSourceRemapper(remapper);
+ }
+
+ parentTask.dependsOn(remapSourcesJarTask);
+ } catch (UnknownTaskException ignored) {
+ // pass
+ }
+ }
+}
diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
index 8bbca4fa..603de2db 100644
--- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
+++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
@@ -69,6 +69,7 @@ public class RunConfig {
public String programArgs;
public List<String> vscodeBeforeRun = new ArrayList<>();
public final Map<String, String> envVariables = new HashMap<>();
+ public SourceSet sourceSet;
public Element genRuns(Element doc) {
Element root = this.addXml(doc, "component", ImmutableMap.of("name", "ProjectRunConfigurationManager"));
@@ -235,6 +236,7 @@ public class RunConfig {
runConfig.ideaModuleName = getIdeaModuleName(project, sourceSet);
runConfig.runDirIdeaUrl = "file://$PROJECT_DIR$/" + runDir;
runConfig.runDir = runDir;
+ runConfig.sourceSet = sourceSet;
// Custom parameters
for (String progArg : settings.getProgramArgs()) {
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 b2cb1f49..226f3f17 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProvider.java
@@ -110,7 +110,8 @@ public class MinecraftProvider extends DependencyProvider {
try {
mergeJars(getProject().getLogger());
} catch (ZipError e) {
- deleteFiles();
+ HashedDownloadUtil.delete(minecraftClientJar);
+ HashedDownloadUtil.delete(minecraftServerJar);
getProject().getLogger().error("Could not merge JARs! Deleting source JARs - please re-run the command and move on.", e);
throw new RuntimeException();
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 df5aa108..40ae05d0 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
@@ -28,6 +28,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
@@ -41,6 +42,7 @@ import java.util.function.Consumer;
import com.google.common.base.Preconditions;
import com.google.common.net.UrlEscapers;
+import com.google.gson.JsonObject;
import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.util.StringUtils;
import org.gradle.api.Project;
@@ -50,6 +52,7 @@ import org.zeroturnaround.zip.ZipEntrySource;
import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension;
+import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.configuration.DependencyProvider;
import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor;
import net.fabricmc.loom.configuration.processors.JarProcessorManager;
@@ -95,6 +98,10 @@ public class MappingsProvider extends DependencyProvider {
public File mixinTinyMappingsWithSrg; // FORGE: The mixin mappings have srg names in intermediary.
public File srgToNamedSrg; // FORGE: srg to named in srg file format
+ private File unpickDefinitionsFile;
+ private boolean hasUnpickDefinitions;
+ private UnpickMetadata unpickMetadata;
+
public MappingsProvider(Project project) {
super(project);
mappingsDir = getExtension().getUserCache().toPath().resolve("mappings");
@@ -173,6 +180,7 @@ public class MappingsProvider extends DependencyProvider {
}
tinyMappings = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + ".tiny").toFile();
+ unpickDefinitionsFile = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + ".unpick").toFile();
tinyMappingsJar = new File(getExtension().getUserCache(), mappingsJar.getName().replace(".jar", "-" + jarClassifier + ".jar"));
tinyMappingsWithSrg = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + "-srg.tiny");
mixinTinyMappingsWithSrg = mappingsDir.resolve(StringUtils.removeSuffix(mappingsJar.getName(), ".jar") + "-mixin-srg.tiny").toFile();
@@ -180,12 +188,27 @@ public class MappingsProvider extends DependencyProvider {
if (!tinyMappings.exists() || isRefreshDeps()) {
storeMappings(getProject(), minecraftProvider, mappingsJar.toPath(), postPopulationScheduler);
+ } else {
+ try (FileSystem fileSystem = FileSystems.newFileSystem(mappingsJar.toPath(), (ClassLoader) null)) {
+ extractUnpickDefinitions(fileSystem, unpickDefinitionsFile.toPath());
+ }
}
if (!tinyMappingsJar.exists() || isRefreshDeps()) {
ZipUtil.pack(new ZipEntrySource[] {new FileSource("mappings/mappings.tiny", tinyMappings)}, tinyMappingsJar);
}
+ if (hasUnpickDefinitions()) {
+ String notation = String.format("%s:%s:%s:constants",
+ dependency.getDependency().getGroup(),
+ dependency.getDependency().getName(),
+ dependency.getDependency().getVersion()
+ );
+
+ getProject().getDependencies().add(Constants.Configurations.MAPPING_CONSTANTS, notation);
+ populateUnpickClasspath();
+ }
+
if (getExtension().shouldGenerateSrgTiny()) {
if (Files.notExists(tinyMappingsWithSrg) || isRefreshDeps()) {
SrgMerger.mergeSrg(getExtension().getSrgProvider().getSrg().toPath(), tinyMappings.toPath(), tinyMappingsWithSrg, true);
@@ -248,6 +271,7 @@ public class MappingsProvider extends DependencyProvider {
try (FileSystem fileSystem = FileSystems.newFileSystem(yarnJar, (ClassLoader) null)) {
extractMappings(fileSystem, baseTinyMappings);
+ extractUnpickDefinitions(fileSystem, unpickDefinitionsFile.toPath());
}
if (baseMappingsAreV2()) {
@@ -317,6 +341,40 @@ public class MappingsProvider extends DependencyProvider {
Files.copy(jar.getPath("mappings/mappings.tiny"), extractTo, StandardCopyOption.REPLACE_EXISTING);
}
+ private void extractUnpickDefinitions(FileSystem jar, Path extractTo) throws IOException {
+ Path unpickPath = jar.getPath("extras/definitions.unpick");
+ Path unpickMetadataPath = jar.getPath("extras/unpick.json");
+
+ if (!Files.exists(unpickPath) || !Files.exists(unpickMetadataPath)) {
+ return;
+ }
+
+ Files.copy(unpickPath, extractTo, StandardCopyOption.REPLACE_EXISTING);
+
+ unpickMetadata = parseUnpickMetadata(unpickMetadataPath);
+ hasUnpickDefinitions = true;
+ }
+
+ private UnpickMetadata parseUnpickMetadata(Path input) throws IOException {
+ JsonObject jsonObject = LoomGradlePlugin.GSON.fromJson(new String(Files.readAllBytes(input), StandardCharsets.UTF_8), JsonObject.class);
+
+ if (!jsonObject.has("version") || jsonObject.get("version").getAsInt() != 1) {
+ throw new UnsupportedOperationException("Unsupported unpick version");
+ }
+
+ return new UnpickMetadata(
+ jsonObject.get("unpickGroup").getAsString(),
+ jsonObject.get("unpickVersion").getAsString()
+ );
+ }
+
+ private void populateUnpickClasspath() {
+ String unpickCliName = "unpick-cli";
+ getProject().getDependencies().add(Constants.Configurations.UNPICK_CLASSPATH,
+ String.format("%s:%s:%s", unpickMetadata.unpickGroup, unpickCliName, unpickMetadata.unpickVersion)
+ );
+ }
+
private void extractIntermediary(Path intermediaryJar, Path intermediaryTiny) throws IOException {
getProject().getLogger().info(":extracting " + intermediaryJar.getFileName());
@@ -439,4 +497,22 @@ public class MappingsProvider extends DependencyProvider {
public String getMappingsKey() {
return mappingsName + "." + minecraftVersion.replace(' ', '_').replace('.', '_').replace('-', '_') + "." + mappingsVersion;
}
+
+ public File getUnpickDefinitionsFile() {
+ return unpickDefinitionsFile;
+ }
+
+ public boolean hasUnpickDefinitions() {
+ return hasUnpickDefinitions;
+ }
+
+ public static class UnpickMetadata {
+ public final String unpickGroup;
+ public final String unpickVersion;
+
+ public UnpickMetadata(String unpickGroup, String unpickVersion) {
+ this.unpickGroup = unpickGroup;
+ this.unpickVersion = unpickVersion;
+ }
+ }
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java
index af9dcbdb..09010c87 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MojangMappingsDependency.java
@@ -66,7 +66,7 @@ import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta;
-import net.fabricmc.loom.util.DownloadUtil;
+import net.fabricmc.loom.util.HashedDownloadUtil;
import net.fabricmc.lorenztiny.TinyMappingsReader;
import net.fabricmc.mapping.tree.TinyMappingFactory;
@@ -178,11 +178,11 @@ public class MojangMappingsDependency extends AbstractModuleDependency implement
throw new RuntimeException("Failed to find official mojang mappings for " + getVersion());
}
- String clientMappingsUrl = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS).getUrl();
- String serverMappingsUrl = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS).getUrl();
+ MinecraftVersionMeta.Download clientMappingsDownload = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS);
+ MinecraftVersionMeta.Download serverMappingsDownload = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS);
- DownloadUtil.downloadIfChanged(new URL(clientMappingsUrl), clientMappings.toFile(), project.getLogger());
- DownloadUtil.downloadIfChanged(new URL(serverMappingsUrl), serverMappings.toFile(), project.getLogger());
+ HashedDownloadUtil.downloadIfInvalid(new URL(clientMappingsDownload.getUrl()), clientMappings.toFile(), clientMappingsDownload.getSha1(), project.getLogger(), false);
+ HashedDownloadUtil.downloadIfInvalid(new URL(serverMappingsDownload.getUrl()), serverMappings.toFile(), clientMappingsDownload.getSha1(), project.getLogger(), false);
MappingSet mappings = MappingSet.create();
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
index 3b2e9391..891054b6 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
@@ -149,6 +149,8 @@ public class MinecraftMappedProvider extends DependencyProvider {
getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")");
+ Files.deleteIfExists(output);
+
try (OutputConsumerPath outputConsumer = new OutputConsumerPath.Builder(output).build()) {
if (getExtension().isForge()) {
outputConsumer.addNonClassFiles(input, NonClassCopyMode.FIX_META_INF, remapper);
@@ -279,6 +281,10 @@ public class MinecraftMappedProvider extends DependencyProvider {
return minecraftMappedJar;
}
+ public File getUnpickedJar() {
+ return new File(getJarDirectory(getExtension().getUserCache(), "mapped"), "minecraft-" + getJarVersionString("unpicked") + ".jar");
+ }
+
@Override
public String getTargetConfig() {
return Constants.Configurations.MINECRAFT_NAMED;