Files
EscapistsReintroduced/docs/evidence/extraction-anywhere-2026-10-28/isolated-runner.py
T
2026-10-28 15:19:50 +01:00

44 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""Frozen local Workbench extraction-anywhere fixture; no live server or installed asset writes."""
from pathlib import Path
import hashlib,json,shutil,subprocess,sys
ROOT=Path(__file__).resolve().parents[3]
sys.path.insert(0,str(ROOT/'tools'))
from source_manifest import addon_manifest
from headless_game import assert_prefix_idle
name=sys.argv[1]
if not name.isalnum(): raise ValueError('Use an alphanumeric run suffix')
source=Path('/tmp/erri-extraction-anywhere-source-'+name)
profile=Path('/tmp/erri-extraction-anywhere-run-'+name)
compat=ROOT/'.local/playtest-compat-20260920'
assert_prefix_idle(compat)
source.mkdir();profile.mkdir()
for rel in addon_manifest(ROOT):
target=source/rel;target.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(ROOT/rel,target)
shutil.copytree(ROOT/'tools',source/'tools',ignore=shutil.ignore_patterns('__pycache__'))
(source/'docs').mkdir();shutil.copy2(ROOT/'docs/external-addons.json',source/'docs/external-addons.json')
fixture=Path(__file__).with_name('native-fixture.c')
shutil.copy2(fixture,source/'addons/core/Scripts/Game/ERR/00_Core/ERR_ZExtractionAnywhereFixture.c')
# Opt-in fixture is independent of the historical generic Core smoke.
p=source/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c'
p.write_text(p.read_text().replace('array<string> independentFixtures = {','array<string> independentFixtures = {"anywhere-extraction", '))
p=source/'tools/headless_workbench.py'
p.write_text(p.read_text().replace("choices=['coordinated-ai',", "choices=['anywhere-extraction', 'coordinated-ai',").replace("a.smoke not in {'coordinated-ai',", "a.smoke not in {'anywhere-extraction', 'coordinated-ai',"))
# Keep the production scenario definitions and random placement for this opt-in fixture.
p=source/'addons/core/Scripts/Game/ERR/00_Core/ERR_ScenarioComponent.c'
s=p.read_text().replace('historicalFixture != "normal-escape-route"', 'historicalFixture != "anywhere-extraction"').replace('fixture != "normal-escape-route"', 'fixture != "anywhere-extraction"')
p.write_text(s)
if '--terrain' in sys.argv:
p=source/'tools/headless_workbench.py'
p.write_text(p.read_text().replace("'-noThrow',", "'-errExtractionTerrain', '1', '-noThrow',"))
installed=Path.home()/'.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons'
(profile/'profile').mkdir()
(profile/'profile/EscapistsFactions.json').write_text(json.dumps({'escapists':'ussr','enemy':'us','independent':'fia'})+'\n')
(profiles:=profile/'fixture-inputs.json').write_text(json.dumps({'fixture_sha256':hashlib.sha256(fixture.read_bytes()).hexdigest(),'production_sources':addon_manifest(ROOT),'source':str(source),'profile':str(profile)},indent=2)+'\n')
command=[sys.executable,str(source/'tools/headless_workbench.py'),'--compat',str(compat),'--profile',str(profile),'--external-addons',str(installed),'--project','core','--smoke','anywhere-extraction','--rounds','1','--timeout','300']
with (profile/'runner-output.log').open('w') as output:
result=subprocess.run(command,stdout=output,stderr=subprocess.STDOUT)
print(json.dumps({'exit':result.returncode,'source':str(source),'profile':str(profile)}))
print('\n'.join((profile/'runner-output.log').read_text().splitlines()[-45:]))
raise SystemExit(result.returncode)