Python lint here was a property of the operator's laptop, not of the repo: the global instructions say to run `ruff check`/`ruff format --check`/`pyright`, no workflow or hook ran any of them, and with no committed config ruff fell back to whichever `~/.config/ruff/ruff.toml` the machine happened to have. A second machine lints this repo differently, or not at all — Family E in docs/defect-shapes-773.md, in our own toolchain. Option 1 from the issue: - `ruff.toml` at the root (the operator's global settings, pinned here — that is what the tree was de-facto written against, so adopting it cost a mechanical reformat rather than a rewrite). - The `script-tests` job installs a PINNED `ruff==0.12.11` and runs `ruff check .` + `ruff format --check .` before pytest, so a style red arrives in seconds instead of after the four-minute suite. The pin is the second half of the fix: an unpinned install re-introduces the same divergence one layer up. Renamed the job to `Script lint and tests (ruff + pytest)` so a lint red is not triaged under a name that says pytest. - Tree made clean: 72 errors and 20 files needing reformatting. Everything fixed except two config-level exemptions with reasons in the config (`S101`, `S105` under `scripts/tests/**` — the stub credentials that fire `S105` have no true positive anywhere in the tree) and two per-site `# noqa`s that carry their reason inline. `pyright` stays ungated: its only findings are `reportMissingImports` for `etv_client` in scripts/scripted-schedules/entrypoint.py, resolvable only in that script's deploy environment, and gating it would put a node toolchain on the git-only `small` lane to find nothing. Population is what `ruff check .` discovers from the root, so a new `.py` anywhere is covered without the job enumerating anything. Docs: new record `ci.python-lint-ruff-config-committed`, cross-ref from `ci.script-tests-job`, `docs/ci-cd.md` script-tests section, and `docs/defect-shapes-773.md` §5.2 marked resolved with the measured numbers. Refs: #780 Decisions-Edit: yes
28 lines
1.4 KiB
Python
28 lines
1.4 KiB
Python
"""Keep the test suite out of the PRODUCTION hook-fire log (ersatztv#776).
|
|
|
|
Four suites here drive real hooks as subprocesses — `test_merge_consent_exemption.py`,
|
|
`test_merge_consent_base_change.py`, `test_prepush_rebase_check_tag_exemption.py`,
|
|
`test_pr_changed_files.py` — and they predate the instrumentation. Once every hook records its own
|
|
execution, running `pytest scripts/tests` wrote its synthetic invocations into
|
|
`$HOME/.cache/ersatztv/hook-fire/`: 96 `pretooluse-merge-consent` fires including two `deny`s, and
|
|
12 `blocked` decisions from `prepush-rebase-check`, none of them a real session.
|
|
|
|
That is not untidiness, it is the defect the whole change exists to remove. `scripts/hook-fire-log.sh
|
|
report` is meant to answer "what did the harness actually do", and a log carrying test artifacts
|
|
answers a different question while looking identical — inference reintroduced one layer up. The
|
|
record has no field distinguishing a test invocation from a real one, and adding one would only move
|
|
the problem, so the fix is that tests never write to the real log at all.
|
|
|
|
Autouse and session-independent: a new suite that drives a hook is isolated by existing, without
|
|
having to know this file is here.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def isolate_hook_fire_log(tmp_path_factory, monkeypatch):
|
|
monkeypatch.setenv("ETV_HOOK_FIRE_LOG_DIR", str(tmp_path_factory.mktemp("hook-fire-log")))
|