Updated FML install to provide better error output, Updated commands.py patch to disable recompile of server project.

This commit is contained in:
LexManos committed 2012-08-13 21:02:55 -07:00
1 parent a8f69529fd
commit bbcdaa7dfb
2 files changed
+116 -46

No files matched your search

+22 -12
View File
@@ -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)
+94 -34
View File
@@ -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')