tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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()