diff options
| author | Juuxel <6596629+Juuxel@users.noreply.github.com> | 2020-12-02 20:28:03 +0200 |
|---|---|---|
| committer | Juuxel <6596629+Juuxel@users.noreply.github.com> | 2020-12-02 20:28:03 +0200 |
| commit | 8046f0c33c50f18f11c082c61f666331124fc42c (patch) | |
| tree | ccdcd3d830d43efedc3b36bfe071f235d012f9ee /src/main | |
| parent | b61373f92074ec67c1cf70c1063049d25417dfe9 (diff) | |
| download | architectury-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.java | 11 | ||||
| -rw-r--r-- | src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java | 43 |
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(); |
