feat: quit on more errors
This commit is contained in:
parent
3ccdd394b2
commit
967a859c9f
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue
Block a user