Files

38 lines
2.8 KiB
Python

"""Package only closed lifecycle trials 2-5; never runs a GUI or checker."""
from pathlib import Path
import hashlib,json,sys,zipfile
OUT=Path(__file__).resolve().parent
ROOT=Path(sys.argv[1]).resolve() if len(sys.argv)>1 else OUT.parents[3]
SRC=ROOT/'.local/transition-native'
def pin(b):return {'bytes':len(b),'sha256':hashlib.sha256(b).hexdigest()}
def main():
payload={};runs={}
for number in (2,3,4,5):
run=f'lifecycle-{number}';folder=SRC/run
result=json.loads((folder/'result.json').read_bytes())
assert result['exitCode']==0 and 'finish' in result,run+' not closed successfully'
for f in sorted(folder.rglob('*')):
if f.is_file():payload['native/'+f.relative_to(SRC).as_posix()]=f.read_bytes()
helpers={}
for field,name in [('runner',f'run-lifecycle-{number}.py'),('launchCapture',f'capture-lifecycle-{number}.js'),('snapshot',f'check-lifecycle-snapshot-{number}.py')]:
helpers[field]='helpers/'+name;payload[helpers[field]]=(SRC/name).read_bytes()
captures=[n for n,b in payload.items() if n.startswith('native/'+run+'/') and n.endswith('.json') and isinstance(json.loads(b),dict) and 'images' in json.loads(b)]
snapshots={f.name:json.loads((f/'result.json').read_bytes())['command'][2] for f in sorted((folder/'snapshots').iterdir()) if f.is_dir()}
runs[run]={'helpers':helpers,'guiBuild':'footer-windows-build-2' if number<4 else 'footer-windows-build-3','captures':captures,'snapshots':snapshots}
for f in sorted((SRC/'lifecycle-input-1').rglob('*')):
if f.is_file():payload['fixtures/'+f.relative_to(SRC/'lifecycle-input-1').as_posix()]=f.read_bytes()
checks=OUT.parent/'checks'
payload['references/checks-manifest.json']=(checks/'manifest.json').read_bytes()
manifest={'schema':1,'checksEvidence':pin((checks/'evidence.zip').read_bytes()),
'checksRelativePath':'../checks/evidence.zip','originalNativeDirectory':str(SRC).replace('\\','/'),
'runs':runs,'members':{n:pin(b) for n,b in sorted(payload.items())}}
with zipfile.ZipFile(OUT/'evidence.zip','w',compression=zipfile.ZIP_DEFLATED,compresslevel=9) as z:
for n,b in sorted(payload.items()):
info=zipfile.ZipInfo(n,date_time=(2026,9,22,0,0,0));info.compress_type=zipfile.ZIP_DEFLATED;z.writestr(info,b)
(OUT/'manifest.json').write_bytes((json.dumps(manifest,indent=2)+'\n').encode())
for n in ('README.md','verify.py','prepare.py'):(OUT/n).write_bytes((OUT/n).read_bytes().replace(b'\r\n',b'\n'))
files={n:pin((OUT/n).read_bytes()) for n in ('evidence.zip','manifest.json','README.md','verify.py','prepare.py')}
(OUT/'files.json').write_bytes((json.dumps(files,indent=2)+'\n').encode())
print(json.dumps(files,indent=2));print('Native raw members:',len(payload))
if __name__=='__main__':main()