81 lines
3.5 KiB
Python
81 lines
3.5 KiB
Python
"""Verify frozen gate receipts and source ZIP; never infer a native/full-suite pass."""
|
|
import datetime
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import re
|
|
import sys
|
|
import zipfile
|
|
|
|
base = Path(__file__).resolve().parent
|
|
root = base.parents[1]
|
|
inputs, focused, clippy = sys.argv[1:]
|
|
assert re.fullmatch(r"inputs[0-9]+", inputs)
|
|
assert re.fullmatch(r"focused[0-9]+", focused)
|
|
assert re.fullmatch(r"clippy[0-9]+", clippy)
|
|
|
|
|
|
def read(name):
|
|
return json.loads((base / name).read_text(encoding="utf-8-sig"))
|
|
|
|
|
|
def sha(raw):
|
|
return hashlib.sha256(raw).hexdigest()
|
|
|
|
|
|
manifest = read(inputs + ".json")
|
|
readback = read(inputs + "-readback.json")
|
|
assert readback["passed"] and not any(readback[k] for k in ("changed", "added", "removed"))
|
|
archive = base / (inputs + ".zip")
|
|
assert sha(archive.read_bytes()) == manifest["archiveSha256"]
|
|
expected = {item["path"]: item for item in manifest["files"]}
|
|
with zipfile.ZipFile(archive) as bundle:
|
|
assert len(bundle.infolist()) == len(expected)
|
|
assert set(bundle.namelist()) == set(expected)
|
|
for path, item in expected.items():
|
|
raw = bundle.read(path)
|
|
assert len(raw) == item["bytes"] and sha(raw) == item["sha256"], path
|
|
assert (root / path).read_bytes() == raw, path
|
|
|
|
gates = {name: read(name + "-status.json") for name in (focused, clippy)}
|
|
assert all(gate["exitCode"] == 0 for gate in gates.values())
|
|
log = (base / (focused + ".log")).read_text(encoding="utf-8-sig")
|
|
match = re.search(r"test result: ok\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out; finished in ([0-9.]+)s", log)
|
|
assert match, "No executed successful Rust test summary"
|
|
counts = dict(zip(("passed", "failed", "ignored", "measured", "filtered"), map(int, match.groups()[:5])))
|
|
assert counts["failed"] == 0
|
|
required = [
|
|
"closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice",
|
|
"find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection",
|
|
"old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent",
|
|
"find_close_releases_removed_input_and_guarded_focus_respects_later_input",
|
|
"source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds",
|
|
"source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh",
|
|
"source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit",
|
|
]
|
|
for name in required:
|
|
assert re.search(r"test [^\r\n]*::" + re.escape(name) + r" \.\.\. ok", log), name
|
|
|
|
owned = ["crates/oa-desktop/src/" + path for path in (
|
|
"views.rs", "app.rs", "app/source_symbols.rs", "app/source_symbols/tests.rs"
|
|
)]
|
|
result = {
|
|
"atUtc": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
"scope": "Focused Windows desktop tests and strict all-target Clippy only; no corrected GUI, native OS payload, full desktop suite, Linux, or release acceptance.",
|
|
"sourceHead": manifest["head"],
|
|
"uncommittedOwnedInputs": [expected[path] for path in owned],
|
|
"inputs": inputs,
|
|
"inputFiles": len(expected),
|
|
"inputBytes": sum(item["bytes"] for item in expected.values()),
|
|
"archiveSha256": manifest["archiveSha256"],
|
|
"sourceZipAndCurrentBytesMatch": True,
|
|
"gates": gates,
|
|
"tests": counts,
|
|
"testExecutionSeconds": float(match.group(6)),
|
|
"requiredRegressionTestsPassed": required,
|
|
}
|
|
with (base / "final-gate-result.json").open("x", encoding="utf-8", newline="\n") as stream:
|
|
json.dump(result, stream, indent=2, ensure_ascii=False)
|
|
stream.write("\n")
|
|
print(json.dumps(result, ensure_ascii=False, indent=2))
|