style: more linters

This commit is contained in:
张泊明518370910136 2025-03-28 05:01:07 -04:00
parent f3a93a2097
commit f99ad5eae4
GPG Key ID: D47306D7062CDA9D
31 changed files with 94 additions and 100 deletions

View File

@ -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
View File

@ -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)

View File

@ -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 {

View File

@ -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)

View File

@ -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
} }

View File

@ -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,

View File

@ -113,7 +113,7 @@ func ToRlimit(cmd stage.Cmd) ([]syscall.Rlimit, []int, error) {
if err := syscall.Getrlimit(syscall.RLIMIT_CPU, &current); err != nil { if err := syscall.Getrlimit(syscall.RLIMIT_CPU, &current); 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,

View File

@ -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,

View File

@ -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)
} }

View File

@ -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,

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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
} }

View File

@ -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)

View File

@ -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))
} }

View File

@ -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]

View File

@ -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})
} }

View File

@ -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)

View File

@ -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)

View File

@ -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))
} }

View File

@ -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 {

View File

@ -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 {

View File

@ -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))
} }

View File

@ -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 {

View File

@ -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() {

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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)

View File

@ -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, "\\.") {

View File

@ -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
} }