Merge the Forge manifest with the Minecraft manifest, ignoring any class sections

This commit is contained in:
Juuxel
2020-12-02 20:28:03 +02:00
parent b61373f920
commit 8046f0c33c
3 changed files with 43 additions and 11 deletions

View File

@@ -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;

View File

@@ -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));
Manifest minecraftManifest;
Manifest forgeManifest;
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());
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();