diff --git a/cmd/joj3/main.go b/cmd/joj3/main.go index de7d00a..6d1c2b4 100644 --- a/cmd/joj3/main.go +++ b/cmd/joj3/main.go @@ -69,9 +69,12 @@ func mainImpl() error { slog.Error("conf check expire", "error", err) return err } - stageForceQuit, err := stage.Run(confObj, group) + stageResults, stageForceQuit, err := stage.Run(confObj, group) if err != nil { slog.Error("stage run", "error", err) + } + if err = stage.Write(confObj.Stage.OutputPath, stageResults); err != nil { + slog.Error("stage write", "error", err) return err } if err := teapot.Run(confObj); err != nil { diff --git a/cmd/joj3/stage/run.go b/cmd/joj3/stage/run.go index 0f8f944..45326d8 100644 --- a/cmd/joj3/stage/run.go +++ b/cmd/joj3/stage/run.go @@ -1,9 +1,7 @@ package stage import ( - "encoding/json" "log/slog" - "os" "github.com/joint-online-judge/JOJ3/cmd/joj3/conf" executors "github.com/joint-online-judge/JOJ3/internal/executor" @@ -70,18 +68,19 @@ func generateStages(conf *conf.Conf, group string) ([]stage.Stage, error) { return stages, nil } -func outputResult(outputPath string, results []stage.StageResult) error { - slog.Info("output result start", "path", outputPath) - slog.Debug("output result start", "path", outputPath, "results", results) - content, err := json.Marshal(results) - if err != nil { - return err +func Run(conf *conf.Conf, group string) ( + stageResults []stage.StageResult, forceQuit bool, err error, +) { + stageResultsOnError := []stage.StageResult{ + { + Name: "Internal Error", + Results: []stage.ParserResult{{ + Score: 0, + Comment: "JOJ3 internal error, check the log in Gitea Actions.", + }}, + ForceQuit: true, + }, } - return os.WriteFile(outputPath, - append(content, []byte("\n")...), 0o600) -} - -func Run(conf *conf.Conf, group string) (forceQuit bool, err error) { executors.InitWithConf( conf.Stage.SandboxExecServer, conf.Stage.SandboxToken, @@ -89,16 +88,16 @@ func Run(conf *conf.Conf, group string) (forceQuit bool, err error) { stages, err := generateStages(conf, group) if err != nil { slog.Error("generate stages", "error", err) + stageResults = stageResultsOnError + forceQuit = true return } defer stage.Cleanup() - results, forceQuit, err := stage.Run(stages) + stageResults, forceQuit, err = stage.Run(stages) if err != nil { slog.Error("run stages", "error", err) - return - } - if err = outputResult(conf.Stage.OutputPath, results); err != nil { - slog.Error("output result", "error", err) + stageResults = stageResultsOnError + forceQuit = true return } return diff --git a/cmd/joj3/stage/write.go b/cmd/joj3/stage/write.go new file mode 100644 index 0000000..cb1b357 --- /dev/null +++ b/cmd/joj3/stage/write.go @@ -0,0 +1,20 @@ +package stage + +import ( + "encoding/json" + "log/slog" + "os" + + "github.com/joint-online-judge/JOJ3/internal/stage" +) + +func Write(outputPath string, results []stage.StageResult) error { + slog.Info("output result start", "path", outputPath) + slog.Debug("output result start", "path", outputPath, "results", results) + content, err := json.Marshal(results) + if err != nil { + return err + } + return os.WriteFile(outputPath, + append(content, []byte("\n")...), 0o600) +}