diff --git a/apply_patches.py b/apply_patches.py deleted file mode 100644 index 98caab34a..000000000 --- a/apply_patches.py +++ /dev/null @@ -1,95 +0,0 @@ -import os -import sys -import fnmatch -import shlex -import difflib -import time, subprocess -from optparse import OptionParser - -def cmdsplit(args): - if os.sep == '\\': - args = args.replace('\\', '\\\\') - return shlex.split(args) - -def main(): - print("Applying patches") - - parser = OptionParser() - parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to MCP', default=None) - parser.add_option('-p', '--patch-dir', action='store', dest='patch_dir', help='Patches Directory', default=None) - parser.add_option('-t', '--target-dir', action='store', dest='target_dir', help='Target Directory', default=None) - options, _ = parser.parse_args() - - if options.mcp_dir is None: - print 'Must supply MCP directory with --mcp-dir' - return - elif options.patch_dir is None: - print 'Must supply patches directory with --patch-dir' - return - elif options.target_dir is None: - print 'Must supplt target directory with --target-dir' - return - - print "Applying patches from '%s' to '%s'" % (options.patch_dir, options.target_dir) - apply_patches(options.mcp_dir, options.patch_dir, options.target_dir) - -def apply_patches(mcp_dir, patch_dir, target_dir, find=None, rep=None): - # Attempts to apply a directory full of patch files onto a target directory. - sys.path.append(mcp_dir) - - temp = os.path.abspath('temp.patch') - cmd = cmdsplit('patch -p2 -i "%s" ' % temp) - - 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)) - - 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)) - target_file = os.path.join(target_dir, fix_patch(patch_file, temp, find, rep)) - process = subprocess.Popen(cmd, cwd=target_dir, bufsize=-1) - process.communicate() - - if os.path.isfile(temp): - os.remove(temp) - -def fix_patch(in_file, out_file, find=None, rep=None): - #Fixes the following issues in the patch file if they exist: - # Normalizes the path seperators for the current OS - # Normalizes the line endings - # Returns the path that the file wants to apply to - - in_file = os.path.normpath(in_file) - if out_file is None: - tmp_file = in_file + '.tmp' - else: - out_file = os.path.normpath(out_file) - tmp_file = out_file - dir_name = os.path.dirname(out_file) - if dir_name: - if not os.path.exists(dir_name): - os.makedirs(dir_name) - - file = 'not found' - with open(in_file, 'rb') as inpatch: - with open(tmp_file, 'wb') as outpatch: - for line in inpatch: - line = line.rstrip('\r\n') - if line[:3] in ['+++', '---', 'Onl', 'dif']: - if not find == None and not rep == None: - line = line.replace('\\', '/').replace(find, rep).replace('/', os.sep) - else: - line = line.replace('\\', '/').replace('/', os.sep) - outpatch.write(line + os.linesep) - else: - outpatch.write(line + os.linesep) - if line[:3] == '---': - file = line[line.find(os.sep, line.find(os.sep)+1)+1:] - - if out_file is None: - shutil.move(tmp_file, in_file) - return file - -if __name__ == '__main__': - main() diff --git a/build.py b/build.py deleted file mode 100644 index 43f08267a..000000000 --- a/build.py +++ /dev/null @@ -1,34 +0,0 @@ -import os, os.path, sys -from optparse import OptionParser - -forge_dir = os.path.dirname(os.path.abspath(__file__)) -mcp_dir = os.path.abspath('..') - -from forge import build_forge_dev - -def main(): - - 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(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__': - main() \ No newline at end of file diff --git a/changelog.py b/changelog.py deleted file mode 100644 index bd4f2b900..000000000 --- a/changelog.py +++ /dev/null @@ -1,113 +0,0 @@ -import os, os.path, sys, re -import json, urllib2 -from pprint import pprint -from urlparse import urlparse -import base64 -import optparse, ast - -class PreemptiveBasicAuthHandler(urllib2.BaseHandler): - def __init__(self, password_mgr=None): - if password_mgr is None: - password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() - self.passwd = password_mgr - self.add_password = self.passwd.add_password - - def http_request(self,req): - uri = req.get_full_url() - user, pw = self.passwd.find_user_password(None,uri) - if pw is None: return req - raw = "%s:%s" % (user, pw) - auth = 'Basic %s' % base64.b64encode(raw).strip() - req.add_unredirected_header('Authorization', auth) - return req - - def https_request(self,req): - return self.http_request(req) - -def read_url(url): - handler = PreemptiveBasicAuthHandler() - handler.add_password(None, 'ci.jenkins.minecraftforge.net', 'console_script', 'dc6d48ca20a474beeac280a9a16a926e') - file = urllib2.build_opener(handler).open(url) - data = file.read() - file.close() - return data - -def getBuildInfo(url, current_version=None): - data = read_url(url) - data = ast.literal_eval(data)['allBuilds'] - data = sorted(data, key=lambda key: key['number'], reverse=False) - - items = [] - output = [] - - for build in data: - build['actions'] = filter(lambda act: act is not None, build['actions']) - build['actions'] = filter(lambda act: 'text' in act, build['actions']) - build['actions'] = filter(lambda act: not ' ' in act['text'], build['actions']) - if len(build['actions']) == 0: - build['version'] = current_version - current_version = None - else: - build['version'] = build['actions'][0]['text'] - build['items'] = build['changeSet']['items'] - for item in build['items']: - item['author'] = item['author']['fullName'] - if build['result'] != 'SUCCESS': - items += build['items'] - else: - build['items'] = items + build['items'] - items = [] - output += [build] - build.pop('changeSet') - build.pop('actions') - return sorted(output, key=lambda key: key['number'], reverse=True) - -def add_latest_build(url, builds, current_version=None): - data = read_url(url) - data = ast.literal_eval(data) - number = data['number'] - - if builds[0]['number'] == data['number']: - return builds - - for item in data['changeSet']['items']: - item['author'] = item['author']['fullName'] - - build = { - 'number' : data['number'], - 'result' : 'SUCCESS', #Currently build should always be success... Else things derp after words - 'version' : current_version, - 'items' : data['changeSet']['items'] - } - return [build] + builds - -def make_changelog(job_path, target_build, change_file, current_version=None): - builds = getBuildInfo('%s/api/python?tree=allBuilds[result,number,actions[text],changeSet[items[author[fullName],comment]]]&pretty=true' % job_path, current_version) - builds = add_latest_build('%s/lastBuild/api/python?pretty=true&tree=number,changeSet[items[author[fullName],comment]]' % job_path, builds, current_version) - - log = [ "Changelog:" ] - - for build in builds: - if int(build['number']) > target_build: continue - if len(build['items']) == 0: continue - log.append('') - if build['version'] is None: - log.append('Build %s' % build['number']) - else: - log.append('Build %s' % build['version']) - for change in build['items']: - comments = filter(lambda cmt: len(cmt) > 0, change['comment'].split('\n')) - if len(comments) > 1: - log.append('\t' + change['author']) - for comment in comments: - log.append('\t\t' + comment) - elif len(comments) == 1: - log.append('\t%s: %s' % (change['author'], comments[0])) - - file = open(change_file, 'wb') - for line in log: - file.write('%s\n' % line) - file.close() - -if __name__ == '__main__': - make_changelog("http://ci.jenkins.minecraftforge.net/job/minecraftforge/", 70000, 'changelog.txt', 'pinecone') \ No newline at end of file diff --git a/forge.py b/forge.py deleted file mode 100644 index 0615bc06e..000000000 --- a/forge.py +++ /dev/null @@ -1,139 +0,0 @@ -import os, os.path, sys -import urllib, zipfile -import shutil, glob, fnmatch -import subprocess, logging, re -import csv, shutil -import pprint - -forge_dir = os.path.dirname(os.path.abspath(__file__)) - -def reset_logger(): - log = logging.getLogger() - while len(log.handlers) > 0: - log.removeHandler(log.handlers[0]) - -version_reg = re.compile(r'(([a-z]+)Version[\s]+=[\s]+)(\d+);') -def load_version(build=0): - info = {'major' : -1, - 'minor' : -1, - 'revision' : -1, - 'build' : -1 - } - hook_file = os.path.join(forge_dir, 'common/net/minecraftforge/common/ForgeVersion.java'.replace('/', os.sep)) - with open(hook_file, 'r') as fh: - buf = fh.read() - - def proc(match): - try: - info[match.group(2)] = int(match.group(3)) - except: - pass - return match.group(0) - - buf = version_reg.sub(proc, buf) - info['build'] = build - return info - -def inject_version(src_file, build=0): - version = load_version(build) - - tmp_file = src_file + '.tmp' - with open(src_file, 'r') as fh: - buf = fh.read() - - def mapname(match): - try: - return '%s%s;' % (match.group(1), version[match.group(2)]) - except KeyError: - pass - return match.group(0) - - buf = version_reg.sub(mapname, buf).replace('\r\n', '\n') - - with open(tmp_file, 'wb') as fh: - fh.write(buf) - shutil.move(tmp_file, src_file) - -def zip_folder(path, key, zip): - import pprint - files = os.listdir(path) - for file in files: - file_path = os.path.join(path, file) - file_key = os.path.join(key, file) - if os.path.isdir(file_path): - zip_folder(file_path, file_key, zip) - else: - if not file_key.replace(os.sep, '/') in zip.NameToInfo: - print ' ' + file_key - zip.write(file_path, file_key) - -def zip_create(path, key, zip_name): - zip = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) - if os.path.isdir(path): - zip_folder(path, key, zip) - else: - zip.write(path, key) - zip.close() - -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 - print 'Applying Minecraft Forge patches' - sys.stdout.flush() - - 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 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')) - 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, 'minecraft')) - -def build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num=0): - version = load_version(build_num) - print '=================================== Build %d.%d.%d.%d Start =================================' % (version['major'], version['minor'], version['revision'], version['build']) - - src_dir = os.path.join(mcp_dir, 'src') - if os.path.isdir(src_dir): - 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' - copytree(os.path.join(mcp_dir, 'src_work'), src_dir) - print '\nCopying Client Code' - copytree(os.path.join(forge_dir, 'client'), os.path.join(src_dir, 'minecraft'), -1) - print '\nCopying Common Code' - copytree(os.path.join(forge_dir, 'common'), os.path.join(src_dir, 'minecraft'), -1) - print - inject_version(os.path.join(src_dir, 'minecraft/net/minecraftforge/common/ForgeVersion.java'.replace('/', os.sep)), build_num) - - error_level = 0 - try: - sys.path.append(mcp_dir) - from runtime.commands import Commands, CLIENT, SERVER, CalledProcessError - from runtime.mcp import recompile_side - - os.chdir(mcp_dir) - reset_logger() - - commands = Commands(None, verify=True) - try: - recompile_side(commands, CLIENT) - except CalledProcessError as e: - error_level = 1 - pass - reset_logger() - os.chdir(forge_dir) - except SystemExit, e: - 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/install/install.cmd b/install/install.cmd deleted file mode 100644 index 61436b21f..000000000 --- a/install/install.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -.\fml\python\python_fml install.py %* -pause \ No newline at end of file diff --git a/install/install.py b/install/install.py deleted file mode 100644 index aac857fdc..000000000 --- a/install/install.py +++ /dev/null @@ -1,78 +0,0 @@ -import os, os.path, sys -import urllib, zipfile -import shutil, glob, fnmatch -import subprocess, logging -from optparse import OptionParser - -def fml_main(fml_dir, mcp_dir, gen_conf=True, disable_patches=False, disable_at=False, disable_merge=False, enable_server=False, - disable_client=False, disable_rename=False, disable_assets=False, decompile=False): - sys.path.append(fml_dir) - from fml import download_mcp, setup_mcp, decompile_minecraft, apply_fml_patches, finish_setup_fml - print '================ Forge ModLoader Setup Start ===================' - download_mcp(fml_dir, mcp_dir) - setup_mcp(fml_dir, mcp_dir, gen_conf) - if decompile: - decompile_minecraft(fml_dir, mcp_dir, disable_at=disable_at, disable_merge=disable_merge, - enable_server=enable_server, disable_client=disable_client, - disable_assets=disable_assets) - if disable_patches: - print 'Patching disabled' - else: - apply_fml_patches(fml_dir, mcp_dir, os.path.join(mcp_dir, 'src')) - finish_setup_fml(fml_dir, mcp_dir, enable_server=enable_server, disable_client=disable_client, disable_rename=disable_rename) - else: - print 'Decompile free install is on the to-do!' - print '================ Forge ModLoader Setup End ===================' - -def forge_main(forge_dir, fml_dir, mcp_dir): - sys.path.append(mcp_dir) - sys.path.append(fml_dir) - from runtime.updatenames import updatenames - from runtime.updatemd5 import updatemd5 - from forge import apply_forge_patches - from fml import reset_logger - - print '=============================== Minecraft Forge Setup Start =====================================' - print 'Applying forge patches' - apply_forge_patches(fml_dir, mcp_dir, forge_dir, os.path.join(mcp_dir, 'src'), True) - os.chdir(mcp_dir) - updatenames(None, True, True, False) - reset_logger() - updatemd5(None, True, True, False) - reset_logger() - os.chdir(forge_dir) - print '=============================== Minecraft Forge Setup Finished =================================' - -if __name__ == '__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('-p', '--no-patch', action="store_true", dest='no_patch', help='Disable application of FML patches', default=False) - parser.add_option('-a', '--no-access', action="store_true", dest='no_access', help='Disable access transformers', default=False) - parser.add_option('-s', '--server', action="store_true", dest='enable_server', help='Enable decompilation of server', default=False) - parser.add_option('-c', '--no-client', action="store_true", dest='no_client', help='Disable decompilation of server', default=False) - parser.add_option('-e', '--no-merge', action="store_true", dest='no_merge', help='Disable merging server code into client', default=False) - parser.add_option('-n', '--no-rename', action="store_true", dest='no_rename', help='Disable running updatenames', default=False) - parser.add_option( '--no-assets', action="store_true", dest='no_assets', help='Disable downloading of assets folder', default=False) - parser.add_option('-d', '--decompile', action="store_true", dest='decompile', help='Decompile minecraft and apply patches', default=True) - options, _ = parser.parse_args() - - forge_dir = os.path.dirname(os.path.abspath(__file__)) - fml_dir = os.path.abspath('fml') - mcp_dir = os.path.abspath('mcp') - - if not options.mcp_dir is None: - mcp_dir = os.path.abspath(options.mcp_dir) - - if options.no_client: - options.no_patch = True - - if options.no_merge: - options.no_patch = True - - fml_main(fml_dir, mcp_dir, disable_patches=options.no_patch, - disable_at=options.no_access, disable_merge=options.no_merge, - enable_server=options.enable_server, disable_client=options.no_client, - disable_rename=options.no_rename, disable_assets=options.no_assets, - decompile=options.decompile, gen_conf=False) - - forge_main(forge_dir, fml_dir, mcp_dir) \ No newline at end of file diff --git a/install/install.sh b/install/install.sh deleted file mode 100644 index fba8952b0..000000000 --- a/install/install.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -python install.py "$@" \ No newline at end of file diff --git a/release.py b/release.py deleted file mode 100644 index 39607213b..000000000 --- a/release.py +++ /dev/null @@ -1,417 +0,0 @@ -import os, os.path, sys, glob -import shutil, fnmatch, time, json -import logging, zipfile, re, subprocess -from pprint import pformat, pprint -from optparse import OptionParser -from urllib2 import HTTPError -from contextlib import closing -from datetime import datetime -sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) -forge_dir = os.path.dirname(os.path.abspath(__file__)) -from forge import reset_logger, load_version, zip_folder, zip_create, inject_version, build_forge_dev -from changelog import make_changelog - -zip = None -zip_name = None -zip_base = None -version_str = None -version_mc = None - -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) - parser.add_option('-s', '--skipchangelog', action='store_true', dest='skip_changelog', help='Skip Changelog', default=False) - parser.add_option('-j', '--sign-jar', action='store', dest='sign_jar', help='Path to jar signer command', default=None) - options, _ = parser.parse_args() - - build_num = 0 - if not options.build is None: - try: - 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) - - ret = 0 - fml_dir = os.path.join(forge_dir, 'fml') - ret = build_forge_dev(mcp_dir, forge_dir, fml_dir, build_num) - 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() - - if os.path.isfile('MANIFEST.MF'): - os.remove('MANIFEST.MF') - - fml_name = os.path.basename(fml[0]).replace('src', 'universal').replace('.zip', '.jar').replace('-master.', '.') - print('Extracting %s MANIFEST.MF' % fml_name) - with closing(zipfile.ZipFile(os.path.join(forge_dir, 'fml', 'target', fml_name), mode='r')) as zip_in: - with closing(open('MANIFEST.MF', 'wb')) as out: - out.write(zip_in.read('META-INF/MANIFEST.MF')) - - 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, False) - reset_logger() - os.chdir(forge_dir) - except SystemExit, e: - print 'Reobfusicate Exception: %d ' % e.code - error_level = e.code - - extract_fml_obfed(fml_dir, mcp_dir, reobf_dir, client_dir) - gen_bin_patches(mcp_dir, os.path.join(forge_dir, 'fml'), build_num, 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(fml_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, 'target') - if not os.path.isdir(out_folder): - os.makedirs(out_folder) - - for f in ['minecraftforge-changelog-%s.txt', 'minecraftforge-universal-%s.jar', 'minecraftforge-installer-%s.jar']: - fn = os.path.join(out_folder, f % version_str) - if os.path.isfile(fn): - os.remove(fn) - - if not options.skip_changelog: - changelog_file = 'target/minecraftforge-changelog-%s.txt' % (version_str) - try: - make_changelog("http://ci.jenkins.minecraftforge.net/job/minecraftforge/", build_num, changelog_file, version_str) - except HTTPError, e: - print 'Changelog failed to generate: %s' % e - options.skip_changelog = True - - version_file = 'forgeversion.properties' - if os.path.exists(version_file): - os.remove(version_file) - - with open(version_file, 'wb') as fh: - fh.write('forge.major.number=%d\n' % version['major']) - fh.write('forge.minor.number=%d\n' % version['minor']) - fh.write('forge.revision.number=%d\n' % version['revision']) - fh.write('forge.build.number=%d\n' % version['build']) - - json_data = gather_json(forge_dir, version_mc, version_forge, version_str) - - if not options.sign_jar is None: - sign_jar(forge_dir, options.sign_jar, client_dir, 'minecraftforge-universal-%s.jar' % version_str) - else: - zip_start('minecraftforge-universal-%s.jar' % version_str) - zip_folder(client_dir, '', zip) - zip_add('MANIFEST.MF','META-INF/MANIFEST.MF') - zip_add('client/forge_logo.png') - 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('common/forge_at.cfg') - zip_add('common/assets','assets') - zip_add(version_file) - if not options.skip_changelog: - zip_add(changelog_file, 'MinecraftForge-Changelog.txt') - print(' version.json') - zip.writestr('version.json', json.dumps(json_data['versionInfo'], indent=4, separators=(',', ': '))) - - #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/mcplogo.png', - 'common/deobfuscation_data-%s.lzma' % version_mc - ] - for file in FML_FILES: - zip_add(os.path.join(fml_dir, file)) - - zip_end() - - build_installer(forge_dir, version_str, version_forge, version_mc, out_folder, json.dumps(json_data, indent=4, separators=(',', ': '))) - - 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_dir, 'fml') - zip_add('install', '') - zip_add('forge.py') - zip_add(version_file) - if not options.skip_changelog: - zip_add(changelog_file, 'MinecraftForge-Changelog.txt') - zip_end() - inject_version(os.path.join(forge_dir, 'common/net/minecraftforge/common/ForgeVersion.java'.replace('/', os.sep)), 0) - - if os.path.exists(version_file): - os.remove(version_file) - shutil.rmtree(temp_dir) - if os.path.isfile('MANIFEST.MF'): - os.remove('MANIFEST.MF') - - print '=================================== Release Finished %d =================================' % error_level - sys.exit(error_level) - -def gather_json(forge_dir, version_mc, version_forge, version_str): - def getTZ(): - ret = '-' - t = time.timezone - if (t < 0): - ret = '+' - t *= -1 - - h = int(t/60/60) - t -= (h*60*60) - m = int(t/60) - return '%s%02d%02d' % (ret, h, m) - timestamp = datetime.now().replace(microsecond=0).isoformat() + getTZ() - json_data = {} - with closing(open(os.path.join(forge_dir, 'fml', 'jsons', '%s-rel.json' % version_mc), 'r')) as fh: - data = fh.read() - data = data.replace('@version@', version_forge) - data = data.replace('@timestamp@', timestamp) - data = data.replace('@minecraft_version@', version_mc) - data = data.replace('@universal_jar@', 'minecraftforge-universal-%s.jar' % version_str) - data = data.replace('FMLTweaker', 'F_M_L_Tweaker') - data = data.replace('FML', 'Forge') - data = data.replace('F_M_L_Tweaker', 'FMLTweaker') - data = data.replace('cpw.mods:fml:', 'net.minecraftforge:minecraftforge:') - json_data = json.loads(data) - pprint(json_data) - return json_data - -def build_installer(forge_dir, version_str, version_forge, version_minecraft, out_folder, json_data): - file_name = 'minecraftforge-installer-%s.jar' % version_str - universal_name = 'minecraftforge-universal-%s.jar' % version_str - print '================== %s Start ==================' % file_name - with closing(zipfile.ZipFile(os.path.join(forge_dir, 'fml', 'installer_base.jar'), mode='a')) as zip_in: - with closing(zipfile.ZipFile(os.path.join(out_folder, file_name), 'w', zipfile.ZIP_DEFLATED)) as zip_out: - # Copy everything over - for i in zip_in.filelist: - if not i.filename in ['install_profile.json', 'big_logo.png']: - #print(' %s' % i.filename) - zip_out.writestr(i.filename, zip_in.read(i.filename)) - print(' %s' % universal_name) - zip_out.write(os.path.join(out_folder, universal_name), universal_name) - print(' big_logo.png') - zip_out.write(os.path.join(forge_dir, 'client', 'forge_logo.png'), 'big_logo.png') - print(' install_profile.json') - zip_out.writestr('install_profile.json', json_data) - - print '================== %s Finished ==================' % file_name - -def zip_add(file, key=None): - if key == None: - key = os.path.basename(file) - else: - key = key.replace('/', os.sep) - if not zip_base is None: - key = os.path.join(zip_base, key) - file = os.path.join(forge_dir, file.replace('/', os.sep)) - if os.path.isdir(file): - zip_folder(file, key, zip) - else: - if os.path.isfile(file): - print ' ' + key - zip.write(file, key) - -def zip_start(name, base=None): - global zip, zip_name, zip_base - zip_name = name - - print '================== %s Start ==================' % zip_name - zip_file = os.path.join(forge_dir, 'target', name) - zip = zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED) - zip_base = base - -def zip_end(): - global zip, zip_name, zip_base - zip.close() - print '================== %s Finished ==================' % zip_name - zip_name = None - zip_base = None - -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' - sys.exit(1) - - with open(props, 'r') as fh: - for line in fh: - line = line.strip() - if line.startswith('fmlbuild.mcversion'): - return line.split('=')[1].strip() - - print 'Could not load fmlversion.properties, build failed' - sys.exit(1) - -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) - - with open(fml_file, 'r') as fh: - lines = fh.readlines() - - client = zipfile.ZipFile(os.path.join(mcp_dir, 'temp', 'client_reobf.jar')) - - print 'Extracting Reobfed Forge ModLoader classes' - - for line in lines: - line = line.replace('\n', '').replace('\r', '').replace('/', os.sep) - if not os.path.isfile(os.path.join(reobf_dir, line)): - print ' %s' % line - side = line.split(os.sep)[0] - if side == 'minecraft': - client.extract(line[10:].replace(os.sep, '/'), 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', '') - branch = branch.replace('HEAD', '') - print 'Detected Branch as \'%s\'' % branch - return branch - -def sign_jar(forge_dir, command, files, dest_zip): - from subprocess import Popen, PIPE, STDOUT - global zip - zip_file = os.path.join(forge_dir, 'tmp.jar') - - if os.path.isfile(zip_file): - os.remove(zip_file) - - print '============== Creating tmp zip to sign =====================' - zf = zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED) - zf.write(os.path.join(forge_dir, 'MANIFEST.MF'), 'META-INF/MANIFEST.MF') - zip_folder_filter(files, '', zf, 'cpw/mods/'.replace('/', os.sep)) - zip_folder_filter(files, '', zf, 'net/minecraftforge/'.replace('/', os.sep)) - zf.close() - print '================ End tmp zip to sign ========================' - - try: - process = Popen([command, zip_file, "forge"], stdout=PIPE, stderr=STDOUT, bufsize=-1) - out, _ = process.communicate() - print out - except OSError as e: - print "Error creating signed tmp jar: %s" % e.strerror - sys.exit(1) - - tmp_dir = os.path.join(forge_dir, 'tmp') - if os.path.isdir(tmp_dir): - shutil.rmtree(tmp_dir) - - zf = zipfile.ZipFile(zip_file) - zf.extractall(tmp_dir) - zf.close() - os.remove(zip_file) - - zip_start(dest_zip) - zip_folder(tmp_dir, '', zip) - zip_folder(files, '', zip) - - if os.path.isdir(tmp_dir): - shutil.rmtree(tmp_dir) - -def zip_folder_filter(path, key, zip, filter): - files = os.listdir(path) - for file in files: - file_path = os.path.join(path, file) - file_key = os.path.join(key, file) - if os.path.isdir(file_path): - zip_folder_filter(file_path, file_key, zip, filter) - else: - if file_key.startswith(filter): - print file_key - zip.write(file_path, file_key) - -def gen_bin_patches(mcp_dir, fml_dir, build_num, client_dir): - print('Creating Binary patches') - os.environ['WORKSPACE'] = os.path.join(mcp_dir, '..') - os.environ['BUILD_NUMBER'] = str(build_num) - - BUILD = ['ant', 'makebinpatches'] - if sys.platform.startswith('win'): - BUILD = ['cmd', '/C'] + BUILD - - if not run_command(BUILD, cwd=fml_dir): - print('Could not crate binary patches') - sys.exit(1) - - fml_lzma = os.path.join(fml_dir, 'binpatches.pack.lzma') - obf_lzma = os.path.join(client_dir, 'binpatches.pack.lzma') - shutil.move(fml_lzma, obf_lzma) - -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: - print "failed: {0}".format(process.returncode) - return False - return True - -if __name__ == '__main__': - main() diff --git a/setup.py b/setup.py deleted file mode 100644 index 89389e4a2..000000000 --- a/setup.py +++ /dev/null @@ -1,113 +0,0 @@ -import os, os.path, sys, zipfile -import shutil, glob, fnmatch, subprocess -from pprint import pformat -from optparse import OptionParser -sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) -forge_dir = os.path.dirname(os.path.abspath(__file__)) - -from forge import apply_forge_patches - -def main(): - print '=================================== Setup Start =================================' - - 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('-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) - - src_dir = os.path.join(mcp_dir, 'src') - - 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') - - if os.path.isdir(base_dir): - shutil.rmtree(base_dir) - if os.path.isdir(work_dir): - shutil.rmtree(work_dir) - - print 'Setting up source directories' - shutil.copytree(src_dir, base_dir) - shutil.copytree(src_dir, work_dir) - - print 'Applying forge patches' - 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, build_num=0): - print 'Setting up Forge ModLoader' - os.environ['WORKSPACE'] = os.path.abspath(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) - - print('Copy resources:') - copy_files(os.path.join(fml_dir, 'client'), os.path.join(mcp_dir, 'src', 'minecraft')) - copy_files(os.path.join(fml_dir, 'common'), os.path.join(mcp_dir, 'src', 'minecraft')) - - name = 'fmlversion.properties' - print(' ' + name) - shutil.copy(os.path.join(fml_dir, name), os.path.join(mcp_dir, 'src', 'minecraft', name)) - -def copy_files(src_dir, dest_dir): - for file in glob.glob(os.path.join(src_dir, '*')): - if not os.path.isfile(file) or file.lower().endswith('.java'): - continue - print(' ' + file) - shutil.copy(file, os.path.join(dest_dir, os.path.basename(file))) - -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: - print "failed: {0}".format(process.returncode) - return False - return True - -def setup_eclipse(forge_dir): - eclipse_dir = os.path.join(forge_dir, 'eclipse') - eclipse_zip = os.path.join(forge_dir, 'eclipse-workspace-dev.zip') - - if not os.path.isdir(eclipse_dir) and os.path.isfile(eclipse_zip): - print 'Extracting Dev Workspace' - zf = zipfile.ZipFile(eclipse_zip) - zf.extractall(forge_dir) - zf.close() - -if __name__ == '__main__': - main() diff --git a/submodule_changlog.py b/submodule_changlog.py deleted file mode 100644 index 73063a6f0..000000000 --- a/submodule_changlog.py +++ /dev/null @@ -1,51 +0,0 @@ -import subprocess, sys, os -from pprint import pformat -from optparse import OptionParser - -def run_command(command, cwd='.'): - #print('Running command: ') - process = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, cwd=cwd) - out, err = process.communicate() - out = out.strip('\n') - #print(pformat(out.split('\n'))) - if process.returncode: - print('failed: %d' % process.returncode) - return None - return out.split('\n') - -def main(options, args): - output = run_command(['git', 'diff', '--no-color', '--', 'fml']) - if output is None: - print('Failed to grab submodule commits') - sys.exit(1) - - start = None - end = None - for line in output: - if not 'Subproject commit' in line: - continue - if line[0:18] == '-Subproject commit': - start = line[19:] - elif line[0:18] == '+Subproject commit': - end = line[19:] - if end.endswith('-dirty'): - end = end[0:len(end)-6] - - if start == None or end == None: - print('Could not extract start and end range') - sys.exit(1) - - #print('Start: %s' % start) - #print('End: %s' % end) - - output = run_command(['git', 'log', '--reverse', '--pretty=oneline', '%s...%s' % (start, end)], './fml') - print('Updated FML:') - for line in output: - print('MinecraftForge/FML@%s' % line) - - -if __name__ == '__main__': - parser = OptionParser() - options, args = parser.parse_args() - - main(options, args) \ No newline at end of file diff --git a/update_patches.py b/update_patches.py deleted file mode 100644 index 50b378a0f..000000000 --- a/update_patches.py +++ /dev/null @@ -1,83 +0,0 @@ -import os -import sys -import fnmatch -import shlex -import difflib -import time -from optparse import OptionParser - -def cmdsplit(args): - if os.sep == '\\': - args = args.replace('\\', '\\\\') - return shlex.split(args) - -def cleanDirs(path): - if not os.path.isdir(path): - return - - files = os.listdir(path) - if len(files): - for f in files: - fullpath = os.path.join(path, f) - if os.path.isdir(fullpath): - cleanDirs(fullpath) - - files = os.listdir(path) - if len(files) == 0: - os.rmdir(path) - -def main(): - print("Creating patches") - - parser = OptionParser() - parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to MCP', default=None) - parser.add_option('-p', '--patch-dir', action='store', dest='patch_dir', help='Folder to place patches in', 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')) - if not options.patch_dir is None: - patchd = os.path.normpath(options.patch_dir) - print "Patch folder set to '%s'" % patchd - base = os.path.normpath(os.path.join(mcp, 'src_base')) - work = os.path.normpath(os.path.join(mcp, 'src_work')) - - for path, _, filelist in os.walk(work, followlinks=True): - for cur_file in fnmatch.filter(filelist, '*.java'): - file_base = os.path.normpath(os.path.join(base, path[len(work)+1:], cur_file)).replace(os.path.sep, '/') - file_work = os.path.normpath(os.path.join(work, path[len(work)+1:], cur_file)).replace(os.path.sep, '/') - if not os.path.isfile(file_base): - print("Missing base file %s"%(file_base)) - continue - fromlines = open(file_base, 'U').readlines() - tolines = open(file_work, 'U').readlines() - - patch = ''.join(difflib.unified_diff(fromlines, tolines, '../' + file_base[len(mcp)+1:], '../' + file_work[len(mcp)+1:], '', '', n=3)) - patch_dir = os.path.join(patchd, path[len(work)+1:]) - patch_file = os.path.join(patch_dir, cur_file + '.patch') - - if len(patch) > 0: - print patch_file[len(patchd)+1:] - patch = patch.replace('\r\n', '\n') - - if not os.path.exists(patch_dir): - os.makedirs(patch_dir) - with open(patch_file, 'wb') as fh: - fh.write(patch) - else: - if os.path.isfile(patch_file): - print("Deleting empty patch: %s"%(patch_file)) - os.remove(patch_file) - - - cleanDirs(patchd) - -if __name__ == '__main__': - main()