feat: quit on more errors

This commit is contained in:
张泊明518370910136 2024-09-12 04:36:12 -04:00
parent 3ccdd394b2
commit 967a859c9f
GPG Key ID: D47306D7062CDA9D
3 changed files with 36 additions and 21 deletions

View File

@ -2,7 +2,6 @@ package main
import ( import (
"log/slog" "log/slog"
"os"
"focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage"
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
@ -61,15 +60,13 @@ type OptionalCmd struct {
AddressSpaceLimit *bool AddressSpaceLimit *bool
} }
func parseConfFile(path string) Conf { func parseConfFile(path string) (conf Conf, err error) {
m := multiconfig.NewWithPath(path) m := multiconfig.NewWithPath(path)
conf := Conf{} if err = m.Load(&conf); err != nil {
err := m.Load(&conf)
if err != nil {
slog.Error("parse stages conf", "error", err) slog.Error("parse stages conf", "error", err)
os.Exit(1) return
} }
return conf return
} }
func commitMsgToConf() (conf Conf, err error) { func commitMsgToConf() (conf Conf, err error) {
@ -88,6 +85,6 @@ func commitMsgToConf() (conf Conf, err error) {
msg := commit.Message msg := commit.Message
slog.Debug("commit msg to conf", "msg", msg) slog.Debug("commit msg to conf", "msg", msg)
// TODO: parse msg to conf name // TODO: parse msg to conf name
conf = parseConfFile("conf.toml") conf, err = parseConfFile("conf.toml")
return return
} }

View File

@ -21,7 +21,7 @@ func setupSlog(conf Conf) {
slog.SetDefault(logger) slog.SetDefault(logger)
} }
func generateStages(conf Conf) []stage.Stage { func generateStages(conf Conf) ([]stage.Stage, error) {
stages := []stage.Stage{} stages := []stage.Stage{}
for _, s := range conf.Stages { for _, s := range conf.Stages {
var cmds []stage.Cmd var cmds []stage.Cmd
@ -31,7 +31,7 @@ func generateStages(conf Conf) []stage.Stage {
err := copier.Copy(&cmd, &optionalCmd) err := copier.Copy(&cmd, &optionalCmd)
if err != nil { if err != nil {
slog.Error("generate stages", "error", err) slog.Error("generate stages", "error", err)
os.Exit(1) return stages, err
} }
// since these 3 values are pointers, copier will always copy // since these 3 values are pointers, copier will always copy
// them, so we need to check them manually // them, so we need to check them manually
@ -58,7 +58,7 @@ func generateStages(conf Conf) []stage.Stage {
ParserConf: s.Parser.With, ParserConf: s.Parser.With,
}) })
} }
return stages return stages, nil
} }
func outputResult(conf Conf, results []stage.StageResult) error { func outputResult(conf Conf, results []stage.StageResult) error {
@ -70,18 +70,34 @@ func outputResult(conf Conf, results []stage.StageResult) error {
append(content, []byte("\n")...), 0o600) append(content, []byte("\n")...), 0o600)
} }
func main() { func mainImpl() error {
conf, err := commitMsgToConf() conf, err := commitMsgToConf()
if err != nil { if err != nil {
slog.Error("no conf found", "error", err) slog.Error("no conf found", "error", err)
os.Exit(1) return err
} }
setupSlog(conf) setupSlog(conf)
executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken) executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken)
stages := generateStages(conf) stages, err := generateStages(conf)
if err != nil {
slog.Error("generate stages", "error", err)
return err
}
defer stage.Cleanup() defer stage.Cleanup()
results := stage.Run(stages) results, err := stage.Run(stages)
if err != nil {
slog.Error("run stages", "error", err)
return err
}
if err := outputResult(conf, results); err != nil { if err := outputResult(conf, results); err != nil {
slog.Error("output result", "error", err) slog.Error("output result", "error", err)
return err
}
return nil
}
func main() {
if err := mainImpl(); err != nil {
os.Exit(1)
} }
} }

View File

@ -1,10 +1,11 @@
package stage package stage
import ( import (
"fmt"
"log/slog" "log/slog"
) )
func Run(stages []Stage) []StageResult { func Run(stages []Stage) ([]StageResult, error) {
stageResults := []StageResult{} stageResults := []StageResult{}
for _, stage := range stages { for _, stage := range stages {
slog.Debug("stage start", "name", stage.Name) slog.Debug("stage start", "name", stage.Name)
@ -12,24 +13,24 @@ func Run(stages []Stage) []StageResult {
executor, ok := executorMap[stage.ExecutorName] executor, ok := executorMap[stage.ExecutorName]
if !ok { if !ok {
slog.Error("executor not found", "name", stage.ExecutorName) slog.Error("executor not found", "name", stage.ExecutorName)
break return stageResults, fmt.Errorf("executor not found: %s", stage.ExecutorName)
} }
executorResults, err := executor.Run(stage.ExecutorCmds) executorResults, err := executor.Run(stage.ExecutorCmds)
if err != nil { if err != nil {
slog.Error("executor run error", "name", stage.ExecutorName, "error", err) slog.Error("executor run error", "name", stage.ExecutorName, "error", err)
break return stageResults, err
} }
slog.Debug("executor run done", "results", executorResults) slog.Debug("executor run done", "results", executorResults)
slog.Debug("parser run start", "conf", stage.ParserConf) slog.Debug("parser run start", "conf", stage.ParserConf)
parser, ok := parserMap[stage.ParserName] parser, ok := parserMap[stage.ParserName]
if !ok { if !ok {
slog.Error("parser not found", "name", stage.ParserName) slog.Error("parser not found", "name", stage.ParserName)
break return stageResults, err
} }
parserResults, forceQuit, err := parser.Run(executorResults, stage.ParserConf) parserResults, forceQuit, err := parser.Run(executorResults, stage.ParserConf)
if err != nil { if err != nil {
slog.Error("parser run error", "name", stage.ExecutorName, "error", err) slog.Error("parser run error", "name", stage.ExecutorName, "error", err)
break return stageResults, err
} }
slog.Debug("parser run done", "results", parserResults) slog.Debug("parser run done", "results", parserResults)
stageResults = append(stageResults, StageResult{ stageResults = append(stageResults, StageResult{
@ -38,10 +39,11 @@ func Run(stages []Stage) []StageResult {
ForceQuit: forceQuit, ForceQuit: forceQuit,
}) })
if forceQuit { if forceQuit {
slog.Error("parser force quit", "name", stage.ExecutorName)
break break
} }
} }
return stageResults return stageResults, nil
} }
func Cleanup() { func Cleanup() {