38 lines
2.8 KiB
Python
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()
|