From bbcdaa7dfb32ece766af06d2171f126f2f6cd6b0 Mon Sep 17 00:00:00 2001 From: LexManos Date: Mon, 13 Aug 2012 21:02:55 -0700 Subject: [PATCH] Updated FML install to provide better error output, Updated commands.py patch to disable recompile of server project. --- fml/commands.patch | 34 +++++++----- fml/install/fml.py | 128 +++++++++++++++++++++++++++++++++------------ 2 files changed, 116 insertions(+), 46 deletions(-) diff --git a/fml/commands.patch b/fml/commands.patch index 8cd5cb02d5..88797a29c0 100644 --- a/fml/commands.patch +++ b/fml/commands.patch @@ -29,7 +29,17 @@ return True def checkbins(self, side): -@@ -1039,6 +1045,7 @@ +@@ -1027,6 +1033,9 @@ + pathsrclk = {CLIENT: self.srcclient, SERVER: self.srcserver} + pathlog = {CLIENT: self.clientrecomplog, SERVER: self.serverrecomplog} + ++ if side == SERVER: #Disable server because FML recombines it into client ++ return ++ + if not os.path.exists(pathbinlk[side]): + os.makedirs(pathbinlk[side]) + +@@ -1039,6 +1048,7 @@ all_files = True append_pattern = False pkglist = filterdirs(pathsrclk[side], '*.java', append_pattern=append_pattern, all_files=all_files) @@ -37,7 +47,7 @@ dirs = ' '.join(pkglist) classpath = os.pathsep.join(cplk[side]) forkcmd = self.cmdrecomp.format(classpath=classpath, sourcepath=pathsrclk[side], outpath=pathbinlk[side], -@@ -1060,7 +1067,7 @@ +@@ -1060,7 +1070,7 @@ raise def startserver(self): @@ -46,7 +56,7 @@ classpath = [os.path.join('..', p) for p in classpath] classpath = os.pathsep.join(classpath) os.chdir(self.dirjars) -@@ -1068,7 +1075,7 @@ +@@ -1068,7 +1078,7 @@ self.runmc(forkcmd) def startclient(self): @@ -55,7 +65,7 @@ classpath = [os.path.join('..', p) for p in classpath] classpath = os.pathsep.join(classpath) natives = os.path.join('..', self.dirnatives) -@@ -1195,20 +1202,20 @@ +@@ -1195,20 +1205,20 @@ with open(self.csvmethods, 'rb') as fh: methodsreader = csv.DictReader(fh) for row in methodsreader: @@ -79,7 +89,7 @@ names['params'][row['param']] = row['name'] regexps = { -@@ -1238,6 +1245,11 @@ +@@ -1238,6 +1248,11 @@ # HINT: We pathwalk the sources for path, _, filelist in os.walk(pathsrclk[side], followlinks=True): @@ -91,7 +101,7 @@ for cur_file in fnmatch.filter(filelist, '*.java'): updatefile(os.path.normpath(os.path.join(path, cur_file))) return True -@@ -1320,12 +1332,14 @@ +@@ -1320,12 +1335,14 @@ pathsrclk = {CLIENT: self.srcclient, SERVER: self.srcserver} strip_comments(pathsrclk[side]) @@ -106,7 +116,7 @@ def process_javadoc(self, side): """Add CSV descriptions to methods and fields as javadoc""" -@@ -1334,6 +1348,21 @@ +@@ -1334,6 +1351,21 @@ if not self.has_doc_csv: self.logger.warning('!! javadoc disabled due to no csvs !!') return False @@ -128,7 +138,7 @@ #HINT: We read the relevant CSVs methodsreader = csv.DictReader(open(self.csvmethods, 'r')) -@@ -1342,13 +1371,13 @@ +@@ -1342,13 +1374,13 @@ methods = {} for row in methodsreader: #HINT: Only include methods that have a non-empty description @@ -144,7 +154,7 @@ fields[row['searge']] = row['desc'].replace('*/', '* /') regexps = { -@@ -1420,6 +1449,7 @@ +@@ -1420,6 +1452,7 @@ # HINT: We create the list of source directories based on the list of packages pkglist = filterdirs(pathsrclk[side], '*.java', append_pattern=True) @@ -152,7 +162,7 @@ dirs = ' '.join(pkglist) forkcmd = self.cmdastyle.format(classes=dirs, conffile=self.astyleconf) self.runcmd(forkcmd) -@@ -1526,6 +1556,9 @@ +@@ -1526,6 +1559,9 @@ trgclasses.append(key) self.logger.info('> Unchanged class found: %s', key) classes = {} @@ -162,7 +172,7 @@ srg_data = parse_srg(srglk[side]) for row in srg_data['CL']: classes[row['deobf_name']] = row['obf_name'] -@@ -1592,6 +1625,9 @@ +@@ -1592,6 +1628,9 @@ sys.exit(1) for entry in newfiles: @@ -172,7 +182,7 @@ if entry[3] == 'U': self.logger.info('Retrieving file from server : %s', entry[0]) cur_file = os.path.normpath(entry[0]) -@@ -1654,3 +1690,6 @@ +@@ -1654,3 +1693,6 @@ except IOError: self.logger.error('* File %s copy failed', in_class) diff --git a/fml/install/fml.py b/fml/install/fml.py index 3fd6287824..d81fc61d12 100644 --- a/fml/install/fml.py +++ b/fml/install/fml.py @@ -5,14 +5,6 @@ import subprocess, logging, re, shlex import csv from hashlib import md5 # pylint: disable-msg=E0611 -#class flushout(object): -# def __init__(self, f): -# self.f = f -# def write(self, x): -# self.f.write(x) -# self.f.flush() -#sys.stdout = flushout(sys.stdout) - def download_deps(mcp_path): bin_path = os.path.normpath(os.path.join(mcp_path, 'runtime', 'bin')) ff_path = os.path.normpath(os.path.join(bin_path, 'fernflower.jar')) @@ -51,11 +43,50 @@ def pre_decompile(mcp_dir, fml_dir): file_backup(os.path.join(mcp_dir, 'jars', 'bin'), 'minecraft.jar') file_backup(os.path.join(mcp_dir, 'jars'), 'minecraft_server.jar') + client_jar = os.path.join(mcp_dir, 'jars', 'bin', 'minecraft.jar.backup') + server_jar = os.path.join(mcp_dir, 'jars', 'minecraft_server.jar.backup') + + if not os.path.isfile(client_jar): + print 'Could not find Client jar, decompile requires both client and server.' + sys.exit(1) + + if not os.path.isfile(server_jar): + print 'Could not find Server jar, decompile requires both client and server.' + #sys.exit(1) + + md5_c = "" + md5_s = "" + with open(client_jar, 'rb') as fh: + md5_c = md5(fh.read()).hexdigest() + with open(server_jar, 'rb') as fh: + md5_s = md5(fh.read()).hexdigest() + + clean_c = "266ccbc9798afd2eadf3d6c01b4c562a" + clean_s = "f44a3cfe6ec35b1ac3f2b635e73d96fe" + + if not md5_c == clean_c: + print 'Warning, Modified Client jar detected' + print 'Continuing with decompile may produce unpredictable results' + print 'If you continue, do not come to the FML or Forge team with decompile issues.' + answer = raw_input('If you really want to continue, enter "Yes" ') + if answer.lower() not in ['yes', 'y']: + print 'You have not entered "Yes", aborting the decompile process' + sys.exit(1) + + if not md5_s == clean_s: + print 'Warning, Modified Server jar detected' + print 'Continuing with decompile may produce unpredictable results' + print 'If you continue, do not come to the FML or Forge team with decompile issues.' + answer = raw_input('If you really want to continue, enter "Yes" ') + if answer.lower() not in ['yes', 'y']: + print 'You have not entered "Yes", aborting the decompile process' + sys.exit(1) + def file_backup(base, file): back_jar = os.path.join(base, file + '.backup') src_jar = os.path.join(base, file) - if not os.path.isfile(src_jar): + if not os.path.isfile(src_jar) and not os.path.isfile(back_jar): return if os.path.isfile(back_jar): @@ -132,7 +163,6 @@ def setup_fml(fml_dir, mcp_dir): if os.path.isdir(src_dir): os.chdir(mcp_dir) - #cleanup -f cleanup(None, False) reset_logger() os.chdir(fml_dir) @@ -147,56 +177,59 @@ def setup_fml(fml_dir, mcp_dir): def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg): jars = {CLIENT: self.jarclient, SERVER: self.jarserver} - #print "==================================SHUNT %s============================" % side - #print "Java: %s" % self.cmdjava - #print "Javac: %s" % self.cmdjavac - #print "Jar: %s" % jars[side] binDir = os.path.join(fml_dir, 'bin') if not os.path.isdir(binDir): os.makedirs(binDir) - #Compile AccessTransformer - print 'Compiling AccessTransformer' - forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( - classpath=os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), - target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java')) - #print forkcmd - self.runcmd(forkcmd) - if (side == CLIENT): - print 'Compiling MCPMerger' - #Compile MCPMerger + if (side == CLIENT): + #Compile AccessTransformer + self.logger.info('> Compiling AccessTransformer') + forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( + classpath=os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), + target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java')) + + if not runcmd(self, forkcmd, echo=False): + sys.exit(1) + + self.logger.info('> Compiling MCPMerger') forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( classpath=os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'MCPMerger.java')) - #print forkcmd - self.runcmd(forkcmd) + + if not runcmd(self, forkcmd, echo=False): + sys.exit(1) - print 'Running MCPMerder for %s' % side + self.logger.info('> Running MCPMerger') #Run MCPMerger forkcmd = ('%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format( classpath=os.pathsep.join([os.path.join(mcp_dir, 'lib', '*'), binDir]), mergecfg=os.path.join(fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER]) - self.runcmd(forkcmd) + + if not runcmd(self, forkcmd): + sys.exit(1) - print 'Running AccessTransformer' + self.logger.info('> Running AccessTransformer') #Run AccessTransformer forkcmd = ('%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format( classpath=os.pathsep.join([os.path.join(mcp_dir, 'lib', '*'), binDir]), jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg')) forge_cfg = os.path.join(mcp_dir, 'forge', 'common', 'forge_at.cfg') if os.path.isfile(forge_cfg): + self.logger.info(' Forge config detected') forkcmd += ' "%s"' % forge_cfg - self.runcmd(forkcmd) + if not runcmd(self, forkcmd): + sys.exit(1) + self.logger.info('> Really Applying Retroguard') applyrg_real(self, side, reobf) #Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real = Commands.checkjars): self.jarclient = self.jarclient + '.backup' self.jarserver = self.jarserver + '.backup' - print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) + #print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] @@ -238,6 +271,27 @@ def setup_fml(fml_dir, mcp_dir): os.chdir(fml_dir) +def cmdsplit(args): + if os.sep == '\\': + args = args.replace('\\', '\\\\') + return shlex.split(args) + +def runcmd(commands, command, echo=True): + forklist = cmdsplit(command) + process = subprocess.Popen(forklist, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) + output, _ = process.communicate() + + if echo: + for line in output.splitlines(): + self.logger.info(line) + + if process.returncode: + if not echo: + for line in output.splitlines(): + self.logger.info(line) + return False + return True + def merge_client_server(mcp_dir): client = os.path.join(mcp_dir, 'src', 'minecraft') server = os.path.join(mcp_dir, 'src', 'minecraft_server') @@ -518,9 +572,15 @@ def setup_mcp(fml_dir, mcp_dir, dont_gen_conf=True): if os.path.isfile(temp): os.remove(temp) - sys.path.append(mcp_dir) - from runtime.commands import commands_sanity_check - commands_sanity_check() + try: + sys.path.append(mcp_dir) + from runtime.commands import commands_sanity_check + commands_sanity_check() + except ImportError as ex: + print 'Could not verify commands.py patch integrity, this typically means that you are not in a clean MCP environment.' + print 'Download a clean version of MCP 7.0a and try again' + print ex + sys.exit(1) mcp_conf = os.path.join(mcp_dir, 'conf') mcp_conf_bak = os.path.join(mcp_dir, 'conf.bak')