hyperhive/scripts/check-comment-blocks.sh
iris 3c6c2ed272 ci: add .mjs to check-comment-blocks.sh + check-issue-refs.sh's scope
mara: "add mjs to the lint and fix it in this pr". Both lints scope their
git ls-files scan to a fixed extension list that never included .mjs, so
all three frontend build.mjs files (swarm-ui, dashboard, agent) were
completely invisible to both -- not merely under the limits, outside the
scan entirely.

check-comment-blocks.sh: added '*.mjs' to the ls-files glob and to the
mode_of regex (same slash-comment treatment .js/.ts/.tsx already get --
.mjs is the same comment syntax, argus's exact proposed fix). check-issue-refs.sh:
added '*.mjs' to its glob list, no regex change needed.

Fixing the scope immediately surfaced real, pre-existing violations in
the other two build.mjs files (swarm-ui's own is already handled by this
PR's earlier commits):
- dashboard/build.mjs: 49-line comment block (trimmed to 15 -- redundant
  per-file output-layout table cut, the code below already names every
  output path) plus three bare tracker tags (#448 x2, #453) in the
  stream-worker comment, reworded to prose
- agent/build.mjs: two bare tracker tags (hyperhive#3685 x2), reworded

No logic changes anywhere -- comment-only edits plus the two lint
scripts. Closes #4300 and (independently filed, consolidated into that
one) #4299.
2026-09-12 13:04:01 +02:00

80 lines
3.4 KiB
Shell
Executable file

#!/bin/sh
# CI lint: flags a contiguous comment block longer than MAX lines. A giant
# prose block in source is a signal it should live in docs/ as an
# "implementation notes" section instead — short "why"/invariant/contract
# comments stay, walls of text move out. See the hive convention in #2077.
#
# Emits a CI error annotation per offending block and exits 1 if any block
# exceeds MAX. Runs as its own CI job and IS a required check on the forge
# (branch protection) — a hit blocks merge.
#
# Scope: tracked *.rs *.nix *.sh *.js *.mjs *.ts *.tsx *.css *.html. Markdown is exempt
# (it is prose by nature). Comment forms: `#` line comments (nix/sh), `//`
# line comments (rs/js/ts), and `/* */` block comments (nix/rs/js/ts/css) +
# `<!-- -->` (html). A blank line separates two line-comment blocks (does NOT
# extend a run); a blank inside a `/* */` / `<!-- -->` block stays part of it.
#
# Escape hatch: a `lint:allow-long-comment` marker anywhere in a block
# exempts it (reserve for a genuinely irreducible block; prefer relocating).
set -eu
MAX=30
# Collect annotations into a variable (not via xargs/awk exit codes) so a
# hit in any xargs batch is preserved — mirrors scripts/check-issue-refs.sh.
hits="$(
git ls-files -z '*.rs' '*.nix' '*.sh' '*.js' '*.mjs' '*.ts' '*.tsx' '*.css' '*.html' \
| xargs -0 -r awk -v MAX="$MAX" '
function mode_of(fn) {
if (fn ~ /\.nix$/) return "nix"
if (fn ~ /\.sh$/) return "hash"
if (fn ~ /\.(rs|js|mjs|ts|tsx)$/) return "slash"
if (fn ~ /\.css$/) return "cstyle"
if (fn ~ /\.html$/) return "html"
return ""
}
function flush() {
if (run > MAX && !allow)
printf "::error file=%s,line=%d::comment block of %d lines exceeds the %d-line max — move long prose to docs/ as an implementation-notes section (or mark lint:allow-long-comment)\n", curfile, start, run, MAX
run = 0; allow = 0
}
FNR == 1 { flush(); curfile = FILENAME; mode = mode_of(FILENAME); inblock = 0 }
{
if (mode == "") next
c = 0
if (inblock) {
c = 1
if (index($0, blockend) > 0) inblock = 0
} else if (mode == "hash") {
if ($0 ~ /^[ \t]*#/) c = 1
} else if (mode == "nix") {
# nix: `#` line comments AND `/* */` block comments.
if ($0 ~ /^[ \t]*#/) c = 1
else if ($0 ~ /^[ \t]*\/\*/) { c = 1; if (index($0, "*/") == 0) { inblock = 1; blockend = "*/" } }
} else if (mode == "slash") {
if ($0 ~ /^[ \t]*\/\//) c = 1
else if ($0 ~ /^[ \t]*\/\*/) { c = 1; if (index($0, "*/") == 0) { inblock = 1; blockend = "*/" } }
} else if (mode == "cstyle") {
if ($0 ~ /^[ \t]*\/\*/) { c = 1; if (index($0, "*/") == 0) { inblock = 1; blockend = "*/" } }
} else if (mode == "html") {
if ($0 ~ /^[ \t]*<!--/) { c = 1; if (index($0, "-->") == 0) { inblock = 1; blockend = "-->" } }
}
if (c) {
if (run == 0) start = FNR
run++
if ($0 ~ /lint:allow-long-comment/) allow = 1
} else {
flush()
}
}
END { flush() }
'
)"
if [ -n "$hits" ]; then
printf '%s\n' "$hits"
count="$(printf '%s\n' "$hits" | grep -c '::error' || true)"
printf 'check-comment-blocks: %s comment block(s) over %d lines found\n' "$count" "$MAX" >&2
exit 1
fi
exit 0