#!/usr/bin/env python3 """Apply only the three verified compilation fixes to an isolated source copy.""" import difflib import hashlib import json import os from pathlib import Path import re import sys os.umask(0o077) run = Path(sys.argv[1]).resolve() source = run / 'source' manifest = json.loads((run / 'source-manifest.json').read_text()) changes = { 'pom.xml': ( b'${java.home}/lib/rt.jar;${java.home}/lib/jce.jar', b'${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar', ), 'src/main/java/com/zzc/web/htoal/controller/HotelQuarterStatisticController.java': ( b'import com.sun.org.apache.regexp.internal.recompile;\r\n', b'', ), 'src/main/java/com/zzc/web/travel/controller/InlandStatisticPageController.java': ( b'import com.sun.org.apache.regexp.internal.recompile;\r\n', b'', ), } patches = [] for relative, (before, after) in changes.items(): path = source / relative data = path.read_bytes() backup = run / 'artifacts/original-build-files' / relative if hashlib.sha256(data).hexdigest() == manifest[relative]: assert data.count(before) == 1, relative if relative.endswith('.java'): assert len(re.findall(rb'\brecompile\b', data)) == 1, relative backup.parent.mkdir(parents=True, exist_ok=True) backup.write_bytes(data) path.write_bytes(data.replace(before, after, 1)) elif relative == 'pom.xml' and (run / 'artifacts/pom-original.xml').exists(): original = (run / 'artifacts/pom-original.xml').read_bytes() assert hashlib.sha256(original).hexdigest() == manifest[relative] assert data == original.replace(before, after, 1) backup.parent.mkdir(parents=True, exist_ok=True) backup.write_bytes(original) else: assert backup.exists(), 'Unexpected source change: ' + relative assert hashlib.sha256(backup.read_bytes()).hexdigest() == manifest[relative] assert data == backup.read_bytes().replace(before, after, 1) patches.extend(difflib.unified_diff( backup.read_text().splitlines(keepends=True), path.read_text().splitlines(keepends=True), fromfile='a/' + relative, tofile='b/' + relative, )) print('Compatibility fix verified:', relative) (run / 'artifacts/compatibility.patch').write_text(''.join(patches))