Compare commits

..

No commits in common. "454df2c6fcf142bec74d2783590a4c0cbcc73d34" and "ce15a4fa8969d06531ccdfa1f33098e25da21a78" have entirely different histories.

4 changed files with 95 additions and 148 deletions

View File

@ -36,8 +36,6 @@ func mainImpl() (err error) {
var forceQuitStageName string var forceQuitStageName string
var teapotRunResult teapot.RunResult var teapotRunResult teapot.RunResult
var commitMsg string var commitMsg string
// summarize
defer func() { defer func() {
totalScore := 0 totalScore := 0
for _, stageResult := range stageResults { for _, stageResult := range stageResults {
@ -66,8 +64,6 @@ func mainImpl() (err error) {
slog.Error("setup slog", "error", err) slog.Error("setup slog", "error", err)
return err return err
} }
// parse flag & conf file
flag.Parse() flag.Parse()
if *showVersion { if *showVersion {
fmt.Println(Version) fmt.Println(Version)
@ -100,8 +96,6 @@ func mainImpl() (err error) {
slog.Error("setup slog", "error", err) slog.Error("setup slog", "error", err)
return err return err
} }
// log conf file info
sha256, err := conf.GetSHA256(confPath) sha256, err := conf.GetSHA256(confPath)
if err != nil { if err != nil {
slog.Error("get sha256", "error", err) slog.Error("get sha256", "error", err)
@ -113,8 +107,6 @@ func mainImpl() (err error) {
slog.Error("conf check expire", "error", err) slog.Error("conf check expire", "error", err)
return err return err
} }
// run stages
groups := conf.MatchGroups(confObj, conventionalCommit) groups := conf.MatchGroups(confObj, conventionalCommit)
stageResults, forceQuitStageName, err = stage.Run( stageResults, forceQuitStageName, err = stage.Run(
confObj, groups, confObj, groups,
@ -126,8 +118,6 @@ func mainImpl() (err error) {
slog.Error("stage write", "error", err) slog.Error("stage write", "error", err)
return err return err
} }
// run teapot
teapotRunResult, err = teapot.Run(confObj, groups) teapotRunResult, err = teapot.Run(confObj, groups)
if err != nil { if err != nil {
slog.Error("teapot run", "error", err) slog.Error("teapot run", "error", err)

View File

@ -15,12 +15,10 @@ import (
type StageResult stage.StageResult type StageResult stage.StageResult
func generateStages(confStages []conf.ConfStage, groups []string) ( func generateStages(conf *conf.Conf, groups []string) ([]stage.Stage, error) {
[]stage.Stage, error,
) {
stages := []stage.Stage{} stages := []stage.Stage{}
existNames := map[string]bool{} existNames := map[string]bool{}
for _, s := range confStages { for _, s := range conf.Stage.Stages {
if s.Group != "" { if s.Group != "" {
var ok bool var ok bool
for _, group := range groups { for _, group := range groups {
@ -139,41 +137,18 @@ func Run(conf *conf.Conf, groups []string) (
conf.Stage.SandboxExecServer, conf.Stage.SandboxExecServer,
conf.Stage.SandboxToken, conf.Stage.SandboxToken,
) )
preStages, err := generateStages(conf.Stage.PreStages, groups) stages, err := generateStages(conf, groups)
if err != nil {
slog.Error("generate preStages", "error", err)
stageResults, forceQuitStageName = newErrorStageResults(err)
return
}
stages, err := generateStages(conf.Stage.Stages, groups)
if err != nil { if err != nil {
slog.Error("generate stages", "error", err) slog.Error("generate stages", "error", err)
stageResults, forceQuitStageName = newErrorStageResults(err) stageResults, forceQuitStageName = newErrorStageResults(err)
return return
} }
postStages, err := generateStages(conf.Stage.PostStages, groups)
if err != nil {
slog.Error("generate postStages", "error", err)
stageResults, forceQuitStageName = newErrorStageResults(err)
return
}
defer stage.Cleanup() defer stage.Cleanup()
// ignore force quit in preStages & postStages
slog.Info("run preStages")
_, _, err = stage.Run(preStages)
if err != nil {
slog.Error("run preStages", "error", err)
}
slog.Info("run stages")
stageResults, 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
slog.Info("run postStages")
_, _, err = stage.Run(postStages)
if err != nil {
slog.Error("run postStages", "error", err)
} }
return return
} }

View File

@ -14,9 +14,98 @@ import (
"time" "time"
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
"github.com/joint-online-judge/JOJ3/internal/stage"
"github.com/koding/multiconfig" "github.com/koding/multiconfig"
) )
type ConfStage struct {
Name string
Group string
Executor struct {
Name string
With struct {
Default stage.Cmd
Cases []OptionalCmd
}
}
Parsers []struct {
Name string
With interface{}
}
}
type ConfGroup struct {
Name string
MaxCount int
TimePeriodHour int
}
type Conf struct {
Name string `default:"unknown"`
LogPath string `default:""`
ActorCsvPath string `default:""`
ExpireUnixTimestamp int64 `default:"-1"`
MaxTotalScore int `default:"-1"`
Stage struct {
SandboxExecServer string `default:"localhost:5051"`
SandboxToken string `default:""`
OutputPath string `default:"joj3_result.json"`
Stages []ConfStage
}
Teapot struct {
LogPath string `default:"/home/tt/.cache/joint-teapot-debug.log"`
EnvFilePath string `default:"/home/tt/.config/teapot/teapot.env"`
ScoreboardPath string `default:"scoreboard.csv"`
FailedTablePath string `default:"failed-table.md"`
GradingRepoName string `default:""`
SkipIssue bool `default:"false"`
SkipScoreboard bool `default:"false"`
SkipFailedTable bool `default:"false"`
SubmitterInIssueTitle bool `default:"true"`
Groups []ConfGroup
}
}
type OptionalCmd struct {
Args *[]string
Env *[]string
Stdin *stage.CmdFile
Stdout *stage.CmdFile
Stderr *stage.CmdFile
CPULimit *uint64
RealCPULimit *uint64
ClockLimit *uint64
MemoryLimit *uint64
StackLimit *uint64
ProcLimit *uint64
CPURateLimit *uint64
CPUSetLimit *string
CopyIn *map[string]stage.CmdFile
CopyInCached *map[string]string
CopyInDir *string
CopyOut *[]string
CopyOutCached *[]string
CopyOutMax *uint64
CopyOutDir *string
TTY *bool
StrictMemoryLimit *bool
DataSegmentLimit *bool
AddressSpaceLimit *bool
}
type ConventionalCommit struct {
Type string
Scope string
Description string
Group string
Body string
Footer string
}
func GetCommitMsg() (msg string, err error) { func GetCommitMsg() (msg string, err error) {
r, err := git.PlainOpen(".") r, err := git.PlainOpen(".")
if err != nil { if err != nil {
@ -186,22 +275,10 @@ func MatchGroups(conf *Conf, conventionalCommit *ConventionalCommit) []string {
seen := make(map[string]bool) seen := make(map[string]bool)
keywords := []string{} keywords := []string{}
loweredCommitGroup := strings.ToLower(conventionalCommit.Group) loweredCommitGroup := strings.ToLower(conventionalCommit.Group)
if loweredCommitGroup == "all" { for i, stage := range conf.Stage.Stages {
for i := range conf.Stage.PreStages { if loweredCommitGroup == "all" {
conf.Stage.PreStages[i].Group = ""
}
for i := range conf.Stage.Stages {
conf.Stage.Stages[i].Group = "" conf.Stage.Stages[i].Group = ""
} }
for i := range conf.Stage.PostStages {
conf.Stage.PostStages[i].Group = ""
}
}
confStages := []ConfStage{}
confStages = append(confStages, conf.Stage.PreStages...)
confStages = append(confStages, conf.Stage.Stages...)
confStages = append(confStages, conf.Stage.PostStages...)
for _, stage := range confStages {
if stage.Group == "" { if stage.Group == "" {
continue continue
} }

View File

@ -1,95 +0,0 @@
package conf
import (
"github.com/joint-online-judge/JOJ3/internal/stage"
)
type ConfStage struct {
Name string
Group string
Executor struct {
Name string
With struct {
Default stage.Cmd
Cases []OptionalCmd
}
}
Parsers []struct {
Name string
With interface{}
}
}
type ConfGroup struct {
Name string
MaxCount int
TimePeriodHour int
}
type Conf struct {
Name string `default:"unknown"`
LogPath string `default:""`
ActorCsvPath string `default:""`
ExpireUnixTimestamp int64 `default:"-1"`
MaxTotalScore int `default:"-1"`
Stage struct {
SandboxExecServer string `default:"localhost:5051"`
SandboxToken string `default:""`
OutputPath string `default:"joj3_result.json"`
PreStages []ConfStage
Stages []ConfStage
PostStages []ConfStage
}
Teapot struct {
LogPath string `default:"/home/tt/.cache/joint-teapot-debug.log"`
EnvFilePath string `default:"/home/tt/.config/teapot/teapot.env"`
ScoreboardPath string `default:"scoreboard.csv"`
FailedTablePath string `default:"failed-table.md"`
GradingRepoName string `default:""`
SkipIssue bool `default:"false"`
SkipScoreboard bool `default:"false"`
SkipFailedTable bool `default:"false"`
SubmitterInIssueTitle bool `default:"true"`
Groups []ConfGroup
}
}
type OptionalCmd struct {
Args *[]string
Env *[]string
Stdin *stage.CmdFile
Stdout *stage.CmdFile
Stderr *stage.CmdFile
CPULimit *uint64
RealCPULimit *uint64
ClockLimit *uint64
MemoryLimit *uint64
StackLimit *uint64
ProcLimit *uint64
CPURateLimit *uint64
CPUSetLimit *string
CopyIn *map[string]stage.CmdFile
CopyInCached *map[string]string
CopyInDir *string
CopyOut *[]string
CopyOutCached *[]string
CopyOutMax *uint64
CopyOutDir *string
TTY *bool
StrictMemoryLimit *bool
DataSegmentLimit *bool
AddressSpaceLimit *bool
}
type ConventionalCommit struct {
Type string
Scope string
Description string
Group string
Body string
Footer string
}