Files
aiturk-hermes-ide/apps/desktop/assets/codex-bridge/prepare_native_watch.py
T

29 lines
1.8 KiB
Python

"""Provision a reviewable launcher candidate. Never sets CODEX_CLI_PATH or restarts apps."""
import argparse
import hashlib
import json
from pathlib import Path
import shutil
def prepare(source, destination, original, expected_sha256, python, bridge_home, hermes_home):
source, destination = Path(source).resolve(), Path(destination).resolve()
original, python = Path(original).resolve(), Path(python).resolve()
def digest(p):
with p.open('rb') as f: return hashlib.file_digest(f,'sha256').hexdigest()
if digest(original) != expected_sha256.lower(): raise ValueError('chosen official original hash mismatch')
if original == destination/'native-watch.exe': raise ValueError('recursive original')
if source == destination: raise ValueError('candidate must use separate destination')
destination.mkdir(parents=True,exist_ok=True)
for p in source.rglob('*'):
if p.is_file() and (p.suffix in ('.py','.pyd') or p.name in ('native-watch.exe','LICENSE')) and not p.name.startswith('test_'):
target=destination/p.relative_to(source);target.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(p,target)
script=destination/'native_watch_launcher.py'
manifest=dict(original=str(original),original_sha256=expected_sha256.lower(),python=str(python),python_sha256=digest(python),script=str(script),script_sha256=digest(script),bridge_home=str(Path(bridge_home).resolve()),hermes_home=str(Path(hermes_home).resolve()))
(destination/'native-watch.json').write_text(json.dumps(manifest,indent=2),encoding='utf-8')
return destination/'native-watch.exe'
if __name__=='__main__':
p=argparse.ArgumentParser(description=__doc__)
for name in ('source','destination','original','expected-sha256','python','bridge-home','hermes-home'): p.add_argument('--'+name,required=True)
args=vars(p.parse_args());print(prepare(**args))