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

View File

@ -21,7 +21,7 @@ func setupSlog(conf Conf) {
slog.SetDefault(logger)
}
func generateStages(conf Conf) []stage.Stage {
func generateStages(conf Conf) ([]stage.Stage, error) {
stages := []stage.Stage{}
for _, s := range conf.Stages {
var cmds []stage.Cmd
@ -31,7 +31,7 @@ func generateStages(conf Conf) []stage.Stage {
err := copier.Copy(&cmd, &optionalCmd)
if err != nil {
slog.Error("generate stages", "error", err)
os.Exit(1)
return stages, err
}
// since these 3 values are pointers, copier will always copy
// them, so we need to check them manually
@ -58,7 +58,7 @@ func generateStages(conf Conf) []stage.Stage {
ParserConf: s.Parser.With,
})
}
return stages
return stages, nil
}
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)
}
func main() {
func mainImpl() error {
conf, err := commitMsgToConf()
if err != nil {
slog.Error("no conf found", "error", err)
os.Exit(1)
return err
}
setupSlog(conf)
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()
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 {
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
import (
"fmt"
"log/slog"
)
func Run(stages []Stage) []StageResult {
func Run(stages []Stage) ([]StageResult, error) {
stageResults := []StageResult{}
for _, stage := range stages {
slog.Debug("stage start", "name", stage.Name)
@ -12,24 +13,24 @@ func Run(stages []Stage) []StageResult {
executor, ok := executorMap[stage.ExecutorName]
if !ok {
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)
if err != nil {
slog.Error("executor run error", "name", stage.ExecutorName, "error", err)
break
return stageResults, err
}
slog.Debug("executor run done", "results", executorResults)
slog.Debug("parser run start", "conf", stage.ParserConf)
parser, ok := parserMap[stage.ParserName]
if !ok {
slog.Error("parser not found", "name", stage.ParserName)
break
return stageResults, err
}
parserResults, forceQuit, err := parser.Run(executorResults, stage.ParserConf)
if err != nil {
slog.Error("parser run error", "name", stage.ExecutorName, "error", err)
break
return stageResults, err
}
slog.Debug("parser run done", "results", parserResults)
stageResults = append(stageResults, StageResult{
@ -38,10 +39,11 @@ func Run(stages []Stage) []StageResult {
ForceQuit: forceQuit,
})
if forceQuit {
slog.Error("parser force quit", "name", stage.ExecutorName)
break
}
}
return stageResults
return stageResults, nil
}
func Cleanup() {