diff --git a/tools/build/lib/acceptance.sh b/tools/build/lib/acceptance.sh index 9cfb43f..c61b76b 100644 --- a/tools/build/lib/acceptance.sh +++ b/tools/build/lib/acceptance.sh @@ -13,13 +13,20 @@ set -euo pipefail # удалённые маршруты, чтобы доказать их отсутствие. Помощник существует, чтобы # третьего раза не было. # -# Отбрасываются оба вида строк-комментариев: `//` для Go и TypeScript, `#` для -# shell. Раньше стриплось только `//`, поэтому сканы по tools/build/*.sh не -# работали вовсе — там комментарии начинаются с решётки, и объяснение «почему -# этого больше нет» считалось за код. Ни один из языков не использует префикс -# другого для чего-то иного, так что общий фильтр безопасен для обоих. +# Вид комментария выбирается по расширению файла. +# +# Раньше отбрасывались только строки, начинающиеся с `//`, поэтому сканы по +# tools/build/*.sh не работали вовсе: там комментарии начинаются с решётки, и +# объяснение «почему этого больше нет» считалось за код. +# +# Решётка при этом отбрасывается ТОЛЬКО в shell. В шаблоне Vue строка вполне +# может начинаться с `#default="scope"` — это сокращение для v-slot, а не +# комментарий, и общий фильтр молча выбрасывал бы её из скана. code_without_comments() { - grep -vE '^[[:space:]]*(//|#)' "$1" 2>/dev/null || true + case "$1" in + *.sh) grep -vE '^[[:space:]]*#' "$1" 2>/dev/null || true ;; + *) grep -v '^[[:space:]]*//' "$1" 2>/dev/null || true ;; + esac } # code_mentions_in отдаёт список файлов, где подстрока встречается В КОДЕ. @@ -638,11 +645,26 @@ run_dependency_hygiene_acceptance() { # Противоречие закрыто в пользу строгой политики, и теперь это проверяется, а # не только описано. Ищется КОД: комментарий выше объясняет, почему обходов # нет, и обязан называть их по имени. - local bypass_var bypass_hits + # + # Сканируются модули, которые могли бы обход вернуть, а НЕ весь tools/build. + # Причина ровно та, из-за которой в этом файле дважды падала сборка на + # корректном коде: скан по всему каталогу находил сам себя — строку + # `for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN` ниже. + # Это код, а не комментарий, поэтому code_without_comments тут не спасает. + local bypass_var bypass_scan_file bypass_hits for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN; do - bypass_hits="$(code_mentions_in "$bypass_var" tools/build)" - [ -z "$bypass_hits" ] \ - || fail "acceptance: обход проверки зависимостей $bypass_var вернулся в: $bypass_hits" + for bypass_scan_file in \ + tools/build/build.sh \ + tools/build/lib/security.sh \ + tools/build/lib/package.sh \ + tools/build/lib/versions.sh \ + tools/build/lib/deps.sh \ + tools/build/lib/verify.sh + do + bypass_hits="$(code_without_comments "$bypass_scan_file" | grep -F -- "$bypass_var" || true)" + [ -z "$bypass_hits" ] \ + || fail "acceptance: обход проверки зависимостей $bypass_var вернулся в $bypass_scan_file: $bypass_hits" + done done # И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем