Гейт ищет гонки, переписанные шаги схемы и девять новых классов дефектов
- включены noctx, contextcheck и bodyclose (отмена доходит до внешнего вызова, контекст приезжает сверху, тело ответа закрывается), nilerr, rowserrcheck и sqlclosecheck (отказ не теряется молча), testifylint и nolintlint (форма утверждения и форма подавления), плюс errcheck check-type-assertions: непроверенное приведение типа паникует, и check-blank его не видит - заведён шаг tests: go test -race, потому что «результат пишет только держатель захвата» — утверждение об одновременности. Без компилятора C шаг гоняет тесты без детектора и краснеет кодом 3 после них: гонки не повод отнимать у гейта сами тесты - заведён шаг migrations: у файла шага схемы допустим один статус — A. Баз диффа две, BASE и HEAD: первая отвечает на «уже уехал» настолько, насколько свежа origin/master, вторая ловит правку закоммиченного шага независимо от неё. Каталог берётся из docs/.docs.json, пустой каталог роняет шаг - единственное подавление — noctx на httptest.NewRequest в проверках: за фикстурой запроса внешнего собеседника нет. Граница проверена мутацией — http.Get и exec.Command из проверки правилу по-прежнему подсудны
This commit is contained in:
@@ -20,6 +20,34 @@ linters:
|
||||
# Запреты по месту: чем судят ответ в проверках, чем читают время, откуда
|
||||
# берут конфигурацию, куда пишут вывод. Подробности у каждого правила ниже.
|
||||
- forbidigo
|
||||
# Отмена доходит до внешнего вызова: запрос и внешний процесс заводятся с
|
||||
# контекстом. Инвариант «принятая запись не теряется молча» держится
|
||||
# остановкой на середине, а не только записью в лог: `ffmpeg`, заведённый
|
||||
# без контекста, переживает остановку воркера и дожёвывает чужую запись.
|
||||
- noctx
|
||||
# Контекст приезжает сверху, а не заводится по месту. `context.Background()`
|
||||
# внутри адаптера обрывает цепочку отмены ровно на границе с платным
|
||||
# внешним сервисом — там, где отмена и нужна.
|
||||
- contextcheck
|
||||
# Тело ответа закрывается. `errcheck` его не видит: `(io.ReadCloser).Close`
|
||||
# объявлен в `exclude-functions` ниже, и незакрытое тело от невыясненного
|
||||
# `Close` этим списком не отличается.
|
||||
- bodyclose
|
||||
# `return nil` после проверенной ошибки — это молчаливая потеря отказа,
|
||||
# прямо запрещённая инвариантом об очереди (CLAUDE.md, major).
|
||||
- nilerr
|
||||
# Отказ выборки не теряется: неспрошенный `rows.Err()` превращает оборванное
|
||||
# чтение в пустой результат.
|
||||
- rowserrcheck
|
||||
# `Rows` и `Stmt` закрываются: незакрытая выборка держит соединение.
|
||||
- sqlclosecheck
|
||||
# Форма утверждений в проверках: перепутанные местами «ожидалось/получено»,
|
||||
# `assert` там, где после провала продолжать нельзя, `require` из горутины.
|
||||
- testifylint
|
||||
# Подавление — это решение: строчное `//nolint` обязано называть линтер и
|
||||
# причину, а протухшее подавление обязано краснеть. Тот же порядок, что у
|
||||
# подавлений в этом файле, но применённый к комментариям в коде.
|
||||
- nolintlint
|
||||
settings:
|
||||
forbidigo:
|
||||
# `analyze-types` включает суждение по типу приёмника, а не по печатному
|
||||
@@ -101,11 +129,24 @@ linters:
|
||||
- pkg: github.com/cockroachdb/errors
|
||||
desc: 'стек-трейс избыточен, контекст несёт цепочка %w (docs/conventions/errors.md)'
|
||||
|
||||
nolintlint:
|
||||
# Подавление без причины снимают при первом же неудобстве: снимающий не
|
||||
# знает, что оно ловило. Те же два требования, что у подавлений в этом
|
||||
# файле, — имя линтера и причина строкой.
|
||||
require-explanation: true
|
||||
require-specific: true
|
||||
# Подавление, которому нечего подавлять, — след починенного места, и
|
||||
# краснеть оно обязано: иначе перечень подавлений врёт.
|
||||
allow-unused: false
|
||||
|
||||
errcheck:
|
||||
# Без этого `_ = x.Close()` снимает замечание, и критерий «отказ не
|
||||
# теряется молча» принимается реализацией, которая его теряет. Отказ,
|
||||
# который решено не проверять, теперь объявляют ниже поимённо — заметно.
|
||||
check-blank: true
|
||||
# Непроверенное приведение типа паникует, а не отдаёт ошибку, поэтому
|
||||
# `check-blank` его не ловит: `v := x.(T)` вовсе не про присваивание в `_`.
|
||||
check-type-assertions: true
|
||||
exclude-functions:
|
||||
# Закрытие через defer и лучшая-попытка уборки файла — осознанно без проверки
|
||||
- (io.Closer).Close
|
||||
@@ -145,6 +186,16 @@ linters:
|
||||
- forbidigo
|
||||
path: '_test\.go$'
|
||||
text: 'time.Now'
|
||||
# `httptest.NewRequest` строит фикстуру для обработчика в том же процессе:
|
||||
# внешнего собеседника за ней нет, и отменять у неё нечего — правило здесь
|
||||
# говорит не о том, что мы имели в виду. Изъятие названо по имени этой
|
||||
# функции, а не выключением `noctx` на проверках целиком: настоящий внешний
|
||||
# вызов из проверки — `http.Get`, `exec.Command` — правилу по-прежнему
|
||||
# подсуден.
|
||||
- linters:
|
||||
- noctx
|
||||
path: '_test\.go$'
|
||||
text: 'httptest\.NewRequest'
|
||||
|
||||
formatters:
|
||||
enable:
|
||||
|
||||
Reference in New Issue
Block a user