Свести чтение файла хуками в один хелпер; молчаливый skip недекодируемого файла #23
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Хвост #17 плюс две находки ревью #21 и #22.
1. Шестая копия одной и той же строки
open(path, encoding="utf-8-sig")+except (OSError, UnicodeDecodeError)живёт вcheck_no_broken_repo_paths.py,check_no_private_imports.py,check_no_private_method_calls.py,check_no_issue_refs_in_comments.py,check_no_session_marks_in_code.py,check_no_broad_except.py,check_no_plan_stage_refs.py. Каждый из них чинился отдельным PR по мере того, как дыру находили —v0.12.0,v0.15.0,v0.17.0,v0.18.0. Седьмой хук напишут с той же ошибкой, если не свести чтение в один хелпер рядом сcomment_scan.Заодно расплетается расхождение стиля: у
no-broad-exceptчтение иast.parseстоят в одномtryсexcept SyntaxErrorпервым, у остальных — в двух.2. Недекодируемый файл пропускается молча
Все хуки на нечитаемом файле возвращают
[]и exit 0 — ни строки в stderr. Файл был в скоупеfiles:потребителя, проверен не был, и никто об этом не узнает. Политике fail-loud, которую репозиторий декларирует у себя же (no-broad-except, шапкаcheck_file_length.sh), это противоречит.Для
no-broad-exceptособенно: у негоtypes: [python], значитUnicodeDecodeErrorозначает буквально «python-файл, который мы не смогли прочитать». Проверено на живых файлах: BOM в середине, исходник в cp1251 с PEP-263 cookie, utf-16 — все три содержатexcept Exceptionи все три дают тихий ноль.Предложение: печатать строку в stderr («файл пропущен: не читается в utf-8») без изменения exit-кода. Это не ломает прогон, но перестаёт быть невидимым.
3.
migrations/versions/…не исключаетсяcheck-file-lengthalembic init migrations— не менее типовая раскладка, чемalembic/, а аргумент #17 был именно про типовые раскладки. Сейчас такие миграции проверяются на длину. Решить, ловить ли по имениversions/с любым родителем (риск переширения) или перечислить известные каталоги.Приёмка
migrations/versions/…решён явно (исключён или сознательно нет — с записью в README)Закрываю: сделано в #24, выпущено тегом
v0.19.0.По пунктам приёмки:
scripts/read_source.py; переведены все восемь читателей. Восьмой (check_model_comments) обнаружился на ревью — он читал голымread_textи падал трейсбеком на не-UTF-8, а на файле с BOM давал ложный FAIL сSyntaxError.migrations/versions/исключён; Django-раскладка<app>/migrations/0001_x.pyи похожее имяschema_migrations/versions/намеренно не исключены — обе границы закреплены негативными кейсами.Важная оговорка, которую стоит знать: pre-commit печатает вывод хука только когда тот упал или у него
verbose: true, поэтому в зелёном прогоне сообщения о пропуске не видно. Проверено наpre-commit 4.6.1. В README это записано, а инстансу с широким скоупом в примере конфига проставленverbose: true. Тем же ограничением давно страдаютWARN-строкиcheck-file-length.Из побочного: в
run_smoke.shпоявилсяcommand_not_found_handle. Дважды за эту работу кейс оказывался вызван выше объявления своего хелпера — bash отдавал 127 и шёл дальше, кейсы молча не исполнялись, а сюита оставалась зелёной. Теперь любая неизвестная команда валит прогон.