repair_support_dependencies.py (2650B)
1 #!/usr/bin/env python3 2 """Materialize full immutable old support providers; never compile sources. 3 Used only with the separately checked complete-provider identity reuse proof. Records retain 4 original receipts and manifests; this does not impersonate the new compiler. 5 """ 6 import argparse 7 import json 8 from pathlib import Path 9 import shutil 10 import sys 11 import time 12 from bootstrap_archive import select_exports 13 from bundle_dag import read 14 from native_library_migration import digest 15 from process_rss import run_guarded 16 17 ROOT=Path(__file__).resolve().parent.parent 18 19 def main(): 20 p=argparse.ArgumentParser(description=__doc__) 21 p.add_argument('tricu',type=Path);p.add_argument('directory',type=Path) 22 p.add_argument('--alias',action='append',required=True) 23 p.add_argument('--seconds',type=float,default=600) 24 a=p.parse_args();r=a.directory.resolve();r.mkdir(parents=True,exist_ok=False) 25 store=r/'application';workspace=r/'workspace';workspace.mkdir() 26 fixture=ROOT/'test/fixtures/support-origin.arboricx' 27 metadata=(ROOT/'test/fixtures/support-origin.v1').read_text().splitlines() 28 assert 'bundle\t'+digest('tricu.support-library-fixture.v1',fixture.read_bytes()) in metadata 29 rows={row.split('\t')[2]:row.split('\t')[1:] for row in metadata if row.startswith('module\t')} 30 provenance={rec['alias']:rec for rec in json.loads(next(row.split('\t',1)[1] for row in metadata if row.startswith('provenance\t')))} 31 exports=read(fixture)[3];records=[];start=time.monotonic() 32 for alias in a.alias: 33 legacy,_,path,source_digest=rows[alias];source=(ROOT/path).read_bytes() 34 assert digest('arboricx.source.v1',source)==source_digest 35 bundle=r/(alias+'.arboricx') 36 select_exports(fixture,bundle,[(k,k.split('.',1)[1]) for k in exports if k.startswith(alias+'.')]) 37 text,peak=run_guarded([str(a.tricu.resolve()),'arboricx','import','--file',str(bundle),'--store',str(store),'+RTS','-N1','-M4g','-RTS'],memory_mib=4096,seconds=min(600,a.seconds-(time.monotonic()-start))) 38 import re 39 manifest=re.search(r'Created module alias .* -> ([a-f0-9]{64})',text)[1] 40 assert manifest==provenance[alias]['manifest'],'original full manifest was not reproduced' 41 (workspace/(alias+'.tri')).write_bytes(source) 42 records.append(dict(provenance[alias],path=path,complete=True,retained_origin=True, 43 origin_bundle_digest=digest('tricu.support-library-fixture.v1',fixture.read_bytes()))) 44 (r/'migration.json').write_text(json.dumps(records,indent=2)+'\n') 45 print(alias,manifest,'peak',peak,flush=True) 46 47 if __name__=='__main__':main()