aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorJuuxel <6596629+Juuxel@users.noreply.github.com>2020-12-02 20:28:03 +0200
committerJuuxel <6596629+Juuxel@users.noreply.github.com>2020-12-02 20:28:03 +0200
commit8046f0c33c50f18f11c082c61f666331124fc42c (patch)
treeccdcd3d830d43efedc3b36bfe071f235d012f9ee /src/main
parentb61373f92074ec67c1cf70c1063049d25417dfe9 (diff)
downloadarchitectury-loom-8046f0c33c50f18f11c082c61f666331124fc42c.tar.gz
architectury-loom-8046f0c33c50f18f11c082c61f666331124fc42c.tar.bz2
architectury-loom-8046f0c33c50f18f11c082c61f666331124fc42c.zip
Merge the Forge manifest with the Minecraft manifest, ignoring any class sections
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java11
-rw-r--r--src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java43
2 files changed, 43 insertions, 11 deletions
diff --git a/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java b/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java
index 93e54050..e46bd520 100644
--- a/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java
+++ b/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java
@@ -32,9 +32,11 @@ import org.gradle.api.Project;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.DependencyProvider;
+import net.fabricmc.loom.util.JarUtil;
public class ForgeUniversalProvider extends DependencyProvider {
private File forge;
+ private File forgeManifest;
public ForgeUniversalProvider(Project project) {
super(project);
@@ -43,17 +45,26 @@ public class ForgeUniversalProvider extends DependencyProvider {
@Override
public void provide(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) throws Exception {
forge = new File(getExtension().getProjectPersistentCache(), "forge-" + dependency.getDependency().getVersion() + "-universal.jar");
+ forgeManifest = new File(getExtension().getProjectPersistentCache(), "forge-" + dependency.getDependency().getVersion() + "-manifest.mf");
if (!forge.exists() || isRefreshDeps()) {
File dep = dependency.resolveFile().orElseThrow(() -> new RuntimeException("Could not resolve Forge"));
Files.copy(dep, forge);
}
+
+ if (!forgeManifest.exists() || isRefreshDeps()) {
+ JarUtil.extractFile(forge, "META-INF/MANIFEST.MF", forgeManifest);
+ }
}
public File getForge() {
return forge;
}
+ public File getForgeManifest() {
+ return forgeManifest;
+ }
+
@Override
public String getTargetConfig() {
return Constants.Configurations.FORGE_UNIVERSAL;
diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java
index f328cce3..ddbddc72 100644
--- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java
+++ b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java
@@ -25,18 +25,21 @@
package net.fabricmc.loom.providers;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
import com.google.common.collect.ImmutableMap;
import org.gradle.api.Project;
@@ -145,17 +148,35 @@ public class MinecraftMappedProvider extends DependencyProvider {
try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + output.toUri()), ImmutableMap.of("create", false))) {
Path manifestPath = fs.getPath("META-INF", "MANIFEST.MF");
ForgeProvider.ForgeVersion version = getExtension().getForgeProvider().getVersion();
- List<String> lines = new ArrayList<>(Files.readAllLines(manifestPath));
-
- lines.add("");
- lines.add("Name: net/minecraftforge/fml/javafmlmod/");
- lines.add("Implementation-Version: " + version.getForgeVersion());
- lines.add("");
- lines.add("Name: net/minecraftforge/fml/mclanguageprovider/");
- lines.add("Implementation-Version: " + version.getMinecraftVersion());
+ Manifest minecraftManifest;
+ Manifest forgeManifest;
+
+ try (InputStream in = Files.newInputStream(manifestPath)) {
+ minecraftManifest = new Manifest(in);
+ }
+
+ try (InputStream in = new FileInputStream(getExtension().getForgeUniversalProvider().getForgeManifest())) {
+ forgeManifest = new Manifest(in);
+ }
+
+ for (Map.Entry<String, Attributes> forgeEntry : forgeManifest.getEntries().entrySet()) {
+ if (!forgeEntry.getKey().endsWith(".class")) {
+ minecraftManifest.getEntries().put(forgeEntry.getKey(), forgeEntry.getValue());
+ }
+ }
+
+ Attributes javafmlmod = new Attributes();
+ javafmlmod.put("Implementation-Version", version.getForgeVersion());
+ Attributes mclanguageprovider = new Attributes();
+ mclanguageprovider.put("Implementation-Version", version.getMinecraftVersion());
+ minecraftManifest.getEntries().putIfAbsent("net/minecraftforge/fml/javafmlmod/", javafmlmod);
+ minecraftManifest.getEntries().putIfAbsent("net/minecraftforge/fml/mclanguageprovider/", mclanguageprovider);
Files.delete(manifestPath);
- Files.write(manifestPath, lines);
+
+ try (OutputStream out = Files.newOutputStream(manifestPath)) {
+ minecraftManifest.write(out);
+ }
}
TinyTree yarnWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();