style: more linters
This commit is contained in:
parent
f3a93a2097
commit
f99ad5eae4
|
@ -1,12 +1,28 @@
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- gosec
|
- bidichk
|
||||||
|
- dupl
|
||||||
|
- errcheck
|
||||||
- gocritic
|
- gocritic
|
||||||
- gofumpt
|
|
||||||
- gofmt
|
- gofmt
|
||||||
|
- gofumpt
|
||||||
- goimports
|
- goimports
|
||||||
issues:
|
|
||||||
exclude-rules:
|
|
||||||
- linters:
|
|
||||||
- gosec
|
- gosec
|
||||||
text: G601 # false positive since go 1.22
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- nakedret
|
||||||
|
- nolintlint
|
||||||
|
- prealloc
|
||||||
|
- staticcheck
|
||||||
|
- stylecheck
|
||||||
|
- testifylint
|
||||||
|
- typecheck
|
||||||
|
- unconvert
|
||||||
|
- unused
|
||||||
|
- unparam
|
||||||
|
- usetesting
|
||||||
|
- wastedassign
|
||||||
|
linters-settings:
|
||||||
|
stylecheck:
|
||||||
|
checks: ["all", "-ST1005"]
|
||||||
|
|
2
cmd/joj3/env/env.go
vendored
2
cmd/joj3/env/env.go
vendored
|
@ -42,7 +42,7 @@ func init() {
|
||||||
low := timestamp & 0xFFFFFFFF
|
low := timestamp & 0xFFFFFFFF
|
||||||
combined := high ^ low
|
combined := high ^ low
|
||||||
combined ^= int64(pid)
|
combined ^= int64(pid)
|
||||||
combined ^= int64(timestamp >> 16)
|
combined ^= timestamp >> 16
|
||||||
combined ^= (combined >> 8)
|
combined ^= (combined >> 8)
|
||||||
combined ^= (combined << 16)
|
combined ^= (combined << 16)
|
||||||
Attr.RunID = fmt.Sprintf("%08X", combined&0xFFFFFFFF)
|
Attr.RunID = fmt.Sprintf("%08X", combined&0xFFFFFFFF)
|
||||||
|
|
|
@ -66,12 +66,12 @@ func newSlogAttrs(csvPath string) (attrs []slog.Attr) {
|
||||||
}
|
}
|
||||||
// if csvPath is empty, just return
|
// if csvPath is empty, just return
|
||||||
if csvPath == "" {
|
if csvPath == "" {
|
||||||
return
|
return attrs
|
||||||
}
|
}
|
||||||
file, err := os.Open(csvPath)
|
file, err := os.Open(csvPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("open csv", "error", err)
|
slog.Error("open csv", "error", err)
|
||||||
return
|
return attrs
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
reader := csv.NewReader(file)
|
reader := csv.NewReader(file)
|
||||||
|
@ -82,7 +82,7 @@ func newSlogAttrs(csvPath string) (attrs []slog.Attr) {
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("read csv", "error", err)
|
slog.Error("read csv", "error", err)
|
||||||
return
|
return attrs
|
||||||
}
|
}
|
||||||
if len(row) < 3 {
|
if len(row) < 3 {
|
||||||
continue
|
continue
|
||||||
|
@ -103,7 +103,7 @@ func newSlogAttrs(csvPath string) (attrs []slog.Attr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupSlog(conf *conf.Conf) error {
|
func setupSlog(conf *conf.Conf) error {
|
||||||
|
@ -121,14 +121,14 @@ func setupSlog(conf *conf.Conf) error {
|
||||||
&slog.HandlerOptions{Level: slog.LevelDebug})
|
&slog.HandlerOptions{Level: slog.LevelDebug})
|
||||||
handlers = append(handlers, debugTextHandler.WithAttrs(attrs))
|
handlers = append(handlers, debugTextHandler.WithAttrs(attrs))
|
||||||
// Json file handler for debug logs
|
// Json file handler for debug logs
|
||||||
debugJsonFile, err := os.OpenFile(logPath+".ndjson",
|
debugJSONFile, err := os.OpenFile(logPath+".ndjson",
|
||||||
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o640)
|
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o640)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
debugJsonHandler := slog.NewJSONHandler(debugJsonFile,
|
debugJSONHandler := slog.NewJSONHandler(debugJSONFile,
|
||||||
&slog.HandlerOptions{Level: slog.LevelDebug})
|
&slog.HandlerOptions{Level: slog.LevelDebug})
|
||||||
handlers = append(handlers, debugJsonHandler.WithAttrs(attrs))
|
handlers = append(handlers, debugJSONHandler.WithAttrs(attrs))
|
||||||
}
|
}
|
||||||
stderrLogLevel := slog.LevelInfo
|
stderrLogLevel := slog.LevelInfo
|
||||||
if runningTest {
|
if runningTest {
|
||||||
|
|
|
@ -88,20 +88,7 @@ func TestRun(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt, func(t *testing.T) {
|
t.Run(tt, func(t *testing.T) {
|
||||||
origDir, err := os.Getwd()
|
t.Chdir(fmt.Sprintf("%s%s", root, tt))
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
err = os.Chdir(fmt.Sprintf("%s%s", root, tt))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
err := os.Chdir(origDir)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
os.Args = []string{"./joj3"}
|
os.Args = []string{"./joj3"}
|
||||||
outputFile := "joj3_result.json"
|
outputFile := "joj3_result.json"
|
||||||
defer os.Remove(outputFile)
|
defer os.Remove(outputFile)
|
||||||
|
|
|
@ -149,19 +149,19 @@ func runStages(
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("generate preStages", "error", err)
|
slog.Error("generate preStages", "error", err)
|
||||||
stageResults, forceQuitStageName = newErrorStageResults(err)
|
stageResults, forceQuitStageName = newErrorStageResults(err)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
stages, err := generateStages(conf.Stage.Stages, groups)
|
stages, err := generateStages(conf.Stage.Stages, groups)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("generate stages", "error", err)
|
slog.Error("generate stages", "error", err)
|
||||||
stageResults, forceQuitStageName = newErrorStageResults(err)
|
stageResults, forceQuitStageName = newErrorStageResults(err)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
postStages, err := generateStages(conf.Stage.PostStages, groups)
|
postStages, err := generateStages(conf.Stage.PostStages, groups)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("generate postStages", "error", err)
|
slog.Error("generate postStages", "error", err)
|
||||||
stageResults, forceQuitStageName = newErrorStageResults(err)
|
stageResults, forceQuitStageName = newErrorStageResults(err)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
defer stage.Cleanup()
|
defer stage.Cleanup()
|
||||||
// ignore force quit in preStages & postStages
|
// ignore force quit in preStages & postStages
|
||||||
|
@ -194,5 +194,5 @@ func runStages(
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("run postStages", "error", err)
|
slog.Error("run postStages", "error", err)
|
||||||
}
|
}
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package dummy
|
||||||
import "github.com/joint-online-judge/JOJ3/internal/stage"
|
import "github.com/joint-online-judge/JOJ3/internal/stage"
|
||||||
|
|
||||||
func (e *Dummy) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) {
|
func (e *Dummy) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) {
|
||||||
var res []stage.ExecutorResult
|
res := make([]stage.ExecutorResult, 0, len(cmds))
|
||||||
for range cmds {
|
for range cmds {
|
||||||
res = append(res, stage.ExecutorResult{
|
res = append(res, stage.ExecutorResult{
|
||||||
Status: stage.StatusAccepted,
|
Status: stage.StatusAccepted,
|
||||||
|
|
|
@ -113,7 +113,7 @@ func ToRlimit(cmd stage.Cmd) ([]syscall.Rlimit, []int, error) {
|
||||||
if err := syscall.Getrlimit(syscall.RLIMIT_CPU, ¤t); err != nil {
|
if err := syscall.Getrlimit(syscall.RLIMIT_CPU, ¤t); err != nil {
|
||||||
return nil, nil, fmt.Errorf("getrlimit RLIMIT_CPU failed: %w", err)
|
return nil, nil, fmt.Errorf("getrlimit RLIMIT_CPU failed: %w", err)
|
||||||
}
|
}
|
||||||
userTimeLimit := min((uint64(cmd.CPULimit)+1e9-1)/1e9, current.Max) // ns to s
|
userTimeLimit := min((cmd.CPULimit+1e9-1)/1e9, current.Max) // ns to s
|
||||||
rlimits = append(rlimits, syscall.Rlimit{
|
rlimits = append(rlimits, syscall.Rlimit{
|
||||||
Cur: userTimeLimit,
|
Cur: userTimeLimit,
|
||||||
Max: current.Max,
|
Max: current.Max,
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
|
|
||||||
// copied from https://github.com/criyle/go-judge/blob/master/cmd/go-judge-shell/grpc.go
|
// copied from https://github.com/criyle/go-judge/blob/master/cmd/go-judge-shell/grpc.go
|
||||||
func convertPBCmd(cmd []stage.Cmd) []*pb.Request_CmdType {
|
func convertPBCmd(cmd []stage.Cmd) []*pb.Request_CmdType {
|
||||||
var ret []*pb.Request_CmdType
|
ret := make([]*pb.Request_CmdType, 0, len(cmd))
|
||||||
for _, c := range cmd {
|
for _, c := range cmd {
|
||||||
ret = append(ret, &pb.Request_CmdType{
|
ret = append(ret, &pb.Request_CmdType{
|
||||||
Args: c.Args,
|
Args: c.Args,
|
||||||
|
@ -140,7 +140,7 @@ func convertPBFile(i stage.CmdFile) *pb.Request_File {
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertPBResult(res []*pb.Response_Result) []stage.ExecutorResult {
|
func convertPBResult(res []*pb.Response_Result) []stage.ExecutorResult {
|
||||||
var ret []stage.ExecutorResult
|
ret := make([]stage.ExecutorResult, 0, len(res))
|
||||||
for _, r := range res {
|
for _, r := range res {
|
||||||
ret = append(ret, stage.ExecutorResult{
|
ret = append(ret, stage.ExecutorResult{
|
||||||
Status: stage.Status(r.Status),
|
Status: stage.Status(r.Status),
|
||||||
|
@ -167,7 +167,7 @@ func convertFiles(buf map[string][]byte) map[string]string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertPBFileError(fe []*pb.Response_FileError) []stage.FileError {
|
func convertPBFileError(fe []*pb.Response_FileError) []stage.FileError {
|
||||||
var ret []stage.FileError
|
ret := make([]stage.FileError, 0, len(fe))
|
||||||
for _, v := range fe {
|
for _, v := range fe {
|
||||||
ret = append(ret, stage.FileError{
|
ret = append(ret, stage.FileError{
|
||||||
Name: v.Name,
|
Name: v.Name,
|
||||||
|
|
|
@ -131,12 +131,12 @@ func convertPathsToRelative(messages *[]ClangMessage, conf Conf) {
|
||||||
func parseLines(lines []string, conf Conf) []ClangMessage {
|
func parseLines(lines []string, conf Conf) []ClangMessage {
|
||||||
messages := make([]ClangMessage, 0)
|
messages := make([]ClangMessage, 0)
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
if isIgnored(string(line)) {
|
if isIgnored(line) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
message := parseMessage(string(line))
|
message := parseMessage(line)
|
||||||
if message.level == UNKNOWN && len(messages) > 0 {
|
if message.level == UNKNOWN && len(messages) > 0 {
|
||||||
messages[len(messages)-1].detailsLines = append(messages[len(messages)-1].detailsLines, string(line))
|
messages[len(messages)-1].detailsLines = append(messages[len(messages)-1].detailsLines, line)
|
||||||
} else if message.level != UNKNOWN {
|
} else if message.level != UNKNOWN {
|
||||||
messages = append(messages, message)
|
messages = append(messages, message)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Referenced from https://github.com/yuriisk/clang-tidy-converter/blob/master/clang_tidy_converter/parser/clang_tidy_parser.py
|
// Referenced from https://github.com/yuriisk/clang-tidy-converter/blob/master/clang_tidy_converter/parser/clang_tidy_parser.py
|
||||||
type JsonMessage struct {
|
type JSONMessage struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
CheckName string `json:"checkname"`
|
CheckName string `json:"checkname"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
|
@ -17,16 +17,16 @@ type JsonMessage struct {
|
||||||
Severity string `json:"severity"`
|
Severity string `json:"severity"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func format(messages []ClangMessage) []JsonMessage {
|
func format(messages []ClangMessage) []JSONMessage {
|
||||||
formattedMessages := make([]JsonMessage, len(messages))
|
formattedMessages := make([]JSONMessage, len(messages))
|
||||||
for i, message := range messages {
|
for i, message := range messages {
|
||||||
formattedMessages[i] = formatMessage(message)
|
formattedMessages[i] = formatMessage(message)
|
||||||
}
|
}
|
||||||
return formattedMessages
|
return formattedMessages
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatMessage(message ClangMessage) JsonMessage {
|
func formatMessage(message ClangMessage) JSONMessage {
|
||||||
result := JsonMessage{
|
result := JSONMessage{
|
||||||
Type: "issue",
|
Type: "issue",
|
||||||
CheckName: message.diagnosticName,
|
CheckName: message.diagnosticName,
|
||||||
Description: message.message,
|
Description: message.message,
|
||||||
|
|
|
@ -26,7 +26,7 @@ func (p *ClangTidy) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
parseRes := p.parse(result, *conf)
|
parseRes := p.parse(result, *conf)
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getResult(jsonMessages []JsonMessage, conf Conf) (int, string) {
|
func getResult(jsonMessages []JSONMessage, conf Conf) (int, string) {
|
||||||
score := conf.Score
|
score := conf.Score
|
||||||
comment := "### Test results summary\n\n"
|
comment := "### Test results summary\n\n"
|
||||||
matchCount := make(map[string]int)
|
matchCount := make(map[string]int)
|
||||||
|
@ -29,7 +29,7 @@ func getResult(jsonMessages []JsonMessage, conf Conf) (int, string) {
|
||||||
Count int
|
Count int
|
||||||
ScoreChange int
|
ScoreChange int
|
||||||
}
|
}
|
||||||
var results []Result
|
results := make([]Result, 0, len(matchCount))
|
||||||
for keyword, count := range matchCount {
|
for keyword, count := range matchCount {
|
||||||
results = append(results, Result{
|
results = append(results, Result{
|
||||||
Keyword: keyword,
|
Keyword: keyword,
|
||||||
|
|
|
@ -14,7 +14,7 @@ type Record struct {
|
||||||
Column int `json:"column"`
|
Column int `json:"column"`
|
||||||
Severity string `json:"severity"`
|
Severity string `json:"severity"`
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
Id string `json:"id"`
|
ID string `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*CppCheck) parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult {
|
func (*CppCheck) parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult {
|
||||||
|
@ -39,16 +39,7 @@ func (*CppCheck) parse(executorResult stage.ExecutorResult, conf Conf) stage.Par
|
||||||
}
|
}
|
||||||
records = append(records, record)
|
records = append(records, record)
|
||||||
}
|
}
|
||||||
comment, score, err := getResult(records, conf)
|
comment, score := getResult(records, conf)
|
||||||
if err != nil {
|
|
||||||
return stage.ParserResult{
|
|
||||||
Score: 0,
|
|
||||||
Comment: fmt.Sprintf(
|
|
||||||
"Unexpected parser error: %s.",
|
|
||||||
err,
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stage.ParserResult{
|
return stage.ParserResult{
|
||||||
Score: score,
|
Score: score,
|
||||||
|
@ -63,7 +54,7 @@ func (p *CppCheck) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
parseRes := p.parse(result, *conf)
|
parseRes := p.parse(result, *conf)
|
||||||
|
|
|
@ -19,7 +19,7 @@ const (
|
||||||
UNKNOWN
|
UNKNOWN
|
||||||
)
|
)
|
||||||
|
|
||||||
func getResult(records []Record, conf Conf) (string, int, error) {
|
func getResult(records []Record, conf Conf) (string, int) {
|
||||||
score := conf.Score
|
score := conf.Score
|
||||||
comment := "### Test results summary\n\n"
|
comment := "### Test results summary\n\n"
|
||||||
matchCount := make(map[string]int)
|
matchCount := make(map[string]int)
|
||||||
|
@ -27,7 +27,7 @@ func getResult(records []Record, conf Conf) (string, int, error) {
|
||||||
for _, record := range records {
|
for _, record := range records {
|
||||||
for _, match := range conf.Matches {
|
for _, match := range conf.Matches {
|
||||||
for _, keyword := range match.Keywords {
|
for _, keyword := range match.Keywords {
|
||||||
if strings.Contains(record.Id, keyword) ||
|
if strings.Contains(record.ID, keyword) ||
|
||||||
strings.Contains(record.Severity, keyword) {
|
strings.Contains(record.Severity, keyword) {
|
||||||
matchCount[keyword] += 1
|
matchCount[keyword] += 1
|
||||||
scoreChange[keyword] += -match.Score
|
scoreChange[keyword] += -match.Score
|
||||||
|
@ -41,7 +41,7 @@ func getResult(records []Record, conf Conf) (string, int, error) {
|
||||||
Count int
|
Count int
|
||||||
ScoreChange int
|
ScoreChange int
|
||||||
}
|
}
|
||||||
var results []Result
|
results := make([]Result, 0, len(matchCount))
|
||||||
for keyword, count := range matchCount {
|
for keyword, count := range matchCount {
|
||||||
results = append(results, Result{
|
results = append(results, Result{
|
||||||
Keyword: keyword,
|
Keyword: keyword,
|
||||||
|
@ -62,5 +62,5 @@ func getResult(records []Record, conf Conf) (string, int, error) {
|
||||||
comment += fmt.Sprintf("%d. `%s`: %d occurrence(s), %d point(s)\n",
|
comment += fmt.Sprintf("%d. `%s`: %d occurrence(s), %d point(s)\n",
|
||||||
i+1, result.Keyword, result.Count, result.ScoreChange)
|
i+1, result.Keyword, result.Count, result.ScoreChange)
|
||||||
}
|
}
|
||||||
return comment, score, nil
|
return comment, score
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ func (*Cpplint) parse(executorResult stage.ExecutorResult, conf Conf) stage.Pars
|
||||||
Count int
|
Count int
|
||||||
ScoreChange int
|
ScoreChange int
|
||||||
}
|
}
|
||||||
var results []Result
|
results := make([]Result, 0, len(matchCount))
|
||||||
for keyword, count := range matchCount {
|
for keyword, count := range matchCount {
|
||||||
results = append(results, Result{
|
results = append(results, Result{
|
||||||
Keyword: keyword,
|
Keyword: keyword,
|
||||||
|
@ -79,7 +79,7 @@ func (p *Cpplint) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
parseRes := p.parse(result, *conf)
|
parseRes := p.parse(result, *conf)
|
||||||
|
|
|
@ -25,7 +25,7 @@ func (p *Debug) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
res = append(res, p.parse(result, *conf))
|
res = append(res, p.parse(result, *conf))
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
return nil, true, fmt.Errorf("cases number not match")
|
return nil, true, fmt.Errorf("cases number not match")
|
||||||
}
|
}
|
||||||
|
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(conf.Cases))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for i, caseConf := range conf.Cases {
|
for i, caseConf := range conf.Cases {
|
||||||
result := results[i]
|
result := results[i]
|
||||||
|
|
|
@ -11,7 +11,7 @@ func (*Dummy) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for range results {
|
for range results {
|
||||||
res = append(res, stage.ParserResult{Score: conf.Score, Comment: conf.Comment})
|
res = append(res, stage.ParserResult{Score: conf.Score, Comment: conf.Comment})
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ func (p *Healthcheck) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
parserResult, forceQuitResult := p.parse(result, *conf)
|
parserResult, forceQuitResult := p.parse(result, *conf)
|
||||||
|
|
|
@ -32,7 +32,7 @@ func (*Keyword) parse(executorResult stage.ExecutorResult, conf Conf) stage.Pars
|
||||||
Count int
|
Count int
|
||||||
ScoreChange int
|
ScoreChange int
|
||||||
}
|
}
|
||||||
var results []Result
|
results := make([]Result, 0, len(matchCount))
|
||||||
for keyword, count := range matchCount {
|
for keyword, count := range matchCount {
|
||||||
results = append(results, Result{
|
results = append(results, Result{
|
||||||
Keyword: keyword,
|
Keyword: keyword,
|
||||||
|
@ -66,7 +66,7 @@ func (p *Keyword) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
parseRes := p.parse(result, *conf)
|
parseRes := p.parse(result, *conf)
|
||||||
|
|
|
@ -43,7 +43,7 @@ func (p *Log) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
res = append(res, p.parse(result, *conf))
|
res = append(res, p.parse(result, *conf))
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ func (*ResultDetail) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
comment := ""
|
comment := ""
|
||||||
if conf.ShowExecutorStatus {
|
if conf.ShowExecutorStatus {
|
||||||
|
|
|
@ -15,7 +15,7 @@ func (*ResultStatus) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
}
|
}
|
||||||
score := conf.Score
|
score := conf.Score
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
comment := conf.Comment
|
comment := conf.Comment
|
||||||
if result.Status != stage.StatusAccepted {
|
if result.Status != stage.StatusAccepted {
|
||||||
|
|
|
@ -32,7 +32,7 @@ func (p *Sample) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
res = append(res, p.parse(result, *conf))
|
res = append(res, p.parse(result, *conf))
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ func (*TierScore) Run(results []stage.ExecutorResult, confAny any) (
|
||||||
return nil, true, err
|
return nil, true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var res []stage.ParserResult
|
res := make([]stage.ParserResult, 0, len(results))
|
||||||
forceQuit := false
|
forceQuit := false
|
||||||
|
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
|
|
|
@ -36,7 +36,7 @@ func Run(stages []Stage) (
|
||||||
"name", stage.Executor.Name,
|
"name", stage.Executor.Name,
|
||||||
)
|
)
|
||||||
err = fmt.Errorf("executor not found: %s", stage.Executor.Name)
|
err = fmt.Errorf("executor not found: %s", stage.Executor.Name)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
executorResults, err = executor.Run(stage.Executor.Cmds)
|
executorResults, err = executor.Run(stage.Executor.Cmds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -46,7 +46,7 @@ func Run(stages []Stage) (
|
||||||
"name", stage.Executor.Name,
|
"name", stage.Executor.Name,
|
||||||
"error", err,
|
"error", err,
|
||||||
)
|
)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
for i, executorResult := range executorResults {
|
for i, executorResult := range executorResults {
|
||||||
slog.Debug(
|
slog.Debug(
|
||||||
|
@ -92,7 +92,7 @@ func Run(stages []Stage) (
|
||||||
"name", stageParser.Name,
|
"name", stageParser.Name,
|
||||||
)
|
)
|
||||||
err = fmt.Errorf("parser not found: %s", stageParser.Name)
|
err = fmt.Errorf("parser not found: %s", stageParser.Name)
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
var parserForceQuit bool
|
var parserForceQuit bool
|
||||||
tmpParserResults, parserForceQuit, err = parser.Run(
|
tmpParserResults, parserForceQuit, err = parser.Run(
|
||||||
|
@ -154,7 +154,7 @@ func Run(stages []Stage) (
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return stageResults, forceQuitStageName, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func Cleanup() {
|
func Cleanup() {
|
||||||
|
|
|
@ -76,7 +76,7 @@ func StringToStatus(s string) (Status, error) {
|
||||||
|
|
||||||
// MarshalJSON convert status into string
|
// MarshalJSON convert status into string
|
||||||
func (s Status) MarshalJSON() ([]byte, error) {
|
func (s Status) MarshalJSON() ([]byte, error) {
|
||||||
return []byte("\"" + Status(s).String() + "\""), nil
|
return []byte("\"" + s.String() + "\""), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON convert string into status
|
// UnmarshalJSON convert string into status
|
||||||
|
@ -86,7 +86,7 @@ func (s *Status) UnmarshalJSON(b []byte) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
*s = Status(v)
|
*s = v
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,12 +31,12 @@ func All(
|
||||||
res.Msg += fmt.Sprintf("### Meta File Check Failed:\n%s\n", err.Error())
|
res.Msg += fmt.Sprintf("### Meta File Check Failed:\n%s\n", err.Error())
|
||||||
res.Failed = true
|
res.Failed = true
|
||||||
}
|
}
|
||||||
err = NonAsciiFiles(rootDir)
|
err = NonASCIIFiles(rootDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res.Msg += fmt.Sprintf("### Non-ASCII Characters File Check Failed:\n%s\n", err.Error())
|
res.Msg += fmt.Sprintf("### Non-ASCII Characters File Check Failed:\n%s\n", err.Error())
|
||||||
res.Failed = true
|
res.Failed = true
|
||||||
}
|
}
|
||||||
err = NonAsciiMsg(rootDir)
|
err = NonASCIIMsg(rootDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res.Msg += fmt.Sprintf("### Non-ASCII Characters Commit Message Check Failed:\n%s\n", err.Error())
|
res.Msg += fmt.Sprintf("### Non-ASCII Characters Commit Message Check Failed:\n%s\n", err.Error())
|
||||||
res.Failed = true
|
res.Failed = true
|
||||||
|
@ -46,5 +46,5 @@ func All(
|
||||||
res.Msg += fmt.Sprintf("### Repo File Check Failed:\n%s\n", err.Error())
|
res.Msg += fmt.Sprintf("### Repo File Check Failed:\n%s\n", err.Error())
|
||||||
res.Failed = true
|
res.Failed = true
|
||||||
}
|
}
|
||||||
return
|
return res
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,12 +44,12 @@ func checkMsg(msg string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// nonAsciiMsg checks for non-ASCII characters in the commit message.
|
// NonASCIIMsg checks for non-ASCII characters in the commit message.
|
||||||
// It iterates over each character in the message and checks if it is a non-ASCII character.
|
// It iterates over each character in the message and checks if it is a non-ASCII character.
|
||||||
// If a non-ASCII character is found, it returns an error indicating not to use non-ASCII characters in commit messages.
|
// If a non-ASCII character is found, it returns an error indicating not to use non-ASCII characters in commit messages.
|
||||||
// Otherwise, it returns nil indicating that the commit message is valid.
|
// Otherwise, it returns nil indicating that the commit message is valid.
|
||||||
// It skips the non-ASCII characters check for lines starting with specific keywords like "Co-authored-by", "Reviewed-by", and "Co-committed-by".
|
// It skips the non-ASCII characters check for lines starting with specific keywords like "Co-authored-by", "Reviewed-by", and "Co-committed-by".
|
||||||
func NonAsciiMsg(root string) error {
|
func NonASCIIMsg(root string) error {
|
||||||
repo, err := git.PlainOpen(root)
|
repo, err := git.PlainOpen(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("opening git repo", "err", err)
|
slog.Error("opening git repo", "err", err)
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
// getMetas retrieves a list of metadata files that are expected to exist in the specified root directory.
|
// getMetas retrieves a list of metadata files that are expected to exist in the specified root directory.
|
||||||
// It checks for the existence of each file in the fileList and provides instructions if any file is missing.
|
// It checks for the existence of each file in the fileList and provides instructions if any file is missing.
|
||||||
func getMetas(rootDir string, fileList []string) ([]string, string, error) {
|
func getMetas(rootDir string, fileList []string) ([]string, string, error) {
|
||||||
var regexList []*regexp.Regexp
|
regexList := make([]*regexp.Regexp, 0, len(fileList))
|
||||||
for _, file := range fileList {
|
for _, file := range fileList {
|
||||||
pattern := "(?i)" + file
|
pattern := "(?i)" + file
|
||||||
if !strings.Contains(pattern, "\\.") {
|
if !strings.Contains(pattern, "\\.") {
|
||||||
|
|
|
@ -12,10 +12,10 @@ import (
|
||||||
"github.com/go-git/go-git/v5/plumbing/format/gitattributes"
|
"github.com/go-git/go-git/v5/plumbing/format/gitattributes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// getNonAscii retrieves a list of files in the specified root directory that contain non-ASCII characters.
|
// getNonASCII retrieves a list of files in the specified root directory that contain non-ASCII characters.
|
||||||
// It searches for non-ASCII characters in each file's content and returns a list of paths to files containing non-ASCII characters.
|
// It searches for non-ASCII characters in each file's content and returns a list of paths to files containing non-ASCII characters.
|
||||||
func getNonAscii(root string) ([]string, error) {
|
func getNonASCII(root string) ([]string, error) {
|
||||||
var nonAscii []string
|
var nonASCII []string
|
||||||
gitattrExist := true
|
gitattrExist := true
|
||||||
var matcher gitattributes.Matcher
|
var matcher gitattributes.Matcher
|
||||||
_, err := os.Stat(".gitattributes")
|
_, err := os.Stat(".gitattributes")
|
||||||
|
@ -71,7 +71,7 @@ func getNonAscii(root string) ([]string, error) {
|
||||||
cont := true
|
cont := true
|
||||||
for _, c := range scanner.Text() {
|
for _, c := range scanner.Text() {
|
||||||
if c > unicode.MaxASCII {
|
if c > unicode.MaxASCII {
|
||||||
nonAscii = append(nonAscii, "\t"+path)
|
nonASCII = append(nonASCII, "\t"+path)
|
||||||
cont = false
|
cont = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -84,20 +84,20 @@ func getNonAscii(root string) ([]string, error) {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
return nonAscii, err
|
return nonASCII, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// nonAsciiFiles checks for non-ASCII characters in files within the specified root directory.
|
// NonASCIIFiles checks for non-ASCII characters in files within the specified root directory.
|
||||||
// It prints a message with the paths to files containing non-ASCII characters, if any.
|
// It prints a message with the paths to files containing non-ASCII characters, if any.
|
||||||
func NonAsciiFiles(root string) error {
|
func NonASCIIFiles(root string) error {
|
||||||
nonAscii, err := getNonAscii(root)
|
nonASCII, err := getNonASCII(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("getting non-ascii", "err", err)
|
slog.Error("getting non-ascii", "err", err)
|
||||||
return fmt.Errorf("error getting non-ascii: %w", err)
|
return fmt.Errorf("error getting non-ascii: %w", err)
|
||||||
}
|
}
|
||||||
if len(nonAscii) > 0 {
|
if len(nonASCII) > 0 {
|
||||||
return fmt.Errorf("Non-ASCII characters found in the following files:\n%s",
|
return fmt.Errorf("Non-ASCII characters found in the following files:\n%s",
|
||||||
strings.Join(nonAscii, "\n"))
|
strings.Join(nonASCII, "\n"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user