check-safety/buildmodeplugin.go
Alex Dunmow b423f90e29 feat: no -buildmode=plugin check (disabled until WO-WZ-017)
Adds check 29: ported plugin repos must not carry a `-buildmode=plugin` build
target (the legacy .so compile the wasm migration retires). Lands DISABLED
behind a per-check const toggle (enableBuildmodePluginCheck=false) so it emits
no output and never fails while the fleet is still porting; WO-WZ-017 flips it
on. Scans plugin Makefiles/*.sh only. Unit-tested; golden snapshots unaffected.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 18:34:28 +08:00

71 lines
2.0 KiB
Go

package main
import (
"os"
"path/filepath"
"strings"
)
// buildmodePluginViolation is one occurrence of a `-buildmode=plugin` build
// target inside a plugin repo — the legacy `.so` compile that the wasm
// migration retires (WO-WZ-009 lands this check; WO-WZ-017 activates it).
type buildmodePluginViolation struct {
file string
line int
snippet string
}
// buildmodePluginScanFiles names the build-orchestration files that legitimately
// carry a `go build` invocation; we scan only these to avoid flagging docs or
// generated Go that merely mentions the string.
func buildmodePluginScanFiles(name string) bool {
base := filepath.Base(name)
switch base {
case "Makefile", "makefile", "GNUmakefile":
return true
}
return strings.HasSuffix(base, ".sh")
}
// checkBuildmodePlugin walks each plugin root's build files for a
// `-buildmode=plugin` occurrence. A ported plugin builds wasm via
// `ninja plugin build`; a lingering `.so` target means the port is incomplete.
func checkBuildmodePlugin(roots []pluginScanTarget) []buildmodePluginViolation {
var out []buildmodePluginViolation
for _, target := range roots {
_ = filepath.WalkDir(target.root, func(path string, d os.DirEntry, err error) error {
if err != nil {
return nil //nolint:nilerr // unreadable path is not a violation
}
if d.IsDir() {
if d.Name() == ".git" || d.Name() == "node_modules" || d.Name() == "vendor" {
return filepath.SkipDir
}
return nil
}
if !buildmodePluginScanFiles(path) {
return nil
}
data, readErr := os.ReadFile(path)
if readErr != nil {
return nil
}
for i, line := range strings.Split(string(data), "\n") {
if strings.Contains(line, "-buildmode=plugin") {
rel := path
if r, e := filepath.Rel(target.root, path); e == nil {
rel = filepath.Join(target.display, r)
}
out = append(out, buildmodePluginViolation{
file: rel,
line: i + 1,
snippet: strings.TrimSpace(line),
})
}
}
return nil
})
}
return out
}