гейт судит staged-файлы; рендер диаграмм пошёл параллельно
Гейт проверял рабочее дерево целиком — то есть не то, что уедет в историю, а
то, что лежит на диске рядом. Плюс платил за это временем: пятнадцать секунд на
каждый коммит с правкой markdown, потому что одиннадцать блоков рендерились по
очереди, каждый своим запуском mermaid-cli со своим chromium.
diagrams.py научился двум вещам. Первая — принимать файлы списком: без
аргументов обходит репозиторий как раньше, с аргументами смотрит только
названные, отбирая из них markdown внутри корня (гейт передаёт весь staged, где
есть и скрипты, и удалённое). Вторая — рендерить пулом потоков: работа целиком в
ожидании подпроцесса, своего интерпретатора ей не надо, а потолок в восемь
воркеров упирается в память chromium, а не в двадцать четыре ядра. Порядок
находок берётся из порядка сбора, не из порядка ответов, так что вывод
детерминирован. Весь репозиторий — 3 секунды вместо 15, один файл — 1.
В хуке теперь {staged_files} у диаграмм, ruff и pyrefly. Два исключения
остались, и оба по существу: copies.py сверяет копию с домом, а дом лежит в
другом файле, которого в индексе может не быть — список staged дал бы «копии
дословны» ровно там, где правка дома их и разошлась; frontmatter.py обходит всё
за сотые доли секунды, экономить нечего. Оба объяснены прямо у своих задач.
ruff встал с --fix и stage_fixed: безопасное чинится само и доносится до этого
же коммита. Иначе исправленный файл оставался бы в рабочем дереве, а в историю
уезжал бы невычищенный — гейт зелёный, коммит грязный.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+20
-15
@@ -7,9 +7,10 @@
|
||||
# без которого tasks.py и docs.py перестают работать в чужом проекте.
|
||||
# Всё остальное (проза, устройство, язык) — предмет ревью, а не хука.
|
||||
#
|
||||
# Скрипты читают **рабочее дерево целиком**, а не индекс: частичный коммит при
|
||||
# грязном дереве судится по тому, что на диске. Это осознанно — они и написаны
|
||||
# как обход репозитория, а не как фильтр по файлам.
|
||||
# **Что судится — staged-файлы, а не рабочее дерево**, всюду, где проверка
|
||||
# умеет смотреть поимённо: гейт обязан судить то, что уедет в историю, а не то,
|
||||
# что случайно лежит на диске рядом. Два исключения названы у своих задач, и оба
|
||||
# — про то, что проверке нужен весь репозиторий по существу, а не для удобства.
|
||||
#
|
||||
# Ставится `lefthook install` (см. README, «Гейт коммита»). Обойти разово —
|
||||
# `LEFTHOOK=0 git commit …`; обход законен ровно для того случая, когда чинить
|
||||
@@ -18,6 +19,11 @@
|
||||
pre-commit:
|
||||
parallel: true
|
||||
jobs:
|
||||
# Обе проверки документов идут по всему репозиторию, и это не недосмотр.
|
||||
# copies.py сверяет копию с домом, а дом лежит в другом файле, которого в
|
||||
# индексе может не быть: список staged дал бы «копии дословны» там, где
|
||||
# правка дома их и разошлась. frontmatter.py смотрел бы поимённо, но весь
|
||||
# обход стоит сотые доли секунды — платить за него нечем.
|
||||
- name: фронтматтеры
|
||||
glob: "*.md"
|
||||
run: python3 scripts/frontmatter.py
|
||||
@@ -26,23 +32,22 @@ pre-commit:
|
||||
glob: "*.md"
|
||||
run: python3 scripts/copies.py
|
||||
|
||||
# Секунды, а не миллисекунды: рендер идёт настоящим mermaid-cli. Поэтому
|
||||
# glob — правка одних только скриптов проходит гейт мгновенно. Нет ни
|
||||
# `mmdc`, ни `npx` — код 3, коммит отказан: «не проверено» здесь не то же
|
||||
# самое, что «проверено и сошлось».
|
||||
# Самая дорогая проверка: каждый блок — свой запуск mermaid-cli со своим
|
||||
# chromium. Отсюда и staged-файлы вместо обхода, и параллель внутри самого
|
||||
# скрипта: репозиторий целиком — 3 секунды, один файл — одна.
|
||||
- name: диаграммы
|
||||
glob: "*.md"
|
||||
run: python3 scripts/diagrams.py
|
||||
run: python3 scripts/diagrams.py {staged_files}
|
||||
|
||||
# Скрипты — под своим glob и через uv: версии линтеров прибиты точно, и
|
||||
# `uv run` берёт именно их, а не то, что оказалось в PATH. Обе проверки
|
||||
# укладываются в доли секунды на весь репозиторий, поэтому проверяется он
|
||||
# целиком, а не изменённые файлы: находка в чужом файле здесь означает, что
|
||||
# правка сломала соседа.
|
||||
# Линтеры — через uv: версии прибиты точно, и `uv run` берёт именно их, а не
|
||||
# то, что оказалось в PATH. `--fix` чинит безопасное сам, `stage_fixed`
|
||||
# доносит починку до этого же коммита — иначе она осталась бы в рабочем
|
||||
# дереве, а в историю уехал бы невычищенный файл.
|
||||
- name: ruff
|
||||
glob: "*.py"
|
||||
run: uv run ruff check .
|
||||
stage_fixed: true
|
||||
run: uv run ruff check --fix {staged_files}
|
||||
|
||||
- name: pyrefly
|
||||
glob: "*.py"
|
||||
run: uv run pyrefly check
|
||||
run: uv run pyrefly check {staged_files}
|
||||
|
||||
Reference in New Issue
Block a user