The tracker-tag lint's trailing class `[^0-9a-fA-F]` treated a non-hex letter as a valid terminator, so it flagged hash-route fragments like #24h / #1h (the stats-page window-selector routes) as tracker tags — four false positives in the frontend. A real tracker tag is never immediately followed by a letter, so widen the trailing class to [^0-9a-zA-Z]: still catches every real tag (followed by space / punctuation / EOL) while excluding any digit-run glued to a letter. Letter-bearing and 6-8-digit hex stay excluded as before. Also write theme.css's --crust fallback in six-digit form (#000 -> #000000) to dodge the one remaining pure-numeric-short-hex residual the lint documents. Pixel-identical colour. With both, the frontend tree contributes zero lint hits; only the legacy backlog (Rust) remains. Pattern + cases reviewed and approved by atlas on the issue.
42 lines
2 KiB
Shell
Executable file
42 lines
2 KiB
Shell
Executable file
#!/bin/sh
|
|
# CI lint: flags tracker tags (a hash followed by an issue number) in
|
|
# source comments. The hive convention is prose, not tracker tags, in
|
|
# code (see /knowledge/hive-rules.md) — tags rot, they point at moving
|
|
# targets and leak tracker coupling into the source tree.
|
|
#
|
|
# Emits a CI error annotation per hit and exits 1 if any tag is found,
|
|
# 0 otherwise. It runs as its own CI job, deliberately kept OUT of the
|
|
# required checks while the legacy backlog is cleaned up: a hit turns
|
|
# the job red (a visible, non-blocking signal on the PR) without
|
|
# blocking merge. Promote it to a required check once the tree is clean
|
|
# to make it a hard gate — no code change, just branch-protection.
|
|
#
|
|
# Scope: tracked *.rs *.nix *.js *.ts *.css *.html. Markdown is exempt
|
|
# (prose docs may legitimately cite the tracker). The pattern matches a
|
|
# hash, 2-5 digits, then a non-alphanumeric char or end-of-line. A real
|
|
# tracker tag is never glued to a letter, so the trailing class skips
|
|
# both letter-bearing / 6-8-digit hex colours (the digit run breaks or
|
|
# overruns) and digit-runs followed by a letter — e.g. hash-route
|
|
# fragments like #24h. Residual: a pure-numeric short hex (e.g. three
|
|
# identical digits) trips it — write the six-digit form to dodge.
|
|
set -eu
|
|
|
|
pattern='#[0-9]{2,5}([^0-9a-zA-Z]|$)'
|
|
|
|
# `/dev/null` forces grep to always print a filename prefix, even when
|
|
# xargs hands it a single file. `-r`/`-0` keep it robust to odd paths
|
|
# and an empty file list.
|
|
hits="$(
|
|
git ls-files -z '*.rs' '*.nix' '*.js' '*.ts' '*.css' '*.html' \
|
|
| xargs -0 -r grep -nE "$pattern" /dev/null 2>/dev/null || true
|
|
)"
|
|
|
|
if [ -n "$hits" ]; then
|
|
echo "$hits" | while IFS=: read -r file lineno _; do
|
|
printf '::error file=%s,line=%s::tracker tag in source — write prose, not a hash-number tag (see /knowledge/hive-rules.md)\n' "$file" "$lineno"
|
|
done
|
|
count="$(printf '%s\n' "$hits" | wc -l | tr -d ' ')"
|
|
printf 'check-issue-refs: %s tracker tag(s) found in source\n' "$count" >&2
|
|
exit 1
|
|
fi
|
|
exit 0
|