116 lines
2.1 KiB
Go
116 lines
2.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strings"
|
||
|
|
||
|
"go.arsenm.dev/lure-repo-bot/internal/analyze"
|
||
|
"go.arsenm.dev/lure-repo-bot/internal/shutils"
|
||
|
"go.arsenm.dev/lure-repo-bot/internal/spdx"
|
||
|
"mvdan.cc/sh/v3/expand"
|
||
|
"mvdan.cc/sh/v3/interp"
|
||
|
"mvdan.cc/sh/v3/syntax"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
err := spdx.Update()
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
ctx := context.Background()
|
||
|
|
||
|
var files []*os.File
|
||
|
for _, arg := range os.Args[1:] {
|
||
|
file, err := os.Open(arg)
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
files = append(files, file)
|
||
|
}
|
||
|
|
||
|
wd, err := os.Getwd()
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
|
||
|
issuesFound := false
|
||
|
for _, file := range files {
|
||
|
fl, err := syntax.NewParser().Parse(file, "lure.sh")
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
|
||
|
var nopRWC shutils.NopRWC
|
||
|
runner, err := interp.New(
|
||
|
interp.Env(expand.ListEnviron()),
|
||
|
interp.StdIO(nopRWC, nopRWC, os.Stderr),
|
||
|
interp.ExecHandler(shutils.NopExec),
|
||
|
interp.ReadDirHandler(shutils.NopReadDir),
|
||
|
interp.OpenHandler(shutils.NopOpen),
|
||
|
interp.StatHandler(shutils.NopStat),
|
||
|
)
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
|
||
|
err = runner.Run(ctx, fl)
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
|
||
|
findings, err := analyze.AnalyzeScript(runner, fl)
|
||
|
if err != nil {
|
||
|
fatalErr(err)
|
||
|
}
|
||
|
|
||
|
flName := strings.TrimPrefix(file.Name(), wd)
|
||
|
flName = strings.TrimPrefix(flName, "/")
|
||
|
|
||
|
fmt.Println(flName + ":")
|
||
|
if len(findings) == 0 {
|
||
|
fmt.Println("\tNo issues found!")
|
||
|
} else {
|
||
|
issuesFound = true
|
||
|
for _, finding := range findings {
|
||
|
var name string
|
||
|
if finding.Index != nil {
|
||
|
name = fmt.Sprintf(
|
||
|
"%s[%v] %s",
|
||
|
finding.ItemName,
|
||
|
finding.Index,
|
||
|
finding.ItemType,
|
||
|
)
|
||
|
} else {
|
||
|
name = fmt.Sprintf(
|
||
|
"%s %s",
|
||
|
finding.ItemName,
|
||
|
finding.ItemType,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
msg := fmt.Sprintf(finding.Msg, name)
|
||
|
|
||
|
if finding.ExtraMsg == "" {
|
||
|
fmt.Printf("\tLine %d: %s\n", finding.Line, msg)
|
||
|
} else {
|
||
|
fmt.Printf("\tLine %d: %s\n\t\t%s\n", finding.Line, msg, finding.ExtraMsg)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if issuesFound {
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func fatalErr(a ...any) {
|
||
|
fmt.Println(append([]any{"error:"}, a...)...)
|
||
|
os.Exit(1)
|
||
|
}
|