From 51159de108bc85079db13b2a6c92a63418221896 Mon Sep 17 00:00:00 2001 From: LexManos Date: Mon, 3 Dec 2012 18:15:38 -0800 Subject: [PATCH] Update python files to add support for specifying MCP directory and FML downloading MCP on the fly. --- .gitignore | 1 + build.bat | 2 +- build.py | 20 ++++++++++++-- forge.py | 9 ++---- release.bat | 2 +- release.py | 68 +++++++++++++++++++++++++++++++--------------- setup.bat | 21 +++++++++++++- setup.py | 58 +++++++++++++++++++++++---------------- update_patches.bat | 2 +- update_patches.py | 16 +++++++++-- update_patches.sh | 3 +- 11 files changed, 141 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index af4f887fb..5ff86d0e3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /*.pyc /forge-*/ /patches-old/ +/mcp/ diff --git a/build.bat b/build.bat index 8792694de..cea5edaf5 100644 --- a/build.bat +++ b/build.bat @@ -1,2 +1,2 @@ @echo off -..\runtime\bin\python\python_mcp build.py %* +fml\python\python_fml build.py %* diff --git a/build.py b/build.py index 3613bc000..43f08267a 100644 --- a/build.py +++ b/build.py @@ -1,4 +1,5 @@ import os, os.path, sys +from optparse import OptionParser forge_dir = os.path.dirname(os.path.abspath(__file__)) mcp_dir = os.path.abspath('..') @@ -6,14 +7,27 @@ mcp_dir = os.path.abspath('..') from forge import build_forge_dev def main(): - build_num = 0 - if len(sys.argv) > 1: + parser = OptionParser() + parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='MCP Path', default=None) + 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(sys.argv[1]) + 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('..') + sys.exit(build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num)) if __name__ == '__main__': diff --git a/forge.py b/forge.py index fde86b82b..b28083bd3 100644 --- a/forge.py +++ b/forge.py @@ -6,9 +6,6 @@ import csv, shutil import pprint forge_dir = os.path.dirname(os.path.abspath(__file__)) -mcp_dir = os.path.abspath('..') -src_dir = os.path.join(mcp_dir, 'src') -sys.path.append(mcp_dir) def reset_logger(): log = logging.getLogger() @@ -124,10 +121,10 @@ def build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num=0): recompile(None, True, False) reset_logger() os.chdir(forge_dir) - except SystemExit, e: - print 'Recompile Exception: %d ' % e.code - error_level = e.code + if not e.code == 0: + print 'Recompile Exception: %d ' % e.code + error_level = e.code print '=================================== Build Finished %d =================================' % error_level return error_level \ No newline at end of file diff --git a/release.bat b/release.bat index 5170034ca..04eec1cd2 100644 --- a/release.bat +++ b/release.bat @@ -1,2 +1,2 @@ @echo off -..\runtime\bin\python\python_mcp release.py %* \ No newline at end of file +fml\python\python_fml release.py %* \ No newline at end of file diff --git a/release.py b/release.py index f9c81b5e9..dfd9fb204 100644 --- a/release.py +++ b/release.py @@ -1,19 +1,12 @@ import os, os.path, sys import shutil, fnmatch import logging, zipfile, re +from optparse import OptionParser forge_dir = os.path.dirname(os.path.abspath(__file__)) -mcp_dir = os.path.abspath('..') -src_dir = os.path.join(mcp_dir, 'src') - -sys.path.append(mcp_dir) -from runtime.reobfuscate import reobfuscate - from forge import reset_logger, load_version, zip_folder, zip_create, inject_version, build_forge_dev from changelog import make_changelog -reobf_dir = os.path.join(mcp_dir, 'reobf') -client_dir = os.path.join(reobf_dir, 'minecraft') zip = None zip_name = None zip_base = None @@ -24,21 +17,36 @@ def main(): global version_str global version_mc + parser = OptionParser() + parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='MCP Path', default=None) + parser.add_option('-b', '--build', action='store', dest='build', help='Build number', default=None) + options, _ = parser.parse_args() + build_num = 0 - if len(sys.argv) > 1: + if not options.build is None: try: - build_num = int(sys.argv[1]) + build_num = int(options.build) except: pass + + 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') build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num) if ret != 0: sys.exit(ret) + print '=================================== Release Start =================================' error_level = 0 try: + sys.path.append(mcp_dir) + from runtime.reobfuscate import reobfuscate os.chdir(mcp_dir) reset_logger() reobfuscate(None, False, True, True, True, False) @@ -48,13 +56,20 @@ def main(): print 'Reobfusicate Exception: %d ' % e.code error_level = e.code - extract_fml_obfed() - extract_paulscode() + 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_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) + branch = get_branch_name() version_str = '%s-%s' % (version_mc, version_forge) + if not branch == "": + version_str = '%s-%s' % (version_str, branch) out_folder = os.path.join(forge_dir, 'forge-%s' % version_str) if os.path.isdir(out_folder): @@ -102,15 +117,8 @@ def main(): zip_add('common', 'common') zip_add('patches', 'patches') zip_add('fml', 'fml') - zip_add('install/install.cmd') - zip_add('install/install.sh') - zip_add('install/README-MinecraftForge.txt') - zip_add('install/install.py') + zip_add('install', '') zip_add('forge.py') - zip_add('install/MinecraftForge-Credits.txt') - zip_add('install/MinecraftForge-License.txt') - zip_add('install/Paulscode IBXM Library License.txt') - zip_add('install/Paulscode SoundSystem CodecIBXM License.txt') zip_add(version_file) zip_add(changelog_file, 'MinecraftForge-Changelog.txt') zip_end() @@ -169,7 +177,7 @@ def load_mc_version(forge_dir): print 'Could not load fmlversion.properties, build failed' sys.exit(1) -def extract_fml_obfed(): +def extract_fml_obfed(mcp_dir, reobf_dir, client_dir): fml_file = os.path.join(forge_dir, 'fml', 'difflist.txt') if not os.path.isfile(fml_file): print 'Could not find Forge ModLoader\'s DiffList, looking for it at: %s' % fml_file @@ -192,7 +200,7 @@ def extract_fml_obfed(): client.close() -def extract_paulscode(): +def extract_paulscode(mcp_dir, client_dir): client = zipfile.ZipFile(os.path.join(mcp_dir, 'temp', 'client_reobf.jar')) print 'Extracting Reobfed Paulscode for mac users -.-' @@ -204,6 +212,22 @@ def extract_paulscode(): client.extract(i.filename, client_dir) client.close() + +def get_branch_name(): + from subprocess import Popen, PIPE, STDOUT + branch = '' + if os.getenv("GIT_BRANCH") is None: + try: + process = Popen(["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=PIPE, stderr=STDOUT, bufsize=-1) + branch, _ = process.communicate() + branch = branch.rstrip('\r\n') + except OSError: + print "Git not found" + else: + branch = os.getenv("GIT_BRANCH").rpartition('/')[2] + branch = branch.replace('master', '') + print 'Detected Branch as \'%s\'' % branch + return branch if __name__ == '__main__': main() diff --git a/setup.bat b/setup.bat index fcf83dd96..137df8a20 100644 --- a/setup.bat +++ b/setup.bat @@ -1,2 +1,21 @@ @echo off -..\runtime\bin\python\python_mcp setup.py %* \ No newline at end of file + +@SET PATH=%PATH%;.\GnuWin32\ + +if exist "fml" rmdir /S /Q fml + +for %%f in (fml-*.zip) do ( + if exist "fml" ( + echo Multiple FML zips detected, aborting: %%~nf + exit /b 1 + ) + echo Extracting %%~nf + unzip -q %%~nf.zip +) + +if not exist "fml" ( + echo Could not find a valid FML FML jar, aborting + exit /b 1 +) + +fml\python\python_fml setup.py --no-extract %* \ No newline at end of file diff --git a/setup.py b/setup.py index 0a8b3f257..b5556e708 100644 --- a/setup.py +++ b/setup.py @@ -1,17 +1,30 @@ -import os, os.path, sys -import urllib, zipfile +import os, os.path, sys, zipfile import shutil, glob, fnmatch -import subprocess, logging +from optparse import OptionParser forge_dir = os.path.dirname(os.path.abspath(__file__)) -mcp_dir = os.path.abspath('..') -src_dir = os.path.join(mcp_dir, 'src') from forge import apply_forge_patches def main(): print '=================================== Setup Start =================================' - setup_fml() + + 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) + options, _ = parser.parse_args() + + 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) base_dir = os.path.join(mcp_dir, 'src_base') work_dir = os.path.join(mcp_dir, 'src_work') @@ -30,26 +43,25 @@ def main(): print '=================================== Setup Finished =================================' -def setup_fml(): +def setup_fml(mcp_dir, fml_dir, dont_extract=False): print 'Setting up Forge ModLoader' - fml = glob.glob(os.path.join(forge_dir, 'fml-src-*.zip')) - if not len(fml) == 1: - if len(fml) == 0: - print 'Missing FML source zip, should be named fml-src-*.zip inside your forge folder, obtain it from the repo' - 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 not dont_extract: + fml = glob.glob(os.path.join(forge_dir, 'fml-src-*.zip')) + if not len(fml) == 1: + if len(fml) == 0: + print 'Missing FML source zip, should be named fml-src-*.zip inside your forge folder, obtain it from the repo' + 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) - fml_dir = os.path.join(forge_dir, 'fml') - - if os.path.isdir(fml_dir): - shutil.rmtree(fml_dir) + if os.path.isdir(fml_dir): + shutil.rmtree(fml_dir) + + print 'Extracting: %s' % os.path.basename(fml[0]) - print 'Extracting: %s' % os.path.basename(fml[0]) - - zf = zipfile.ZipFile(fml[0]) - zf.extractall(forge_dir) - zf.close() + zf = zipfile.ZipFile(fml[0]) + zf.extractall(forge_dir) + zf.close() sys.path.append(fml_dir) from install import fml_main diff --git a/update_patches.bat b/update_patches.bat index dc15a40a4..c3a4e9690 100644 --- a/update_patches.bat +++ b/update_patches.bat @@ -1,2 +1,2 @@ @echo off -..\runtime\bin\python\python_mcp update_patches.py .. . +fml\python\python_fml update_patches.py %* \ No newline at end of file diff --git a/update_patches.py b/update_patches.py index 281a6918a..d89d08166 100644 --- a/update_patches.py +++ b/update_patches.py @@ -4,6 +4,7 @@ import fnmatch import shlex import difflib import time +from optparse import OptionParser def cmdsplit(args): if os.sep == '\\': @@ -27,8 +28,19 @@ def cleanDirs(path): def main(): print("Creating patches") - mcp = os.path.normpath(sys.argv[1]) - forge_dir = os.path.normpath(sys.argv[2]) + + parser = OptionParser() + parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to MCP', default=None) + options, _ = parser.parse_args() + + forge_dir = os.path.dirname(os.path.abspath(__file__)) + + mcp = os.path.join(forge_dir, 'mcp') + if not options.mcp_dir is None: + mcp = os.path.abspath(options.mcp_dir) + elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): + mcp = os.path.abspath('..') + patchd = os.path.normpath(os.path.join(forge_dir, 'patches')) base = os.path.normpath(os.path.join(mcp, 'src_base')) work = os.path.normpath(os.path.join(mcp, 'src_work')) diff --git a/update_patches.sh b/update_patches.sh index 4c3408931..4f579cc04 100755 --- a/update_patches.sh +++ b/update_patches.sh @@ -1 +1,2 @@ -python update_patches.py .. . +#!/bin/bash +python update_patches.py "$@" \ No newline at end of file