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