#!/usr/bin/env python3 from __future__ import annotations import argparse,hashlib from pathlib import Path ROOT=Path(__file__).resolve().parent;OUT=ROOT/"BUNDLE_SHA256SUMS.txt" def digest(path:Path)->str: value=hashlib.sha256() with path.open("rb") as handle: for block in iter(lambda:handle.read(1<<20),b""):value.update(block) return value.hexdigest() def rows()->list[str]:return [f"{digest(path)} {path.relative_to(ROOT).as_posix()}" for path in sorted(ROOT.rglob("*")) if path.is_file() and path!=OUT and "__pycache__" not in path.parts] parser=argparse.ArgumentParser();parser.add_argument("--verify",action="store_true");args=parser.parse_args();rendered="\n".join(rows())+"\n" if args.verify: if not OUT.exists() or OUT.read_text(encoding="utf-8")!=rendered:raise SystemExit("manifest mismatch") print(f"verified {len(rows())} entries") else:OUT.write_text(rendered,encoding="utf-8");print(f"wrote {len(rows())} entries to {OUT.name}")