111 lines
8.6 KiB
Python
111 lines
8.6 KiB
Python
"""Static text adaptation only; never imports or runs the prepared adapters."""
|
|
from pathlib import Path
|
|
import ast
|
|
import hashlib
|
|
import json
|
|
|
|
BASE = Path(__file__).resolve().parent
|
|
ROOT = BASE.parents[1]
|
|
OLD = ROOT / '.local/navigation-prerelease-20260911'
|
|
def sha(p):
|
|
return hashlib.sha256(p.read_bytes()).hexdigest()
|
|
old_inventory = {p.name: sha(p) for p in OLD.iterdir() if p.is_file()}
|
|
native = (ROOT / '.local/text-repair-save-native-20260911/helper.py').read_text(encoding='utf-8')
|
|
commands = native[native.index('COMMANDS = {'):native.index('\n\n\ndef now')]
|
|
p = (OLD / 'prepare.py').read_text(encoding='utf-8')
|
|
p = p.replace('import traceback', 'import traceback\nimport sys\nimport tomllib')
|
|
p = p.replace("COMMIT = 'eeeaa1262748800c4c9aaa1eca79a7de96757358'", "COMMIT = '33c6d83e9ba9a5b1310b1b627d7c40affcbcf15c'")
|
|
p = p.replace("BRANCH = 'codex/navigation-prerelease-source-20260911'", "BRANCH = 'codex/navigation-repair-prerelease-source-20260911'")
|
|
p = p.replace("GATES = ROOT / '.local/text-navigation-native-fixes-20260911'\nDESKTOP = ROOT / '.local/text-navigation-desktop-20260911'", "GATES = ROOT / '.local/text-repair-save-20260911'")
|
|
p = p.replace('72c2e8154f9945aa87d0cbf9cc148934a84614e15576673496aa5a5907c12154', '75a282fd3d4cb2dec6763046ea45d0caa015b998281fbdd6f222d8e3a175b13f')
|
|
p = p.replace('7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798', '213fdb39ea7c3601b4baac674c3ab3ecc863ac44db1b092d922d3e24f26887b7')
|
|
p = p.replace('\n\n\ndef now', '\n\n' + commands + '\n\n\ndef now', 1)
|
|
p = p.replace('inputs4', 'inputs1')
|
|
a = p.index(" gate_path = GATES / 'final-gate-result.json'")
|
|
b = p.index(" server = ROOT /", a)
|
|
p = p[:a] + ''' assert len(expected) == 500
|
|
complete = load(GATES / 'complete.json')
|
|
assert complete['archiveSha256'] == ZIP_SHA and complete['inputsUnchanged'] is True
|
|
assert complete['gates'] == list(COMMANDS) and complete['sourceHead'] == manifest['head']
|
|
# The gates captured eeeaa126 plus the repair delta; COMMIT commits those
|
|
# exact raw inputs. Never relabel the captured sourceHead as a clean build.
|
|
assert manifest['head'] == 'eeeaa1262748800c4c9aaa1eca79a7de96757358'
|
|
for name, command in COMMANDS.items():
|
|
receipt = load(GATES / (name + '-result.json'))
|
|
assert receipt['exitCode'] == 0 and receipt['inputsUnchanged'] is True and receipt['command'] == command
|
|
assert sha(GATES / (name + '-stdout.log')) == receipt['stdoutSha256']
|
|
assert sha(GATES / (name + '-stderr.log')) == receipt['stderrSha256']
|
|
build = load(GATES / 'gui-build-result.json')['binary']
|
|
artifact = build['artifact']
|
|
assert artifact['target']['name'] == 'arcadia-studio' and artifact['profile']['test'] is False
|
|
assert artifact['profile']['opt_level'] == '0' and artifact['profile']['debug_assertions'] is True
|
|
assert Path(artifact['executable']).resolve() == Path(build['path']).resolve()
|
|
assert Path(build['path']).resolve().is_relative_to(ROOT / '.local/target-gnullvm')
|
|
gui = GATES / 'gui-repair.exe'
|
|
assert sha(gui) == build['sha256'] == 'b183ef31f16b3986538b3f2aba8435eab45978635c47f99ca01be6e72b168848'
|
|
assert gui.stat().st_size == build['bytes'] == 113206272
|
|
summaries = re.findall(r'test result: ok\\. (\\d+) passed; (\\d+) failed; (\\d+) ignored; (\\d+) measured; (\\d+) filtered out;',
|
|
(GATES / 'desktop-tests-stdout.log').read_text(encoding='utf-8'))
|
|
assert summaries == [('755', '0', '1', '0', '0')]
|
|
counts = dict(zip(('passed', 'failed', 'ignored', 'measured', 'filtered'), map(int, summaries[0])))
|
|
''' + p[b:]
|
|
p = p.replace(" manifest, frozen, build, gui, counts, server, dll, old = admission()", """ # Later root commits may record evidence only. Do not silently package later
|
|
# production/docs/dependency or instruction changes under the tested source.
|
|
git(ROOT, 'merge-base', '--is-ancestor', COMMIT, before['head'])
|
|
later = git(ROOT, 'diff', '--name-only', '-z', COMMIT, before['head']).decode().split('\\0')[:-1]
|
|
assert all(p.startswith('harness/') and not p.startswith('harness/fixtures/') for p in later), later
|
|
manifest, frozen, build, gui, counts, server, dll, old = admission()
|
|
for path, raw in frozen.items():
|
|
assert ordinary(ROOT / path).read_bytes() == raw, f'Current frozen input changed: {path}'""")
|
|
p = p.replace(" # Local clone has its own index/refs", """ registry = {(x['name'], x['version'], x['source']): x['registry_checksum']
|
|
for x in notice['packages'] if x['source']}
|
|
locked = {(x['name'], x['version'], x.get('source')): x.get('checksum')
|
|
for x in tomllib.loads(frozen['Cargo.lock'].decode())['package']}
|
|
assert registry and all(locked.get(k) == v for k, v in registry.items()), 'Historical registry coverage differs.'
|
|
# Local clone has its own index/refs""")
|
|
p = p.replace(" frozen[p] = (ROOT / p).read_bytes()", " if p in frozen:\n assert frozen[p] == (ROOT / p).read_bytes(), p\n frozen[p] = (ROOT / p).read_bytes()")
|
|
a = p.index(' provenance.update({')
|
|
b = p.index(" (BASE / 'evidence').mkdir()",a)
|
|
p = p[:a] + ''' provenance.update({'gui-inputs1.json': GATES / 'inputs1.json', 'gui-complete.json': GATES / 'complete.json',
|
|
'gui-gate-run.py': GATES / 'run.py'})
|
|
for name in COMMANDS:
|
|
for suffix in ('-result.json', '-stdout.log', '-stderr.log'):
|
|
provenance['gui-' + name + suffix] = GATES / (name + suffix)
|
|
''' + p[b:]
|
|
p = p.replace("'build': 'evidence/gui-build-v3.json', 'preserved': 'evidence/gui-v3-preserved.json', 'inputs': 'evidence/gui-inputs1.json', 'full_gate': 'evidence/gui-full-corrected.json'", "'build': 'evidence/gui-gui-build-result.json', 'inputs': 'evidence/gui-inputs1.json', 'full_gate': 'evidence/gui-desktop-tests-result.json', 'complete': 'evidence/gui-complete.json', 'captured_head': manifest['head'], 'scope': 'Built from captured eeeaa126 plus exact repair input delta; those bytes are committed at base_commit, then reconstructed without changing code.'")
|
|
p = p.replace("'branch': BRANCH, 'source_repository': str(SOURCE)", "'branch': BRANCH, 'record_only_root_paths_after_base': later, 'historical_registry_count': len(registry), 'source_repository': str(SOURCE)")
|
|
p = p.replace("if __name__ == '__main__':\n", "if __name__ == '__main__':\n sys.stdout.reconfigure(encoding='utf-8')\n sys.stderr.reconfigure(encoding='utf-8')\n")
|
|
(BASE / 'prepare.py').write_text(p, encoding='utf-8', newline='\n')
|
|
ps = (OLD / 'package2.ps1').read_text(encoding='utf-8').replace('eeeaa1262748800c4c9aaa1eca79a7de96757358', '33c6d83e9ba9a5b1310b1b627d7c40affcbcf15c')
|
|
(BASE / 'package2.ps1').write_text(ps, encoding='utf-8', newline='\n')
|
|
r = (OLD / 'readback.py').read_text(encoding='utf-8').replace('import stat', 'import stat\nimport sys')
|
|
r = r.replace('relative, historical_inputs', 'relative, historical_inputs, HISTORY')
|
|
r = r.replace(" docs = load(stage / 'documentation-check.json')", """ previous = load(HISTORY / 'prior-dependency-notices.json')
|
|
def registry_key(item):
|
|
return item['name'], item['version'], item['source'], item['registry_checksum']
|
|
collected = {registry_key(x): x for x in notices['packages'] if x['source']}
|
|
covered = 0
|
|
for old in previous['packages']:
|
|
if not old['source']:
|
|
continue
|
|
current = collected[registry_key(old)]
|
|
assert old['license'] == current['license']
|
|
assert set(old['features']).issubset(current['features'])
|
|
# Exact recorded notice files must remain in the actual ZIP. Current
|
|
# metadata does not substitute for the historical server's provenance.
|
|
new_notices = {(n['path'], n['sha256']) for n in current['notices']}
|
|
for item in old['notices']:
|
|
assert (item['path'], item['sha256']) in new_notices
|
|
assert actual[item['path']]['sha256'] == item['sha256']
|
|
assert old['embedded_fonts'] == current['embedded_fonts']
|
|
covered += 1
|
|
assert covered == preparation['historical_registry_count']
|
|
docs = load(stage / 'documentation-check.json')""")
|
|
r = r.replace("'notice_roots': notices['root_packages']", "'historical_registry_packages_covered': covered, 'notice_roots': notices['root_packages']")
|
|
r = r.replace("if __name__ == '__main__':\n", "if __name__ == '__main__':\n sys.stdout.reconfigure(encoding='utf-8')\n sys.stderr.reconfigure(encoding='utf-8')\n")
|
|
(BASE / 'readback.py').write_text(r, encoding='utf-8', newline='\n')
|
|
for name in ('prepare.py', 'readback.py'):
|
|
ast.parse((BASE / name).read_text(encoding='utf-8'), filename=name)
|
|
assert old_inventory == {p.name: sha(p) for p in OLD.iterdir() if p.is_file()}
|
|
print(json.dumps({'static_ast': 'PASS', 'old_adapter_files_unchanged': len(old_inventory)}))
|