feat(cmd/joj3): remove hardcoded teapot check stage #80
|  | @ -34,7 +34,6 @@ func mainImpl() (err error) { | ||||||
| 	confObj := new(conf.Conf) | 	confObj := new(conf.Conf) | ||||||
| 	var stageResults []internalStage.StageResult | 	var stageResults []internalStage.StageResult | ||||||
| 	var forceQuitStageName string | 	var forceQuitStageName string | ||||||
| 	var teapotCheckResults []teapot.CheckResult |  | ||||||
| 	var teapotRunResult teapot.RunResult | 	var teapotRunResult teapot.RunResult | ||||||
| 	var commitMsg string | 	var commitMsg string | ||||||
| 	defer func() { | 	defer func() { | ||||||
|  | @ -109,16 +108,8 @@ func mainImpl() (err error) { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	groups := conf.MatchGroups(confObj, conventionalCommit) | 	groups := conf.MatchGroups(confObj, conventionalCommit) | ||||||
| 	if len(confObj.Teapot.Groups) != 0 { |  | ||||||
| 		teapotCheckResults, err = teapot.Check(confObj) |  | ||||||
| 		if err != nil { |  | ||||||
| 			slog.Error("teapot check", "error", err) |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		slog.Info("teapot check disabled") |  | ||||||
| 	} |  | ||||||
| 	stageResults, forceQuitStageName, err = stage.Run( | 	stageResults, forceQuitStageName, err = stage.Run( | ||||||
| 		confObj, groups, teapotCheckResults, | 		confObj, groups, | ||||||
| 	) | 	) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		slog.Error("stage run", "error", err) | 		slog.Error("stage run", "error", err) | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ import ( | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/joint-online-judge/JOJ3/cmd/joj3/teapot" |  | ||||||
| 	"github.com/joint-online-judge/JOJ3/internal/conf" | 	"github.com/joint-online-judge/JOJ3/internal/conf" | ||||||
| 	executors "github.com/joint-online-judge/JOJ3/internal/executor" | 	executors "github.com/joint-online-judge/JOJ3/internal/executor" | ||||||
| 	_ "github.com/joint-online-judge/JOJ3/internal/parser" | 	_ "github.com/joint-online-judge/JOJ3/internal/parser" | ||||||
|  | @ -131,67 +130,9 @@ func newErrorStageResults(err error) ([]stage.StageResult, string) { | ||||||
| 	}, "Internal Error" | 	}, "Internal Error" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newTeapotCheckStageResults( | func Run(conf *conf.Conf, groups []string) ( | ||||||
| 	checkResults []teapot.CheckResult, |  | ||||||
| 	groups []string, |  | ||||||
| ) (stageResults []stage.StageResult, forceQuitStageName string, err error) { |  | ||||||
| 	if len(checkResults) == 0 { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	comment := "" |  | ||||||
| 	forceQuit := false |  | ||||||
| 	for _, checkResult := range checkResults { |  | ||||||
| 		useGroup := false |  | ||||||
| 		if checkResult.Name != "" { |  | ||||||
| 			comment += fmt.Sprintf("keyword `%s` ", checkResult.Name) |  | ||||||
| 		} else { |  | ||||||
| 			useGroup = true |  | ||||||
| 		} |  | ||||||
| 		for _, group := range groups { |  | ||||||
| 			if strings.EqualFold(group, checkResult.Name) { |  | ||||||
| 				useGroup = true |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		comment += fmt.Sprintf( |  | ||||||
| 			"in last %d hour(s): submit count %d, max count %d\n", |  | ||||||
| 			checkResult.TimePeriod, |  | ||||||
| 			checkResult.SubmitCount, |  | ||||||
| 			checkResult.MaxCount, |  | ||||||
| 		) |  | ||||||
| 		if useGroup && checkResult.SubmitCount+1 > checkResult.MaxCount { |  | ||||||
| 			forceQuit = true |  | ||||||
| 			err = fmt.Errorf("submit count exceeded") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	stageResults = []stage.StageResult{ |  | ||||||
| 		{ |  | ||||||
| 			Name: "Teapot Check", |  | ||||||
| 			Results: []stage.ParserResult{{ |  | ||||||
| 				Score:   0, |  | ||||||
| 				Comment: comment, |  | ||||||
| 			}}, |  | ||||||
| 			ForceQuit: forceQuit, |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| 	forceQuitStageName = "Teapot Check" |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func Run( |  | ||||||
| 	conf *conf.Conf, groups []string, checkResults []teapot.CheckResult, |  | ||||||
| ) ( |  | ||||||
| 	stageResults []stage.StageResult, forceQuitStageName string, err error, | 	stageResults []stage.StageResult, forceQuitStageName string, err error, | ||||||
| ) { | ) { | ||||||
| 	stageResults, forceQuitStageName, err = newTeapotCheckStageResults( |  | ||||||
| 		checkResults, |  | ||||||
| 		groups, |  | ||||||
| 	) |  | ||||||
| 	if err != nil { |  | ||||||
| 		slog.Error("teapot check", "error", err) |  | ||||||
| 		conf.Teapot.SkipScoreboard = true // avoid adding extra submit count
 |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	executors.InitWithConf( | 	executors.InitWithConf( | ||||||
| 		conf.Stage.SandboxExecServer, | 		conf.Stage.SandboxExecServer, | ||||||
| 		conf.Stage.SandboxToken, | 		conf.Stage.SandboxToken, | ||||||
|  | @ -203,12 +144,11 @@ func Run( | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	defer stage.Cleanup() | 	defer stage.Cleanup() | ||||||
| 	newStageResults, forceQuitStageName, err := stage.Run(stages) | 	stageResults, forceQuitStageName, err = stage.Run(stages) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		slog.Error("run stages", "error", err) | 		slog.Error("run stages", "error", err) | ||||||
| 		stageResults, forceQuitStageName = newErrorStageResults(err) | 		stageResults, forceQuitStageName = newErrorStageResults(err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	stageResults = append(stageResults, newStageResults...) |  | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,57 +0,0 @@ | ||||||
| package teapot |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"log/slog" |  | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| 
 |  | ||||||
| 	"github.com/joint-online-judge/JOJ3/cmd/joj3/env" |  | ||||||
| 	"github.com/joint-online-judge/JOJ3/internal/conf" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type CheckResult struct { |  | ||||||
| 	Name        string `json:"name"` |  | ||||||
| 	SubmitCount int    `json:"submit_count"` |  | ||||||
| 	MaxCount    int    `json:"max_count"` |  | ||||||
| 	TimePeriod  int    `json:"time_period"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func Check(conf *conf.Conf) (checkResults []CheckResult, err error) { |  | ||||||
| 	os.Setenv("LOG_FILE_PATH", conf.Teapot.LogPath) |  | ||||||
| 	os.Setenv("_TYPER_STANDARD_TRACEBACK", "1") |  | ||||||
| 	if env.Attr.Actor == "" || |  | ||||||
| 		env.Attr.Repository == "" || |  | ||||||
| 		strings.Count(env.Attr.Repository, "/") != 1 { |  | ||||||
| 		slog.Error("teapot env not set") |  | ||||||
| 		err = fmt.Errorf("teapot env not set") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	repoParts := strings.Split(env.Attr.Repository, "/") |  | ||||||
| 	repoName := repoParts[1] |  | ||||||
| 	var formattedGroups []string |  | ||||||
| 	for _, group := range conf.Teapot.Groups { |  | ||||||
| 		groupConfig := fmt.Sprintf("%s=%d:%d", |  | ||||||
| 			group.Name, group.MaxCount, group.TimePeriodHour) |  | ||||||
| 		formattedGroups = append(formattedGroups, groupConfig) |  | ||||||
| 	} |  | ||||||
| 	args := []string{ |  | ||||||
| 		"joj3-check", conf.Teapot.EnvFilePath, |  | ||||||
| 		env.Attr.Actor, conf.Teapot.GradingRepoName, repoName, |  | ||||||
| 		conf.Teapot.ScoreboardPath, conf.Name, |  | ||||||
| 		"--group-config", strings.Join(formattedGroups, ","), |  | ||||||
| 	} |  | ||||||
| 	stdoutBuf, err := runCommand(args) |  | ||||||
| 	if err != nil { |  | ||||||
| 		slog.Error("teapot check exec", "error", err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	if json.Unmarshal(stdoutBuf.Bytes(), &checkResults) != nil { |  | ||||||
| 		slog.Error("unmarshal teapot result", "error", err, |  | ||||||
| 			"stdout", stdoutBuf.String()) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	slog.Info("teapot result", "result", checkResults) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user