no-issue-refs-in-comments: разбор комментариев построчный — три класса пропусков и ложняков #11
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?
Найдено на ревью #10 (там же закрыты блокеры; эти четыре пункта merge не держали). Общая причина у первых трёх одна:
extract_commentвscripts/check_no_issue_refs_in_comments.pyразбирает строку изолированно, тогда как соседнийcheck_no_broken_repo_paths.pyуже несёт пофайловую машину состояний.1. Многострочный шаблонный литерал даёт ложное срабатывание
Состояние строкового литерала сбрасывается на каждой строке, поэтому
падает как нарушение. README при этом утверждает, что строковые литералы, включая шаблонные, комментарием не считаются — верно только внутри одной строки.
2. В C-подобном режиме разбирается только первый комментарий строки
Возврат происходит на первом найденном комментарии, поэтому не ловятся:
Для хука, чей смысл в том, что молчаливый проход хуже отсутствия хука, это неприятный класс дыры.
3. Апостроф в JSX-тексте съедает остаток строки
проходит: апостроф открывает «строку», которая до конца строки не закрывается.
.tsx— ровно тот стек, из-за которого заводился #8.4. Обработка строковых литералов не покрыта тестами
Три мутации выживают со всем зелёным: убрать бэктик из
quotes, убрать веткуelif ch in quotesцеликом, убрать обработку экранирования. Существующие фикстуры в эту логику не бьют: в slash-режиме#и так не комментарий, а"https://example.com/x#987"не матчится, потому что#987прижат к букве и падает на lookbehind. Нужна фикстура видаconst s = "see // #456 here";.Как чинить
Не латать построчный разбор по одному случаю, а переиспользовать машину состояний из
check_no_broken_repo_paths.py(:274-321): она переживает несколько комментариев на строке и переоткрытие блока. Сейчас логика дублирована в двух скриптах с разной зрелостью, и расхождение будет расти при каждой правке.Приёмка
no-broken-repo-pathsСмежное, отдельными пунктами
Неизвестные расширения падают в
#-режим, и для разметки это неверно:.vue,.html,.svelte— текст<p>Задача #456</p>флагается. README предупреждает только про.md.Вердикт зависит от неверсионируемых настроек:
git check-ignoreвno-broken-repo-pathsучитывает.git/info/excludeи глобальныйcore.excludesFile. Добавление пути туда переводит хук с fail на pass, не оставляя следа в PR. Направление отказа безопасное (CI строже локали), но свойство стоит либо записать в README рядом с абзацем про.gitignore, либо прибить окружением на время вызова.Асимметрия пробелов в
todo-needs-issue:TODO (#456)принимается,TODO( #456 )— нет. Нигде не описано.Диспозиция после #12 (
main,v0.12.0) — четыре основных пункта закрыты, задача остаётся открытой ради смежных.scripts/comment_scan.py, машина состояний пофайловая, бэктик переживает перевод строки (fixtures/issue_refs/template_literal.ts,block_multiline.ts).c_style_chunksидёт по всей строке и отдаёт все фрагменты (second_comment.ts,block_closes.ts).<p>don't</p>; // ссылка #456больше не глушится на своей строке, но признание апострофа литералом остаётся эвристикой, и это записано в README и в шапкеcomment_scan(полный JS-лексер избыточен).string_literal.py,escaped_quote.ts,regex_*.ts; мутации по кавычкам и экранированию их роняют.comment_scanобщий сno-broken-repo-paths.Остаётся в этой задаче — режим для разметки и стилей:
.vue/.html/.svelte/.cssпадают в#-фолбэк, где<p>Задача #456</p>иcolor: #336699разбираются как комментарий. README на этот счёт предупреждает и ссылается сюда.Два смежных пункта из тела не трогались и по-прежнему актуальны: зависимость вердикта
no-broken-repo-pathsот неверсионируемых.git/info/excludeиcore.excludesFile, и асимметрия пробелов вtodo-needs-issue(TODO (#456)принимается,TODO( #456 )— нет).Закрываю: остаток сделан в #26, выпущено тегом
v0.21.0. Четыре основных пункта закрылись раньше, в #12 (диспозиция — комментарием выше).Режим для разметки и стилей:
.css—/* */;//там не комментарий, а частьurl(//cdn…);.scss/.sass/.less— плюс//, но не внутриurl();.html/.htm/.vue/.svelte/.xml/.svg—<!-- -->, встроенные<script>и<style>отдаются своим сканерам с пересчётом номеров строк,<style lang="scss">получает правила препроцессора.Теперь
color: #336699,#mainи<p>Задача #456</p>не считаются комментариями, и такие расширения можно скоупить — пример конфига обновлён.Выбор режима переехал в общую точку
chunks_for. Уno-broken-repo-pathsона зовётся без#-фолбэка: первая редакция молча подключала ему shell и yaml, переворачивая осознанное решение, зафиксированное в коде комментарием. Стили и разметку хук теперь видит — это записано в README как поведенческое изменение.Ревью поймало дыру, которую стоит назвать отдельно: незакрытый или самозакрытый
<script>растягивал диапазон до конца файла, и все комментарии после него пропадали молча — ровно тот класс отказа, ради которого задача и заводилась. Теперь такой блок не сканируется, но и не глушит разбор дальше. Плюсmarkup_chunksперестал быть квадратичным: 126 КБ с 4000 блоков — 12.7 с → 0.19 с.Смежные пункты из тела задачи вынесены в #27: зависимость вердикта
no-broken-repo-pathsот неверсионируемых.git/info/excludeиcore.excludesFile, и асимметрия пробелов вtodo-needs-issue.Остаточное ограничение, записанное в README:
.sql,.yamlи прочие неопознанные расширения по-прежнему идут построчным#-режимом — там код попадает под правило, и скоупить их не следует.