From 967a859c9f238bd64999d3ec854d353cba413422 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Thu, 12 Sep 2024 04:36:12 -0400 Subject: [PATCH] feat: quit on more errors --- cmd/joj3/conf.go | 13 +++++-------- cmd/joj3/main.go | 30 +++++++++++++++++++++++------- internal/stage/run.go | 14 ++++++++------ 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/cmd/joj3/conf.go b/cmd/joj3/conf.go index 4f9951f..9ada30b 100644 --- a/cmd/joj3/conf.go +++ b/cmd/joj3/conf.go @@ -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 } diff --git a/cmd/joj3/main.go b/cmd/joj3/main.go index b8e0e05..8d9f91c 100644 --- a/cmd/joj3/main.go +++ b/cmd/joj3/main.go @@ -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) } } diff --git a/internal/stage/run.go b/internal/stage/run.go index 670f666..314a671 100644 --- a/internal/stage/run.go +++ b/internal/stage/run.go @@ -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() {