33 lines
1.7 KiB
Python
33 lines
1.7 KiB
Python
import hashlib
|
|
import json
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
root = Path(__file__).resolve().parent
|
|
workspace = root.parents[1]
|
|
base = root.parent / 'application-20260831-120612/payload/backend-source.zip'
|
|
changed = ['backend/internal/app/im.go', 'backend/internal/app/im_unread_integration_test.go']
|
|
source = root / 'backend-source.zip'
|
|
with zipfile.ZipFile(str(base)) as old, zipfile.ZipFile(str(source), 'w', zipfile.ZIP_DEFLATED) as new:
|
|
for item in old.infolist():
|
|
if item.filename not in changed:
|
|
new.writestr(item, old.read(item))
|
|
for name in changed:
|
|
new.write(str(root / name), name)
|
|
with zipfile.ZipFile(str(base)) as old, zipfile.ZipFile(str(source)) as new:
|
|
def hashes(z):
|
|
return {i.filename: hashlib.sha256(z.read(i)).hexdigest() for i in z.infolist() if not i.is_dir()}
|
|
left, right = hashes(old), hashes(new)
|
|
actual = sorted(name for name in left.keys() | right.keys() if left.get(name) != right.get(name))
|
|
assert actual == changed, actual
|
|
files = {name: hashlib.sha256((root / name).read_bytes()).hexdigest() for name in ['xingyu-api', 'backend-source.zip']}
|
|
manifest = json.dumps({'files': files}, indent=2)
|
|
(root / 'manifest.json').write_text(manifest, encoding='utf-8')
|
|
with zipfile.ZipFile(str(root / 'release.zip'), 'w', zipfile.ZIP_DEFLATED) as package:
|
|
for name in [*files, 'manifest.json']:
|
|
package.write(str(root / name), name)
|
|
package.write(str(workspace / 'deploy/baota_publish_im_unread.py'), 'baota_publish_im_unread.py')
|
|
result = {'sha256': hashlib.sha256((root / 'release.zip').read_bytes()).hexdigest(), 'files': files, 'changed': actual}
|
|
(root / 'package-result.json').write_text(json.dumps(result, indent=2), encoding='utf-8')
|
|
print(json.dumps(result))
|