diff --git a/forge.py b/forge.py index 4e9de37c3..241d8f005 100644 --- a/forge.py +++ b/forge.py @@ -64,7 +64,7 @@ def zip_folder(path, key, zip): zip_folder(file_path, file_key, zip) else: if not file_key.replace(os.sep, '/') in zip.NameToInfo: - print file_key + print ' ' + file_key zip.write(file_path, file_key) def zip_create(path, key, zip_name): @@ -77,6 +77,7 @@ def zip_create(path, key, zip_name): def apply_forge_patches(fml_dir, mcp_dir, forge_dir, src_dir, copy_files=True): sys.path.append(fml_dir) + sys.path.append(os.path.join(fml_dir, 'install')) from fml import copytree, apply_patches #patch files @@ -100,6 +101,7 @@ def build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num=0): shutil.rmtree(src_dir) sys.path.append(fml_dir) + sys.path.append(os.path.join(fml_dir, 'install')) from fml import copytree print 'src_work -> src' diff --git a/release.py b/release.py index 95060406c..373b3306a 100644 --- a/release.py +++ b/release.py @@ -34,8 +34,6 @@ def main(): mcp_dir = os.path.join(forge_dir, 'mcp') if not options.mcp_dir is None: mcp_dir = os.path.abspath(options.mcp_dir) - elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): - mcp_dir = os.path.abspath('..') ret = 0 fml_dir = os.path.join(forge_dir, 'fml') @@ -43,8 +41,31 @@ def main(): if ret != 0: sys.exit(ret) + + temp_dir = os.path.join(forge_dir, 'temp') + src_dir = os.path.join(mcp_dir, 'src') + reobf_dir = os.path.join(mcp_dir, 'reobf') + client_dir = os.path.join(reobf_dir, 'minecraft') + fml_dir = os.path.join(temp_dir, 'fml') print '=================================== Release Start =================================' + + fml = glob.glob(os.path.join(forge_dir, 'fml', 'target', 'fml-src-*.%d-*.zip' % build_num)) + if not len(fml) == 1: + if len(fml) == 0: + print 'Missing FML source zip, should be named fml-src-*.zip inside ./fml/target/ created when running setup' + else: + print 'To many FML source zips found, we should only have one. Check the Forge Git for the latest FML version supported' + sys.exit(1) + + if os.path.isdir(fml_dir): + shutil.rmtree(fml_dir) + + print 'Extracting: %s' % os.path.basename(fml[0]) + zf = zipfile.ZipFile(fml[0]) + zf.extractall(temp_dir) + zf.close() + error_level = 0 try: sys.path.append(mcp_dir) @@ -58,15 +79,11 @@ def main(): print 'Reobfusicate Exception: %d ' % e.code error_level = e.code - src_dir = os.path.join(mcp_dir, 'src') - reobf_dir = os.path.join(mcp_dir, 'reobf') - client_dir = os.path.join(reobf_dir, 'minecraft') - - extract_fml_obfed(mcp_dir, reobf_dir, client_dir) + extract_fml_obfed(fml_dir, mcp_dir, reobf_dir, client_dir) extract_paulscode(mcp_dir, client_dir) version = load_version(build_num) version_forge = '%d.%d.%d.%d' % (version['major'], version['minor'], version['revision'], version['build']) - version_mc = load_mc_version(forge_dir) + version_mc = load_mc_version(fml_dir) branch = get_branch_name() version_str = '%s-%s' % (version_mc, version_forge) @@ -103,33 +120,35 @@ def main(): zip_add('client/forge_logo.png') zip_add('install/MinecraftForge-Credits.txt') zip_add('install/MinecraftForge-License.txt') - zip_add('fml/CREDITS-fml.txt') - zip_add('fml/LICENSE-fml.txt') - zip_add('fml/README-fml.txt') - zip_add('fml/common/fml_at.cfg') - zip_add('fml/common/fml_marker.cfg') - zip_add('fml/common/fmlversion.properties') - zip_add('fml/common/mcpmod.info') - zip_add('fml/client/mcp.png') zip_add('install/Paulscode IBXM Library License.txt') zip_add('install/Paulscode SoundSystem CodecIBXM License.txt') zip_add('common/forge_at.cfg') zip_add(version_file) if not options.skip_changelog: zip_add(changelog_file, 'MinecraftForge-Changelog.txt') - zip_end() - zips = glob.glob('fml/mcp*.zip') - for i in zips: - print 'Removing MCP Zip: %s' % os.path.basename(i) - os.remove(i) + #Add dependancy and licenses from FML + FML_FILES = [ + 'CREDITS-fml.txt', + 'LICENSE-fml.txt', + 'README-fml.txt', + 'common/fml_at.cfg', + 'common/fml_marker.cfg', + 'common/fmlversion.properties', + 'common/mcpmod.info', + 'client/mcp.png' + ] + for file in FML_FILES: + zip_add(os.path.join(fml_dir, file)) + + zip_end() inject_version(os.path.join(forge_dir, 'common/net/minecraftforge/common/ForgeVersion.java'.replace('/', os.sep)), build_num) zip_start('minecraftforge-src-%s.zip' % version_str, 'forge') zip_add('client', 'client') zip_add('common', 'common') zip_add('patches', 'patches') - zip_add('fml', 'fml') + zip_add(fml_dir, 'fml') zip_add('install', '') zip_add('forge.py') zip_add(version_file) @@ -140,6 +159,7 @@ def main(): if os.path.exists(version_file): os.remove(version_file) + shutil.rmtree(temp_dir) print '=================================== Release Finished %d =================================' % error_level sys.exit(error_level) @@ -156,7 +176,7 @@ def zip_add(file, key=None): zip_folder(file, key, zip) else: if os.path.isfile(file): - print key + print ' ' + key zip.write(file, key) def zip_start(name, base=None): @@ -175,8 +195,8 @@ def zip_end(): zip_name = None zip_base = None -def load_mc_version(forge_dir): - props = os.path.join(forge_dir, 'fml', 'common', 'fmlversion.properties') +def load_mc_version(fml_dir): + props = os.path.join(fml_dir, 'common', 'fmlversion.properties') if not os.path.isfile(props): print 'Could not load fmlversion.properties, build failed' @@ -191,8 +211,8 @@ def load_mc_version(forge_dir): print 'Could not load fmlversion.properties, build failed' sys.exit(1) -def extract_fml_obfed(mcp_dir, reobf_dir, client_dir): - fml_file = os.path.join(forge_dir, 'fml', 'difflist.txt') +def extract_fml_obfed(fml_dir, mcp_dir, reobf_dir, client_dir): + fml_file = os.path.join(fml_dir, 'difflist.txt') if not os.path.isfile(fml_file): print 'Could not find Forge ModLoader\'s DiffList, looking for it at: %s' % fml_file sys.exit(1) diff --git a/setup.py b/setup.py index 016a489df..f03769f00 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ import os, os.path, sys, zipfile -import shutil, glob, fnmatch +import shutil, glob, fnmatch, subprocess +from pprint import pformat from optparse import OptionParser forge_dir = os.path.dirname(os.path.abspath(__file__)) @@ -11,20 +12,25 @@ def main(): parser = OptionParser() parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to download/extract MCP to', default=None) - parser.add_option('-n', '--no-extract', action='store_true', dest='no_extract', help='Do not attempt to extract FML zip files', default=False) + parser.add_option('-b', '--build', action='store', dest='build', help='Build number', default=None) options, _ = parser.parse_args() + build_num = 0 + if not options.build is None: + try: + build_num = int(options.build) + except: + pass + fml_dir = os.path.join(forge_dir, 'fml') mcp_dir = os.path.join(forge_dir, 'mcp') if not options.mcp_dir is None: mcp_dir = os.path.abspath(options.mcp_dir) - elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): - mcp_dir = os.path.abspath('..') src_dir = os.path.join(mcp_dir, 'src') - setup_fml(mcp_dir, fml_dir, options.no_extract) + setup_fml(mcp_dir, fml_dir, build_num) base_dir = os.path.join(mcp_dir, 'src_base') work_dir = os.path.join(mcp_dir, 'src_work') @@ -39,17 +45,44 @@ def main(): shutil.copytree(src_dir, work_dir) print 'Applying forge patches' - apply_forge_patches(os.path.join(forge_dir, 'fml'), mcp_dir, forge_dir, work_dir, False) + apply_forge_patches(fml_dir, mcp_dir, forge_dir, work_dir, False) setup_eclipse(forge_dir) print '=================================== Setup Finished =================================' -def setup_fml(mcp_dir, fml_dir, dont_extract=False): +def setup_fml(mcp_dir, fml_dir, build_num=0): print 'Setting up Forge ModLoader' - sys.path.append(os.path.join(fml_dir,'install')os.path.join(forge_dir, 'fml')) - from install import fml_main - fml_main(fml_dir, mcp_dir, True) + os.environ['WORKSPACE'] = os.path.join(mcp_dir, '..') + os.environ['BUILD_NUMBER'] = str(build_num) + + BUILD = ['ant', 'jenkinsbuild'] + if sys.platform.startswith('win'): + BUILD = ['cmd', '/C'] + BUILD + + if not run_command(BUILD, cwd=fml_dir): + print('Could not setup FML') + sys.exit(1) + + sys.path.append(fml_dir) + sys.path.append(os.path.join(fml_dir, 'install')) + from fml import finish_setup_fml + finish_setup_fml(fml_dir, mcp_dir) + +def run_command(command, cwd='.', verbose=True): + print('Running command: ') + print(pformat(command)) + + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, cwd=cwd) + while process.poll() is None: + line = process.stdout.readline() + if line: + line = line.rstrip() + print(line) + if process.returncode: + self.logger.error("failed: %d", process.returncode) + return False + return True def setup_eclipse(forge_dir): eclipse_dir = os.path.join(forge_dir, 'eclipse') diff --git a/updateasmdata.py b/updateasmdata.py deleted file mode 100644 index 0bcc8929c..000000000 --- a/updateasmdata.py +++ /dev/null @@ -1,107 +0,0 @@ -import os, os.path, sys -import shutil, glob, fnmatch -import csv, re - -ctorsigre = re.compile('\((.*)\)') -ctorparamre = re.compile('(([ZBCSIJFD]|L([\w\/]+);))') - -def get_merged_info(): - mcp_dir = os.path.join(os.getcwd(), 'mcp') - joined = os.path.join(mcp_dir, 'conf', 'joined.srg') - values = {'PK:': {}, 'CL:': {}, 'FD:': {}, 'MD:': {}} - - if not os.path.isfile(joined): - sys.path.append('install') - from fml import gen_merged_srg - values = gen_merged_srg(mcp_dir, None) - else: - with open(joined, 'r') as fh: - for line in fh: - pts = line.rstrip('\r\n').split(' ') - if pts[0] == 'MD:': - values[pts[0]][pts[1] + ' ' + pts[2]] = pts[3] + ' ' + pts[4] - else: - values[pts[0]][pts[1]] = pts[2] - - return {t:{v.split(' ')[0]:k for k, v in m.items()} for t,m in values.items()} - -def process_file(file, srg): - name = os.path.basename(file) - print 'Processing: ' + name - - if name == 'mcp_merge.cfg': - with open(file + '-new','w') as nf: - with open(file) as f: - for line in f: - parts = line.split('#') - target = parts[1].strip() - newpart = '%s%s #%s\n' % (parts[0][0], srg['CL:'][target], target) - nf.write(newpart) - else: - with open(file + '-new', 'wb') as nf: - with open(file) as f: - for line in f: - parts = line.split('#') - if len(parts) < 2: - nf.write(line) - continue - if len(parts[1]) < 4: - nf.write(line) - continue - - typ = parts[1][0:3] - - if not srg.has_key(typ): - nf.write(line) - continue - - name = parts[1][3:].strip() - name = (name if name.startswith('net/minecraft/') else 'net/minecraft/src/' + name) - action = parts[0].split(' ') - - if name.endswith('/*'): - targ = srg['CL:'][name[:-2]] - wildcard = ('.*()' if typ == 'MD:' else '.*') - - newline = '%s %s%s #%s' % (action[0], targ, wildcard, '#'.join(parts[1:])) - nf.write(newline) - - elif name.find('/') >= 0: - targ = srg['CL:'][name[:name.find('/')]] - args = '(' - armatch = ctorsigre.search(name).group(1) - for bit in ctorparamre.findall(armatch): - if len(bit[2]) > 0 and srg['CL:'].has_key(bit[2]): - cl = 'L' + srg['CL:'][bit[2]] + ';' - else: - cl = bit[1] - args += cl - args += ')V' - newline = ('%s %s.%s #%s' % (action[0], targ, args, '#'.join(parts[1:]))) - nf.write(newline) - - else: - if name not in srg[typ]: - nf.write("%s # -- MISSING MAPPING" %( line )) - print("%s is missing a mapping"% name) - else: - targ = srg[typ][name] - args = targ.replace('/', '.', 1).replace(' ', '', 1) - newline = ('%s %s #%s' % (action[0], args, '#'.join(parts[1:]))) - nf.write(newline) - -def main(): - srg = get_merged_info() - for arg in sys.argv: - path = os.path.join(os.getcwd(), arg) - - if arg.endswith('_at.cfg') or arg == 'mcp_merge.cfg': - process_file(path, srg) - elif os.path.isdir(path): - for file in os.listdir(path): - if file.endswith('_at.cfg'): - process_file(os.path.join(path, file), srg) - -if __name__ == '__main__': - main() -