Initial Commit
This commit is contained in:
115
cmd/lure-analyzer/main.go
Normal file
115
cmd/lure-analyzer/main.go
Normal file
@@ -0,0 +1,115 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user