diff --git a/fml-src-2.9.91.194.zip b/fml-src-2.9.91.194.zip new file mode 100644 index 0000000000..9dcd8e1a4a Binary files /dev/null and b/fml-src-2.9.91.194.zip differ diff --git a/forge.py b/forge.py index b9ee19e255..cb5b0d64f3 100644 --- a/forge.py +++ b/forge.py @@ -6,124 +6,12 @@ import subprocess, logging, re 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.pylibs.normlines import normaliselines -from runtime.commands import cmdsplit - -def apply_patches(patch_dir, target_dir): - temp = os.path.abspath('temp.patch') - cmd = cmdsplit('patch -p2 -i "%s" ' % temp) - display = True - - if os.name == 'nt': - applydiff = os.path.abspath(os.path.join(mcp_dir, 'runtime', 'bin', 'applydiff.exe')) - cmd = cmdsplit('"%s" -uf -p2 -i "%s"' % (applydiff, temp)) - display = False - - for path, _, filelist in os.walk(patch_dir, followlinks=True): - for cur_file in fnmatch.filter(filelist, '*.patch'): - patch_file = os.path.normpath(os.path.join(patch_dir, path[len(patch_dir)+1:], cur_file)) - if display: - print 'patching file %s' % os.path.join(path[len(patch_dir)+1:], cur_file) - normaliselines(patch_file, temp) - process = subprocess.Popen(cmd, cwd=target_dir, bufsize=-1) - process.communicate() - - if os.path.isfile(temp): - os.remove(temp) - -#Taken from: http://stackoverflow.com/questions/7545299/distutil-shutil-copytree -def _mkdir(newdir): - """works the way a good mkdir should :) - - already exists, silently complete - - regular file in the way, raise an exception - - parent directory(ies) does not exist, make them as well - """ - if os.path.isdir(newdir): - pass - elif os.path.isfile(newdir): - raise OSError("a file with the same name as the desired " \ - "dir, '%s', already exists." % newdir) - else: - head, tail = os.path.split(newdir) - if head and not os.path.isdir(head): - _mkdir(head) - #print "_mkdir %s" % repr(newdir) - if tail: - os.mkdir(newdir) - -#Taken from: http://stackoverflow.com/questions/7545299/distutil-shutil-copytree -def copytree(src, dst, verbose=0, symlinks=False): - """Recursively copy a directory tree using copy2(). - - The destination directory must not already exist. - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. - - XXX Consider this example code rather than the ultimate tool. - - """ - - if verbose == -1: - verbose = len(os.path.abspath(dst)) - 1 - names = os.listdir(src) - # os.makedirs(dst) - _mkdir(dst) # XXX - errors = [] - for name in names: - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if symlinks and os.path.islink(srcname): - linkto = os.readlink(srcname) - os.symlink(linkto, dstname) - elif os.path.isdir(srcname): - copytree(srcname, dstname, verbose, symlinks) - else: - shutil.copy2(srcname, dstname) - if verbose > 0: - print os.path.abspath(srcname)[verbose:] - # XXX What about devices, sockets etc.? - except (IOError, os.error), why: - errors.append((srcname, dstname, str(why))) - # catch the Error from the recursive copytree so that we can - # continue with other files - except Exception, err: - errors.extend(err.args[0]) - try: - shutil.copystat(src, dst) - except WindowsError: - # can't copy file access times on Windows - pass def reset_logger(): log = logging.getLogger() while len(log.handlers) > 0: log.removeHandler(log.handlers[0]) - -def download_ff(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')) - - if os.path.isfile(ff_path): - return True - - try: - urllib.urlretrieve("http://goo.gl/PnJHp", 'fernflower.zip') - zf = zipfile.ZipFile('fernflower.zip') - zf.extract('fernflower.jar', bin_path) - zf.close() - os.remove('fernflower.zip') - print "Downloaded Fernflower successfully" - return True - except: - print "Downloading Fernflower failed download manually from http://goo.gl/PnJHp" - return False version_reg = re.compile(r'(([a-z]+)Version[\s]+=[\s]+)(\d+);') def load_version(build=0): @@ -186,65 +74,34 @@ def zip_create(path, key, zip_name): zip.write(path, key) zip.close() -count = 0 -def cleanup_source(path): - path = os.path.normpath(path) - regex_cases_before = re.compile(r'((case|default).+\r?\n)\r?\n', re.MULTILINE) #Fixes newline after case before case body - regex_cases_after = re.compile(r'\r?\n(\r?\n[ \t]+(case|default))', re.MULTILINE) #Fixes newline after case body before new case + +def apply_forge_patches(fml_dir, mcp_dir, forge_dir, src_dir, copy_files=True): + sys.path.append(fml_dir) + from fml import copytree, apply_patches - def updatefile(src_file): - global count - tmp_file = src_file + '.tmp' - count = 0 - with open(src_file, 'r') as fh: - buf = fh.read() - - def fix_cases(match): - global count - count += 1 - return match.group(1) - - buf = regex_cases_before.sub(fix_cases, buf) - buf = regex_cases_after.sub(fix_cases, buf) - if count > 0: - with open(tmp_file, 'w') as fh: - fh.write(buf) - shutil.move(tmp_file, src_file) - - for path, _, filelist in os.walk(path, followlinks=True): - sub_dir = os.path.relpath(path, path) - for cur_file in fnmatch.filter(filelist, '*.java'): - src_file = os.path.normpath(os.path.join(path, cur_file)) - updatefile(src_file) - - -def pre_decompile(): - bin_dir = os.path.join(mcp_dir, 'jars', 'bin') - back_jar = os.path.join(bin_dir, 'minecraft.jar.backup') - src_jar = os.path.join(bin_dir, 'minecraft.jar') + has_client = os.path.isdir(os.path.join(src_dir, 'minecraft')) + has_server = os.path.isdir(os.path.join(src_dir, 'minecraft_server')) - if os.path.isfile(back_jar): - if os.path.isfile(src_jar): - os.remove(src_jar) - shutil.move(back_jar, src_jar) + #patch files + print 'Applying Minecraft Forge patches' + sys.stdout.flush() + if has_client: + if os.path.isdir(os.path.join(forge_dir, 'patches', 'minecraft')): + apply_patches(mcp_dir, os.path.join(forge_dir, 'patches', 'minecraft'), src_dir) + if os.path.isdir(os.path.join(forge_dir, 'patches', 'common')): + apply_patches(mcp_dir, os.path.join(forge_dir, 'patches', 'common'), src_dir, '/common/', '/minecraft/') + if copy_files and os.path.isdir(os.path.join(forge_dir, 'client')): + copytree(os.path.join(forge_dir, 'client'), os.path.join(src_dir, 'minecraft')) -def post_decompile(): - print 'Stripping META-INF from minecraft.jar' - bin_dir = os.path.join(mcp_dir, 'jars', 'bin') - back_jar = os.path.join(bin_dir, 'minecraft.jar.backup') - src_jar = os.path.join(bin_dir, 'minecraft.jar') - - if os.path.isfile(back_jar): - os.remove(back_jar) - - shutil.move(src_jar, back_jar) - - zip_in = zipfile.ZipFile(back_jar, mode='a') - zip_out = zipfile.ZipFile(src_jar, 'w', zipfile.ZIP_DEFLATED) - for i in zip_in.filelist: - if not i.filename.startswith('META-INF'): - c = zip_in.read(i.filename) - zip_out.writestr(i.filename, c) - else: - print 'Skipping: %s' % i.filename - zip_out.close() \ No newline at end of file + if has_server: + if os.path.isdir(os.path.join(forge_dir, 'patches', 'minecraft_server')): + apply_patches(mcp_dir, os.path.join(forge_dir, 'patches', 'minecraft_server'), src_dir) + if os.path.isdir(os.path.join(forge_dir, 'patches', 'common')): + apply_patches(mcp_dir, os.path.join(forge_dir, 'patches', 'common'), src_dir, '/common/', '/minecraft_server/') + if copy_files and os.path.isdir(os.path.join(forge_dir, 'server')): + copytree(os.path.join(forge_dir, 'server'), os.path.join(src_dir, 'minecraft_server')) + + if os.path.isdir(os.path.join(forge_dir, 'patches', 'common')): + apply_patches(mcp_dir, os.path.join(forge_dir, 'patches', 'common'), src_dir) + if copy_files and os.path.isdir(os.path.join(forge_dir, 'common')): + copytree(os.path.join(forge_dir, 'common'), os.path.join(src_dir, 'common')) \ No newline at end of file diff --git a/setup.bat b/setup.bat index e250abaa6a..fcf83dd96c 100644 --- a/setup.bat +++ b/setup.bat @@ -1,5 +1,2 @@ @echo off -..\runtime\bin\python\python_mcp setup.py %* -if NOT "%1"=="-skipdecompile" ( - pause -) \ No newline at end of file +..\runtime\bin\python\python_mcp setup.py %* \ No newline at end of file diff --git a/setup.py b/setup.py index 2e0362a574..302f4a7e38 100644 --- a/setup.py +++ b/setup.py @@ -7,56 +7,12 @@ 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.decompile import decompile -from runtime.updatenames import updatenames -from runtime.updatemd5 import updatemd5 - -from forge import apply_patches, copytree, reset_logger, download_ff, cleanup_source, pre_decompile, post_decompile - +from forge import apply_forge_patches def main(): print '=================================== Setup Start =================================' - - skipDecompile = len(sys.argv) > 1 and sys.argv[1] == '-skipdecompile' - if not skipDecompile: - if not download_ff(mcp_dir): - sys.exit(1) - - if os.path.isdir(src_dir): - shutil.rmtree(src_dir) - - try: - - pre_decompile() - - os.chdir(mcp_dir) - # Conf JAD CSV -r -d -a -n -p -o -l -g - decompile(None, False, False, True, True, False, True, False, False, False, False) - reset_logger() - os.chdir(forge_dir) - - post_decompile() - - except SystemExit, e: - print 'Decompile Exception: %d ' % e.code - raise e - - if not os.path.isdir(src_dir): - print 'Something went wrong, src folder not found at: %s' % src_dir - sys.exit(1) - - cleanup_source(src_dir) - setup_fml() - os.chdir(mcp_dir) - updatenames(None, True) - reset_logger() - updatemd5(None, True) - reset_logger() - os.chdir(forge_dir) - base_dir = os.path.join(mcp_dir, 'src_base') work_dir = os.path.join(mcp_dir, 'src_work') @@ -70,7 +26,7 @@ def main(): shutil.copytree(src_dir, work_dir) print 'Applying forge patches' - apply_patches(os.path.join(forge_dir, 'patches'), work_dir) + apply_forge_patches(os.path.join(forge_dir, 'fml'), mcp_dir, forge_dir, work_dir, False) print '=================================== Setup Finished =================================' @@ -85,6 +41,7 @@ def setup_fml(): sys.exit(1) fml_dir = os.path.join(forge_dir, 'fml') + if os.path.isdir(fml_dir): shutil.rmtree(fml_dir) @@ -94,9 +51,9 @@ def setup_fml(): zf.extractall(forge_dir) zf.close() - print 'Applying Forge ModLoader patches' - apply_patches(os.path.join(fml_dir, 'patches'), src_dir) - copytree(os.path.join(fml_dir, 'src'), src_dir) + sys.path.append(fml_dir) + from install import fml_main + fml_main(fml_dir, mcp_dir) if __name__ == '__main__': main() \ No newline at end of file