33 lines
1.6 KiB
Python
33 lines
1.6 KiB
Python
"""Preserve each independent evaluator invocation and its raw terminal streams."""
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
import hashlib
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
|
|
out = Path(__file__).resolve().parent
|
|
scope = sys.argv[1]
|
|
assert scope in ('artifact', 'server')
|
|
sha = lambda p: hashlib.sha256(p.read_bytes()).hexdigest()
|
|
paths = {key: out / (scope + '-' + key + suffix) for key, suffix in (('stdout', '.log'), ('stderr', '.log'), ('command', '.json'))}
|
|
assert all(not p.exists() for p in paths.values())
|
|
command = [sys.executable, '-X', 'utf8', str(out / 'review.py'), scope]
|
|
result = {'started_utc': datetime.now(timezone.utc).isoformat(), 'command': command,
|
|
'cwd': str(out), 'script_sha256': sha(out / 'review.py'),
|
|
'frozen_inputs_sha256': sha(out / 'frozen-inputs.json')}
|
|
started = time.monotonic()
|
|
with paths['stdout'].open('xb') as stdout, paths['stderr'].open('xb') as stderr:
|
|
completed = subprocess.run(command, cwd=out, stdout=stdout, stderr=stderr, check=False)
|
|
result.update(exit_code=completed.returncode, elapsed_seconds=time.monotonic() - started,
|
|
finished_utc=datetime.now(timezone.utc).isoformat(),
|
|
stdout_sha256=sha(paths['stdout']), stderr_sha256=sha(paths['stderr']),
|
|
script_unchanged=sha(out / 'review.py') == result['script_sha256'],
|
|
frozen_inputs_unchanged=sha(out / 'frozen-inputs.json') == result['frozen_inputs_sha256'])
|
|
with paths['command'].open('x', encoding='utf-8', newline='\n') as f:
|
|
json.dump(result, f, indent=2)
|
|
f.write('\n')
|
|
print(json.dumps(result, indent=2))
|
|
sys.exit(completed.returncode)
|