Files
ARCADIA-Studio/harness/experiments/packaged-server-865483b-20260911/archive.py
T

31 lines
2.0 KiB
Python

"""Copy closed evidence only; does not launch an application or acceptance test."""
from pathlib import Path
import hashlib, json, shutil
DEST=Path(__file__).resolve().parent
SOURCE=DEST.parents[2]/'.local/packaged-server-865483b-20260911'
PAYLOAD=DEST/'payload'
def sha(path):return hashlib.sha256(path.read_bytes()).hexdigest().upper()
original_manifest=SOURCE/'evidence-sha256.json'
assert sha(original_manifest)=='147DF4A33A7CC00557CE6020DC21051D16A592DD41C9F8DC98D6BB363B0ED710'
entries=json.loads(original_manifest.read_text(encoding='utf-8'))
assert len(entries)==181
actual={str(p.relative_to(SOURCE)):p for p in SOURCE.rglob('*') if p.is_file()}
assert set(actual)==set(entries)|{'evidence-sha256.json'},set(actual)^set(entries)
for relative,digest in entries.items():assert sha(actual[relative])==digest,relative
assert not PAYLOAD.exists()
records=[]
for relative,original in sorted(actual.items()):
assert original.suffix.lower() not in {'.exe','.dll','.pdb','.rlib','.rmeta','.obj','.o','.a','.zip','.7z','.png','.jpg','.jpeg','.gif','.pdf'},relative
original.read_bytes().decode('utf-8-sig') # Text evidence only, including empty lock/log files.
copied=PAYLOAD/relative
copied.parent.mkdir(parents=True,exist_ok=True)
shutil.copyfile(original,copied)
before={'bytes':original.stat().st_size,'sha256':sha(original)}
after={'bytes':copied.stat().st_size,'sha256':sha(copied)}
assert before==after,relative
records.append({'source':str(original),'archive':str(copied.relative_to(DEST)),'original':before,'copy':after})
report={'result':'passed','source_root':str(SOURCE),'original_manifest_sha256':sha(original_manifest),'original_manifest_entries':181,'copied_files':len(records),'copied_bytes':sum(r['original']['bytes'] for r in records),'excluded_binary_files':[],'records':records}
(DEST/'original-copy-manifest.json').write_text(json.dumps(report,indent=2),encoding='utf-8')
print(json.dumps({k:v for k,v in report.items() if k!='records'},indent=2))