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