Вердикт no-broken-repo-paths зависит от неверсионируемых настроек git; асимметрия пробелов в todo-needs-issue #27
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?
Два смежных пункта из тела #11, которые не входили в основную часть задачи (там был режим комментариев для разметки и стилей — сделан в #26). Оба про другие хуки.
1.
no-broken-repo-paths: вердикт зависит от того, чего нет в репозиторииХук резолвит пути через
git check-ignore, а тот учитывает.git/info/excludeи глобальныйcore.excludesFile. Значит добавление пути туда переводит хук с FAIL на pass не оставляя следа в MR: у разработчика зелено, в CI красно (или наоборот), и разница не видна ни в диффе, ни в конфиге.Направление отказа безопасное — CI строже локальной машины, — но свойство неочевидное. Два варианта:
.gitignore(дёшево, но проблему не убирает);GIT_CONFIG_GLOBAL=/dev/nullи явный отказ от.git/info/exclude, чтобы вердикт зависел только от версионируемого состояния.Второй честнее: гейт, который у двух людей отвечает по-разному на один и тот же коммит, — это не гейт.
2.
todo-needs-issue:TODO (#456)принимается,TODO( #456 )— нетRegex
TODO\b(?!\s*\(#\d+(?:\s*,\s*#\d+)*\))допускает пробелы перед скобкой и вокруг запятой, но не сразу после открывающей скобки и не перед закрывающей. Асимметрия нигде не описана: разработчик, поставивший пробел внутри скобок, получает FAIL на формате, который выглядит легальным.Решить, что именно правильно, и привести regex с документацией в соответствие: либо разрешить пробелы внутри скобок, либо запретить их и перед скобкой тоже — чтобы правило было «формат ровно такой», а не «такой, но местами можно».
Приёмка
no-broken-repo-pathsне зависит от.git/info/excludeиcore.excludesFile— либо это явно записано в README как известное свойствоTODO(...)трактуются одинаково со всех сторон; README и описание хука говорят то же, что делает regexЗакрываю: сделано в #30, выпущено тегом
v0.23.0.1. Вердикт
no-broken-repo-pathsбольше не зависит от личных настроек git. Ручка гасится черезgit -c core.excludesFile=/dev/null— это перебивает все уровни конфига, включая локальный.git/config(о нём в задаче речи не было, но он ровно так же неверсионируем). Заодноgit diffзовётся с--no-ext-diff: настроенныйdiff.externalподменял вывод целиком, разбор hunk'ов не находил изменённых строк, и pre-push-сужение скоупа отдавало зелёный вхолостую.Первая редакция сносила глобальный и системный конфиг целиком — ревью показало, что это забрало бы с собой
safe.directory, и в контейнере с UID-mismatch любой вызов git отвечал бы 128; хук трактует ненулевой код как «путь не игнорируется», то есть я обменял бы одну недетерминированность на волну ложных FAIL'ов. Узкий-cэтого не делает..git/info/excludeостаётся — git читает его всегда, отключить нельзя. Записано в README как известное свойство: файл локален для клона и, в отличие от настроек пользователя, никуда не приезжает.2. Пробелы в
TODO(...)трактуются одинаково со всех сторон.TODO (#456),TODO( #456 ),TODO(#12, #34)равноправны. Граница названа и закреплена кейсом: пробел внутри ссылки (TODO( # 456 )) её не образует —# 456не ссылка. Паттерн синхронизирован в обоих местах, README и описания хуков в манифесте говорят одно и то же; заодно из примера конфига убран форматTODO(arg, #42, ...), который regex отвергает сv0.11.0— тот самый случай «документация обещает то, что правило не принимает», с которого задача и начиналась.Кейсы: оба уровня конфига, внешний diff, обе формы пробелов. Мутации, каждая роняет smoke: убрать
-c, убратьcore.excludesFile, убрать--no-ext-diff, вернуть запрет пробелов, разрешить пробел внутри ссылки.