mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-12 00:07:45 +00:00
inital push of updated setup script and cleaned up forge.py
This commit is contained in:
1 parent
a4d6d7028d
commit
e59bb6679e
4 files changed
+35
-224
No files matched your search
Binary file not shown.
@@ -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()
|
||||
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'))
|
||||
@@ -1,5 +1,2 @@
|
||||
@echo off
|
||||
..\runtime\bin\python\python_mcp setup.py %*
|
||||
if NOT "%1"=="-skipdecompile" (
|
||||
pause
|
||||
)
|
||||
..\runtime\bin\python\python_mcp 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()
|
||||
Reference in new issue
Block a user