Add env manifest entry to split jars.

This commit is contained in:
modmuss50
2022-08-06 15:33:59 +01:00
parent 48ef3550aa
commit 8b37b9a3c6
2 changed files with 36 additions and 28 deletions

View File

@@ -47,6 +47,8 @@ import net.fabricmc.loom.task.AbstractRemapJarTask;
import net.fabricmc.loom.util.FileSystemUtil;
public class JarSplitter {
public static final String MANIFEST_SPLIT_ENV_NAME_KEY = "Fabric-Loom-Split-Environment-Name";
final Path inputJar;
public JarSplitter(Path inputJar) {
@@ -155,30 +157,7 @@ public class JarSplitter {
final String entryPath = relativePath.toString();
/*
Copy the manifest to both jars
- Remove signature data
- Remove split data as its already been split.
*/
if (entryPath.equals(AbstractRemapJarTask.MANIFEST_PATH)) {
final Manifest outManifest = new Manifest(manifest);
final Attributes attributes = outManifest.getMainAttributes();
stripSignatureData(outManifest);
attributes.remove(Attributes.Name.SIGNATURE_VERSION);
Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_SPLIT_ENV_NAME));
Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_NAME));
// TODO add an attribute to denote if the jar is common or client now
final ByteArrayOutputStream out = new ByteArrayOutputStream();
outManifest.write(out);
final byte[] manifestBytes = out.toByteArray();
writeBytes(manifestBytes, commonOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH));
writeBytes(manifestBytes, clientOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH));
continue;
}
@@ -192,12 +171,39 @@ public class JarSplitter {
Files.copy(entry, outputEntry, StandardCopyOption.COPY_ATTRIBUTES);
}
/*
Write the manifest to both jars
- Remove signature data
- Remove split data as its already been split.
- Add env name.
*/
final Manifest outManifest = new Manifest(manifest);
final Attributes attributes = outManifest.getMainAttributes();
stripSignatureData(outManifest);
attributes.remove(Attributes.Name.SIGNATURE_VERSION);
Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_SPLIT_ENV_NAME));
Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_NAME));
writeBytes(writeWithEnvironment(outManifest, "common"), commonOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH));
writeBytes(writeWithEnvironment(outManifest, "client"), clientOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH));
}
}
return true;
}
private byte[] writeWithEnvironment(Manifest in, String value) throws IOException {
final Manifest manifest = new Manifest(in);
final Attributes attributes = manifest.getMainAttributes();
attributes.putValue(MANIFEST_SPLIT_ENV_NAME_KEY, value);
final ByteArrayOutputStream out = new ByteArrayOutputStream();
manifest.write(out);
return out.toByteArray();
}
private List<String> readClientEntries(Manifest manifest) {
final Attributes attributes = manifest.getMainAttributes();
final String clientEntriesValue = attributes.getValue(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_KEY);

View File

@@ -39,6 +39,7 @@ import java.util.stream.Stream;
import com.google.common.collect.Sets;
import net.fabricmc.loom.configuration.mods.JarSplitter;
import net.fabricmc.loom.util.FileSystemUtil;
public class MinecraftJarSplitter implements AutoCloseable {
@@ -65,8 +66,8 @@ public class MinecraftJarSplitter implements AutoCloseable {
// Not something we expect, will require 3 jars, server, client and common.
assert entryData.serverOnlyEntries.isEmpty();
copyEntriesToJar(entryData.commonEntries, serverInputJar, commonOutputJar);
copyEntriesToJar(entryData.clientOnlyEntries, clientInputJar, clientOnlyOutputJar);
copyEntriesToJar(entryData.commonEntries, serverInputJar, commonOutputJar, "common");
copyEntriesToJar(entryData.clientOnlyEntries, clientInputJar, clientOnlyOutputJar, "client");
}
public void sharedEntry(String path) {
@@ -104,7 +105,7 @@ public class MinecraftJarSplitter implements AutoCloseable {
return entries;
}
private void copyEntriesToJar(Set<String> entries, Path inputJar, Path outputJar) throws IOException {
private void copyEntriesToJar(Set<String> entries, Path inputJar, Path outputJar, String env) throws IOException {
Files.deleteIfExists(outputJar);
try (FileSystemUtil.Delegate inputFs = FileSystemUtil.getJarFileSystem(inputJar);
@@ -124,13 +125,14 @@ public class MinecraftJarSplitter implements AutoCloseable {
Files.copy(inputPath, outputPath, StandardCopyOption.COPY_ATTRIBUTES);
}
writeManifest(outputFs);
writeManifest(outputFs, env);
}
}
private void writeManifest(FileSystemUtil.Delegate outputFs) throws IOException {
private void writeManifest(FileSystemUtil.Delegate outputFs, String env) throws IOException {
final Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
manifest.getMainAttributes().putValue(JarSplitter.MANIFEST_SPLIT_ENV_NAME_KEY, env);
ByteArrayOutputStream out = new ByteArrayOutputStream();
manifest.write(out);
Files.createDirectories(outputFs.get().getPath("META-INF"));