Files
syly2/ops/uat-build/apply-compatibility.py
T

55 lines
2.3 KiB
Python

#!/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))