From 58ce9b33b3283b956e5db0740217c58317684d74 Mon Sep 17 00:00:00 2001 From: LexManos Date: Sat, 29 Jun 2013 01:40:01 -0700 Subject: [PATCH] Base GenDiff off deobf data's class list instead of the merged jar. Add option to delete target files that generate patches. --- fml/build.xml | 10 ++-- .../deobf/FMLDeobfuscatingRemapper.java | 6 +++ .../mods/fml/common/patcher/GenDiffSet.java | 49 ++++++++++--------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/fml/build.xml b/fml/build.xml index 23f81ea59..9de1b4567 100644 --- a/fml/build.xml +++ b/fml/build.xml @@ -151,7 +151,7 @@ - + @@ -382,22 +382,22 @@ - - + + - - + + diff --git a/fml/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java b/fml/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java index bf3c58072..2fee95497 100644 --- a/fml/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java +++ b/fml/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java @@ -41,6 +41,7 @@ import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; @@ -415,4 +416,9 @@ public class FMLDeobfuscatingRemapper extends Remapper { fieldNameMaps.put(name, ImmutableMap.copyOf(fieldMap)); // System.out.printf("Maps: %s %s\n", name, methodMap); } + + public Set getObfedClasses() + { + return ImmutableSet.copyOf(classNameBiMap.keySet()); + } } diff --git a/fml/common/cpw/mods/fml/common/patcher/GenDiffSet.java b/fml/common/cpw/mods/fml/common/patcher/GenDiffSet.java index b5e6cd3a7..96dcd6516 100644 --- a/fml/common/cpw/mods/fml/common/patcher/GenDiffSet.java +++ b/fml/common/cpw/mods/fml/common/patcher/GenDiffSet.java @@ -8,8 +8,6 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; -import org.omg.CORBA.REBIND; - import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.io.ByteArrayDataOutput; @@ -23,35 +21,34 @@ public class GenDiffSet { public static void main(String[] args) throws IOException { - String vanillaMinecraftJar = args[0]; - String targetJar = args[1]; - String reobfuscationOutputPath = args[2]; - String deobfFileName = args[3]; - String binPatchOutputDir = args[4]; + String sourceJar = args[0]; //Clean Vanilla jar minecraft.jar or minecraft_server.jar + String targetDir = args[1]; //Directory containing obfed output classes, typically mcp/reobf/minecraft + String deobfData = args[2]; //Path to FML's deobfusication_data.zip + String outputDir = args[3]; //Path to place generated .binpatch + String killTarget = args[4]; //"true" if we should destroy the target file if it generated a successful .binpatch - Logger.getLogger("GENDIFF").log(Level.INFO, String.format("Creating patches at %s for %s from %s", binPatchOutputDir, targetJar, reobfuscationOutputPath)); + Logger.getLogger("GENDIFF").log(Level.INFO, String.format("Creating patches at %s for %s from %s", outputDir, sourceJar, targetDir)); Delta delta = new Delta(); FMLDeobfuscatingRemapper remapper = FMLDeobfuscatingRemapper.INSTANCE; - remapper.setupLoadOnly(deobfFileName, false); - JarFile originalJarFile = new JarFile(vanillaMinecraftJar); - JarFile targetJarFile = new JarFile(targetJar); + remapper.setupLoadOnly(deobfData, false); + JarFile sourceZip = new JarFile(sourceJar); + boolean kill = killTarget.equalsIgnoreCase("true"); - File f = new File(binPatchOutputDir); + File f = new File(outputDir); f.mkdirs(); - for (JarEntry e : Collections.list(originalJarFile.entries())) + for (String name : remapper.getObfedClasses()) { - String name = e.getName(); // Logger.getLogger("GENDIFF").info(String.format("Evaluating path for data :%s",name)); - File reobfOutput = new File(reobfuscationOutputPath, name); - if (reobfOutput.exists()) + File targetFile = new File(targetDir, name.replace('/', File.separatorChar) + ".class"); + if (targetFile.exists()) { - String sourceClassName = name.substring(0, name.lastIndexOf(".")).replace('/', '.'); - String targetClassName = remapper.map(name.substring(0,name.lastIndexOf("."))).replace('/', '.'); - JarEntry entry = targetJarFile.getJarEntry(name); + String sourceClassName = name.replace('/', '.'); + String targetClassName = remapper.map(name).replace('/', '.'); + JarEntry entry = sourceZip.getJarEntry(name); - byte[] vanillaBytes = entry != null ? ByteStreams.toByteArray(targetJarFile.getInputStream(entry)) : new byte[0]; - byte[] patchedBytes = Files.toByteArray(reobfOutput); + byte[] vanillaBytes = entry != null ? ByteStreams.toByteArray(sourceZip.getInputStream(entry)) : new byte[0]; + byte[] patchedBytes = Files.toByteArray(targetFile); byte[] diff = delta.compute(vanillaBytes, patchedBytes); @@ -63,18 +60,24 @@ public class GenDiffSet { // Target name diffOut.writeUTF(targetClassName); // exists at original - diffOut.writeBoolean(entry!=null); + diffOut.writeBoolean(entry != null); // length of patch diffOut.writeInt(diff.length); // patch diffOut.write(diff); - File target = new File(binPatchOutputDir, targetClassName+".binpatch"); + File target = new File(outputDir, targetClassName+".binpatch"); target.getParentFile().mkdirs(); Files.write(diffOut.toByteArray(), target); Logger.getLogger("GENDIFF").info(String.format("Wrote patch for %s (%s) at %s",name, targetClassName, target.getAbsolutePath())); + if (kill) + { + targetFile.delete(); + Logger.getLogger("GENDIFF").info(String.format(" Deleted target: %s", targetFile.toString())); + } } } + sourceZip.close(); } }