ForgePatch/fml/update_packages.py

110 lines
3.8 KiB
Python

import os, os.path, sys
import shutil, glob, fnmatch
import csv, re
from pprint import pprint
from zipfile import ZipFile
from optparse import OptionParser
def get_merged_info(mcp_dir):
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 main():
parser = OptionParser()
parser.add_option('-m', '--mcp-dir', action='store_true', dest='mcp_dir', help='Path to download/extract MCP to', default=None)
options, _ = parser.parse_args()
fml_dir = os.path.dirname(os.path.abspath(__file__))
mcp_dir = os.path.abspath('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('..')
client_jar = os.path.join(mcp_dir, 'jars', 'bin', 'minecraft.jar.backup')
server_jar = os.path.join(mcp_dir, 'jars', 'minecraft_server.jar.backup')
server_classes = []
client_classes = []
zip = ZipFile(client_jar)
for i in zip.filelist:
if i.filename.endswith('.class') and i.filename.find('/') == -1:
client_classes.append(i.filename[:-6])
zip.close()
zip = ZipFile(server_jar)
for i in zip.filelist:
if i.filename.endswith('.class') and i.filename.find('/') == -1:
server_classes.append(i.filename[:-6])
zip.close()
srg = get_merged_info(mcp_dir)
pkgs = {}
pkg_file = os.path.join('conf', 'packages.csv')
if os.path.isfile(pkg_file):
with open(pkg_file) as fh:
reader = csv.DictReader(fh)
for line in reader:
pkgs[line['class']] = line['package']
classes = []
for cls in srg['CL:'].keys():
if cls.startswith('net/minecraft/src/'):
obf = srg['CL:'][cls]
cls = cls[18:]
classes.append(cls)
if obf in server_classes:
server_classes.remove(obf)
server_classes.append(cls)
if obf in client_classes:
client_classes.remove(obf)
client_classes.append(cls)
for cls in pkgs.keys():
if not cls in classes:
print 'Removed Class: %s/%s' % (pkgs[cls], cls)
pkgs.pop(cls)
for cls in classes:
if not cls in pkgs.keys():
print 'New Class: %s' % cls
if cls.find('/') == -1:
if cls in server_classes and cls in client_classes:
pkgs[cls] = 'get_me_out_of_here_shared'
elif cls in server_classes:
pkgs[cls] = 'get_me_out_of_here_server'
elif cls in client_classes:
pkgs[cls] = 'get_me_out_of_here_client'
else:
pkgs[cls] = 'get_me_out_of_here_src'
tmp=[]
for cls,pkg in pkgs.items():
tmp.append({'class': cls, 'package': pkg})
with open(pkg_file, 'wb') as fh:
writer = csv.DictWriter(fh, fieldnames=['class', 'package'], lineterminator='\n')
writer.writeheader()
for row in sorted(tmp, key=lambda x: (x['package'], x['class'])):
writer.writerow(row)
if __name__ == '__main__':
main()