aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-05-05 18:29:42 +0800
committershedaniel <daniel@shedaniel.me>2021-05-05 18:29:42 +0800
commit2625b90a17185d8e0c42eba5666b3d6b89bb7361 (patch)
tree147137994b95b2b62a863ab3386fcaf9d959ce69
parent8d96bc0b6f1dd3cd6696fd1afb82f23712a4466e (diff)
downloadarchitectury-loom-2625b90a17185d8e0c42eba5666b3d6b89bb7361.tar.gz
architectury-loom-2625b90a17185d8e0c42eba5666b3d6b89bb7361.tar.bz2
architectury-loom-2625b90a17185d8e0c42eba5666b3d6b89bb7361.zip
Adds Forge Sources Remapping
Filter ':launcher' dependency (Could cause problems! Please test!) Fix previous optimisations leaving signing info in Add license header to various files Signed-off-by: shedaniel <daniel@shedaniel.me>
-rw-r--r--src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java24
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java8
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java1
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java55
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java24
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java24
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java239
-rw-r--r--src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java12
-rw-r--r--src/main/java/net/fabricmc/loom/util/ModPlatform.java24
-rw-r--r--src/main/java/net/fabricmc/loom/util/ThreadingUtils.java20
10 files changed, 396 insertions, 35 deletions
diff --git a/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java b/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java
index df9f7cab..e91496e6 100644
--- a/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java
+++ b/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java
@@ -1,3 +1,27 @@
+/*
+ * 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.build.nesting;
import java.io.File;
diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java
index f610c5ee..8b97f81e 100644
--- a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java
+++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java
@@ -140,7 +140,7 @@ public class LoomDependencyManager {
String platformSuffix = extension.isForge() ? "_forge" : "";
String mappingsKey = mappingsProvider.getMappingsKey() + platformSuffix;
- if (extension.getInstallerJson() == null) {
+ if (extension.getInstallerJson() == null && !extension.isForge()) {
//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");
final Configuration configuration = project.getConfigurations().getByName(Constants.Configurations.MOD_COMPILE_CLASSPATH);
@@ -159,10 +159,10 @@ public class LoomDependencyManager {
handleInstallerJson(extension.getInstallerJson(), project);
}
}
- }
- if (extension.getInstallerJson() == null && !extension.isForge()) {
- project.getLogger().warn("fabric-installer.json not found in classpath!");
+ if (extension.getInstallerJson() == null) {
+ project.getLogger().warn("fabric-installer.json not found in classpath!");
+ }
}
ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper);
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java
index de0394ce..7540d46e 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java
@@ -86,6 +86,7 @@ public class ForgeUserdevProvider extends DependencyProvider {
}
}
+ if (lib.getAsString().endsWith(":launcher")) continue;
addDependency(lib.getAsString(), Constants.Configurations.FORGE_DEPENDENCIES);
}
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 90af6c80..9b85944f 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
@@ -47,6 +47,8 @@ import java.util.jar.Manifest;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableMap;
import dev.architectury.tinyremapper.IMappingProvider;
+import dev.architectury.tinyremapper.NonClassCopyMode;
+import dev.architectury.tinyremapper.OutputConsumerPath;
import dev.architectury.tinyremapper.TinyRemapper;
import org.gradle.api.Project;
import org.jetbrains.annotations.Nullable;
@@ -55,6 +57,7 @@ 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.configuration.providers.minecraft.tr.OutputRemappingHandler;
+import net.fabricmc.loom.configuration.sources.ForgeSourcesRemapper;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.DownloadUtil;
import net.fabricmc.loom.util.FileSystemUtil;
@@ -66,7 +69,7 @@ import net.fabricmc.loom.util.srg.InnerClassRemapper;
import net.fabricmc.mapping.tree.TinyTree;
public class MinecraftMappedProvider extends DependencyProvider {
- private static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>()
+ public static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>()
.put("javax/annotation/Nullable", "org/jetbrains/annotations/Nullable")
.put("javax/annotation/Nonnull", "org/jetbrains/annotations/NotNull")
.put("javax/annotation/concurrent/Immutable", "org/jetbrains/annotations/Unmodifiable")
@@ -132,6 +135,16 @@ public class MinecraftMappedProvider extends DependencyProvider {
}
addDependencies(dependency, postPopulationScheduler);
+
+ getProject().afterEvaluate(project -> {
+ if (getExtension().isForge()) {
+ try {
+ ForgeSourcesRemapper.addBaseForgeSources(project);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ });
}
private void mapMinecraftJar() throws Exception {
@@ -158,32 +171,28 @@ public class MinecraftMappedProvider extends DependencyProvider {
try (FileSystemUtil.FileSystemDelegate inputFs = FileSystemUtil.getJarFileSystem(input, false)) {
ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter();
- try (FileSystemUtil.FileSystemDelegate assetsFs = FileSystemUtil.getJarFileSystem(tmpAssets, true)) {
- for (Path path : (Iterable<? extends Path>) Files.walk(inputFs.get().getPath("/"))::iterator) {
- if (Files.isRegularFile(path)) {
- if (path.getFileName().toString().endsWith(".class")) {
- taskCompleter.add(() -> {
- byte[] bytes = Files.readAllBytes(path);
-
- synchronized (inputByteList) {
- inputByteList.add(bytes);
- }
- });
- } else {
- Path p = assetsFs.get().getPath(path.toString());
-
- if (p.getParent() != null) {
- Files.createDirectories(p.getParent());
- }
+ for (Path path : (Iterable<? extends Path>) Files.walk(inputFs.get().getPath("/"))::iterator) {
+ if (Files.isRegularFile(path)) {
+ if (path.getFileName().toString().endsWith(".class")) {
+ taskCompleter.add(() -> {
+ byte[] bytes = Files.readAllBytes(path);
- taskCompleter.add(() -> {
- Files.copy(path, p);
- });
- }
+ synchronized (inputByteList) {
+ inputByteList.add(bytes);
+ }
+ });
}
}
+ }
+
+ taskCompleter.complete();
+ }
- taskCompleter.complete();
+ try (OutputConsumerPath tmpAssetsPath = new OutputConsumerPath.Builder(tmpAssets).assumeArchive(true).build()) {
+ if (getExtension().isForge()) {
+ tmpAssetsPath.addNonClassFiles(input, NonClassCopyMode.FIX_META_INF, null);
+ } else {
+ tmpAssetsPath.addNonClassFiles(input);
}
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java
index 44af6b2c..e6b2c5e6 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java
@@ -1,3 +1,27 @@
+/*
+ * 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.providers.minecraft.tr;
import org.cadixdev.mercury.Mercury;
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java
index f69beb0c..ad7abe39 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java
@@ -1,3 +1,27 @@
+/*
+ * 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.providers.minecraft.tr;
import java.io.IOException;
diff --git a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java
new file mode 100644
index 00000000..ea3cba27
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java
@@ -0,0 +1,239 @@
+/*
+ * 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.sources;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+import org.cadixdev.lorenz.MappingSet;
+import org.cadixdev.mercury.Mercury;
+import org.cadixdev.mercury.remapper.MercuryRemapper;
+import org.gradle.api.Project;
+import org.gradle.api.artifacts.Dependency;
+import org.gradle.api.artifacts.ResolvedArtifact;
+import org.gradle.api.plugins.JavaPlugin;
+import org.zeroturnaround.zip.ZipUtil;
+
+import net.fabricmc.loom.LoomGradleExtension;
+import net.fabricmc.loom.build.ModCompileRemapper;
+import net.fabricmc.loom.configuration.providers.LaunchProvider;
+import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
+import net.fabricmc.loom.task.GenerateSourcesTask;
+import net.fabricmc.loom.util.Constants;
+import net.fabricmc.loom.util.DeletingFileVisitor;
+import net.fabricmc.loom.util.FileSystemUtil;
+import net.fabricmc.loom.util.SourceRemapper;
+import net.fabricmc.loom.util.ThreadingUtils;
+import net.fabricmc.lorenztiny.TinyMappingsReader;
+
+public class ForgeSourcesRemapper {
+ public static void addBaseForgeSources(Project project) throws IOException {
+ Path sourcesJar = GenerateSourcesTask.getMappedJarFileWithSuffix(project, "-sources.jar").toPath();
+
+ if (!Files.exists(sourcesJar)) {
+ addForgeSources(project, sourcesJar);
+ }
+ }
+
+ public static void addForgeSources(Project project, Path sourcesJar) throws IOException {
+ try (FileSystemUtil.FileSystemDelegate delegate = FileSystemUtil.getJarFileSystem(sourcesJar, true)) {
+ ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter();
+
+ provideForgeSources(project, (path, bytes) -> {
+ Path fsPath = delegate.get().getPath(path);
+
+ if (fsPath.getParent() != null) {
+ try {
+ Files.createDirectories(fsPath.getParent());
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ taskCompleter.add(() -> {
+ Files.write(fsPath, bytes, StandardOpenOption.CREATE);
+ });
+ });
+
+ taskCompleter.complete();
+ }
+ }
+
+ public static void provideForgeSources(Project project, BiConsumer<String, byte[]> consumer) throws IOException {
+ List<Path> forgeInstallerSources = new ArrayList<>();
+
+ for (ResolvedArtifact artifact : project.getConfigurations().getByName(Constants.Configurations.FORGE_INSTALLER).getResolvedConfiguration().getResolvedArtifacts()) {
+ File forgeInstallerSource = ModCompileRemapper.findSources(project.getDependencies(), artifact);
+
+ if (forgeInstallerSource != null) {
+ forgeInstallerSources.add(forgeInstallerSource.toPath());
+ }
+ }
+
+ project.getLogger().lifecycle(":found {} forge source jars", forgeInstallerSources.size());
+ Map<String, byte[]> forgeSources = extractSources(forgeInstallerSources);
+ project.getLogger().lifecycle(":extracted {} forge source classes", forgeSources.size());
+ remapSources(project, forgeSources);
+ forgeSources.forEach(consumer);
+ }
+
+ private static void remapSources(Project project, Map<String, byte[]> sources) throws IOException {
+ File tmpInput = File.createTempFile("tmpInputForgeSources", null);
+ tmpInput.delete();
+ tmpInput.deleteOnExit();
+ File tmpOutput = File.createTempFile("tmpOutputForgeSources", null);
+ tmpOutput.delete();
+ tmpOutput.deleteOnExit();
+
+ try (FileSystemUtil.FileSystemDelegate delegate = FileSystemUtil.getJarFileSystem(tmpInput, true)) {
+ ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter();
+
+ for (Map.Entry<String, byte[]> entry : sources.entrySet()) {
+ Path path = delegate.get().getPath(entry.getKey());
+
+ if (path.getParent() != null) {
+ Files.createDirectories(path.getParent());
+ }
+
+ taskCompleter.add(() -> {
+ Files.write(path, entry.getValue(), StandardOpenOption.CREATE);
+ });
+ }
+
+ taskCompleter.complete();
+ }
+
+ remapForgeSourcesInner(project, tmpInput.toPath(), tmpOutput.toPath());
+ tmpInput.delete();
+ int[] failedToRemap = {0};
+
+ try (FileSystemUtil.FileSystemDelegate delegate = FileSystemUtil.getJarFileSystem(tmpOutput, false)) {
+ ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter();
+
+ for (Map.Entry<String, byte[]> entry : new HashSet<>(sources.entrySet())) {
+ taskCompleter.add(() -> {
+ Path path = delegate.get().getPath(entry.getKey());
+
+ if (Files.exists(path)) {
+ sources.put(entry.getKey(), Files.readAllBytes(path));
+ } else {
+ sources.remove(entry.getKey());
+ project.getLogger().error("forge source failed to remap " + entry.getKey());
+ failedToRemap[0]++;
+ }
+ });
+ }
+
+ taskCompleter.complete();
+ }
+
+ tmpOutput.delete();
+
+ if (failedToRemap[0] > 0) {
+ project.getLogger().error("{} forge sources failed to remap", failedToRemap[0]);
+ }
+ }
+
+ private static void remapForgeSourcesInner(Project project, Path tmpInput, Path tmpOutput) throws IOException {
+ LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
+ Mercury mercury = SourceRemapper.createMercuryWithClassPath(project, false);
+
+ MappingSet mappings = new TinyMappingsReader(extension.getMappingsProvider().getMappingsWithSrg(), "srg", "named").read();
+
+ for (Map.Entry<String, String> entry : MinecraftMappedProvider.JSR_TO_JETBRAINS.entrySet()) {
+ mappings.getOrCreateClassMapping(entry.getKey()).setDeobfuscatedName(entry.getValue());
+ }
+
+ Dependency annotationDependency = extension.getDependencyManager().getProvider(LaunchProvider.class).annotationDependency;
+ Set<File> files = project.getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME)
+ .files(annotationDependency);
+
+ for (File file : files) {
+ mercury.getClassPath().add(file.toPath());
+ }
+
+ // Distinct and add the srg jar at the top, so it gets prioritized
+ mercury.getClassPath().add(0, extension.getMinecraftMappedProvider().getSrgJar().toPath());
+ List<Path> newClassPath = mercury.getClassPath().stream()
+ .distinct()
+ .filter(Files::isRegularFile)
+ .collect(Collectors.toList());
+ mercury.getClassPath().clear();
+ mercury.getClassPath().addAll(newClassPath);
+
+ mercury.getProcessors().add(MercuryRemapper.create(mappings));
+ boolean isSrcTmp = false;
+
+ if (!Files.isDirectory(tmpInput)) {
+ Path tmpInput1 = tmpInput;
+ // create tmp directory
+ isSrcTmp = true;
+ tmpInput = Files.createTempDirectory("fabric-loom-src");
+ ZipUtil.unpack(tmpInput1.toFile(), tmpInput.toFile());
+ }
+
+ try (FileSystemUtil.FileSystemDelegate outputFs = FileSystemUtil.getJarFileSystem(tmpOutput, true)) {
+ Path outputFsRoot = outputFs.get().getPath("/");
+ mercury.rewrite(tmpInput, outputFsRoot);
+ } catch (Exception e) {
+ project.getLogger().warn("Could not remap " + tmpInput + " fully!", e);
+ }
+
+ if (isSrcTmp) {
+ Files.walkFileTree(tmpInput, new DeletingFileVisitor());
+ }
+ }
+
+ private static Map<String, byte[]> extractSources(List<Path> forgeInstallerSources) throws IOException {
+ Map<String, byte[]> sources = new ConcurrentHashMap<>();
+ ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter();
+
+ for (Path path : forgeInstallerSources) {
+ FileSystemUtil.FileSystemDelegate system = FileSystemUtil.getJarFileSystem(path, false);
+ taskCompleter.onComplete(stopwatch -> system.close());
+
+ for (Path filePath : (Iterable<? extends Path>) Files.walk(system.get().getPath("/"))::iterator) {
+ if (Files.isRegularFile(filePath) && filePath.getFileName().toString().endsWith(".java")) {
+ taskCompleter.add(() -> sources.put(filePath.toString(), Files.readAllBytes(filePath)));
+ }
+ }
+ }
+
+ taskCompleter.complete();
+ return sources;
+ }
+}
diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java
index eb028d40..87706073 100644
--- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java
+++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java
@@ -35,6 +35,7 @@ import java.util.stream.Collectors;
import javax.inject.Inject;
+import org.gradle.api.Project;
import org.gradle.api.tasks.InputFile;
import org.gradle.api.tasks.TaskAction;
@@ -42,6 +43,7 @@ import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.decompilers.DecompilationMetadata;
import net.fabricmc.loom.api.decompilers.LoomDecompiler;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider;
+import net.fabricmc.loom.configuration.sources.ForgeSourcesRemapper;
import net.fabricmc.loom.decompilers.LineNumberRemapper;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.gradle.ProgressLogger;
@@ -81,6 +83,10 @@ public class GenerateSourcesTask extends AbstractLoomTask {
Files.copy(linemappedJarDestination, runtimeJar, StandardCopyOption.REPLACE_EXISTING);
Files.delete(linemappedJarDestination);
}
+
+ if (getExtension().isForge()) {
+ ForgeSourcesRemapper.addForgeSources(getProject(), sourcesDestination);
+ }
}
private void remapLineNumbers(Path oldCompiledJar, Path linemap, Path linemappedJarDestination) throws IOException {
@@ -100,7 +106,11 @@ public class GenerateSourcesTask extends AbstractLoomTask {
}
private File getMappedJarFileWithSuffix(String suffix) {
- LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class);
+ return getMappedJarFileWithSuffix(getProject(), suffix);
+ }
+
+ public static File getMappedJarFileWithSuffix(Project project, String suffix) {
+ LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
MappingsProvider mappingsProvider = extension.getMappingsProvider();
File mappedJar = mappingsProvider.mappedProvider.getMappedJar();
String path = mappedJar.getAbsolutePath();
diff --git a/src/main/java/net/fabricmc/loom/util/ModPlatform.java b/src/main/java/net/fabricmc/loom/util/ModPlatform.java
index cd751cb7..11b2c4ef 100644
--- a/src/main/java/net/fabricmc/loom/util/ModPlatform.java
+++ b/src/main/java/net/fabricmc/loom/util/ModPlatform.java
@@ -1,3 +1,27 @@
+/*
+ * 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;
public enum ModPlatform {
diff --git a/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java b/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java
index 53c2d221..e61a297c 100644
--- a/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java
+++ b/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java
@@ -34,7 +34,6 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -134,7 +133,7 @@ public class ThreadingUtils {
Stopwatch stopwatch = Stopwatch.createUnstarted();
List<CompletableFuture<?>> tasks = new ArrayList<>();
ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
- List<Consumer<Stopwatch>> completionListener = new ArrayList<>();
+ List<UnsafeConsumer<Stopwatch>> completionListener = new ArrayList<>();
public TaskCompleter add(UnsafeRunnable job) {
if (!stopwatch.isRunning()) {
@@ -152,7 +151,7 @@ public class ThreadingUtils {
return this;
}
- public TaskCompleter onComplete(Consumer<Stopwatch> consumer) {
+ public TaskCompleter onComplete(UnsafeConsumer<Stopwatch> consumer) {
completionListener.add(consumer);
return this;
}
@@ -161,13 +160,20 @@ public class ThreadingUtils {
try {
CompletableFuture.allOf(tasks.toArray(new CompletableFuture[0])).exceptionally(this).get();
service.shutdownNow();
- stopwatch.stop();
- for (Consumer<Stopwatch> consumer : completionListener) {
- consumer.accept(stopwatch);
+ if (stopwatch.isRunning()) {
+ stopwatch.stop();
}
- } catch (InterruptedException | ExecutionException e) {
+ } catch (Throwable e) {
throw new RuntimeException(e);
+ } finally {
+ try {
+ for (UnsafeConsumer<Stopwatch> consumer : completionListener) {
+ consumer.accept(stopwatch);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
}
}