refactor: move modules
Some checks failed
build / build (push) Failing after 1m21s
build / trigger-build-image (push) Has been skipped

This commit is contained in:
张泊明518370910136 2024-10-06 19:41:39 -04:00
parent 6c3de223d1
commit 8ffa64de4a
GPG Key ID: D47306D7062CDA9D
7 changed files with 90 additions and 86 deletions

View File

@ -1,4 +1,4 @@
package stage package conf
import ( import (
"fmt" "fmt"
@ -8,6 +8,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/go-git/go-git/v5"
"github.com/joint-online-judge/JOJ3/internal/stage" "github.com/joint-online-judge/JOJ3/internal/stage"
"github.com/koding/multiconfig" "github.com/koding/multiconfig"
) )
@ -73,6 +74,23 @@ type ConventionalCommit struct {
Footer string Footer string
} }
func GetCommitMsg() (msg string, err error) {
r, err := git.PlainOpen(".")
if err != nil {
return
}
ref, err := r.Head()
if err != nil {
return
}
commit, err := r.CommitObject(ref.Hash())
if err != nil {
return
}
msg = commit.Message
return
}
func parseConventionalCommit(commit string) (*ConventionalCommit, error) { func parseConventionalCommit(commit string) (*ConventionalCommit, error) {
re := regexp.MustCompile(`(?s)^(\w+)(\(([^)]+)\))?!?: (.+?)(\n\n(.+?))?(\n\n(.+))?$`) re := regexp.MustCompile(`(?s)^(\w+)(\(([^)]+)\))?!?: (.+?)(\n\n(.+?))?(\n\n(.+))?$`)
matches := re.FindStringSubmatch(strings.TrimSpace(commit)) matches := re.FindStringSubmatch(strings.TrimSpace(commit))
@ -107,7 +125,7 @@ func parseConfFile(path string) (conf Conf, err error) {
return return
} }
func parseMsg(confRoot, confName, msg string) (conf Conf, group string, err error) { func ParseMsg(confRoot, confName, msg string) (conf Conf, group string, err error) {
slog.Info("parse msg", "msg", msg) slog.Info("parse msg", "msg", msg)
conventionalCommit, err := parseConventionalCommit(msg) conventionalCommit, err := parseConventionalCommit(msg)
if err != nil { if err != nil {
@ -142,7 +160,7 @@ func parseMsg(confRoot, confName, msg string) (conf Conf, group string, err erro
return return
} }
func listValidScopes(confRoot, confName, msg string) ([]string, error) { func ListValidScopes(confRoot, confName, msg string) ([]string, error) {
conventionalCommit, err := parseConventionalCommit(msg) conventionalCommit, err := parseConventionalCommit(msg)
if err != nil { if err != nil {
return []string{}, err return []string{}, err

View File

@ -1,4 +1,4 @@
package stage package conf
import ( import (
"reflect" "reflect"

View File

@ -1,4 +1,4 @@
package stage package main
import ( import (
"context" "context"

View File

@ -1,19 +1,71 @@
package main package main
import ( import (
"flag"
"fmt"
"log/slog" "log/slog"
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
"github.com/joint-online-judge/JOJ3/cmd/joj3/stage" "github.com/joint-online-judge/JOJ3/cmd/joj3/stage"
"github.com/joint-online-judge/JOJ3/cmd/joj3/teapot" "github.com/joint-online-judge/JOJ3/cmd/joj3/teapot"
) )
var (
confRoot string
confName string
msg string
showVersion *bool
Version string = "debug"
)
func init() {
flag.StringVar(&confRoot, "conf-root", ".", "root path for all config files")
flag.StringVar(&confName, "conf-name", "conf.json", "filename for config files")
flag.StringVar(&msg, "msg", "", "message to trigger the running, leave empty to use git commit message on HEAD")
showVersion = flag.Bool("version", false, "print current version")
}
func main() { func main() {
// TODO: call stage-runner if err := setupSlog(""); err != nil { // before conf is loaded
if err := stage.Run(); err != nil { slog.Error("setup slog", "error", err)
slog.Error("stage runner error", "error", err) return
} }
// TODO: call joint-teapot flag.Parse()
if err := teapot.Run(); err != nil { if *showVersion {
slog.Error("teapot caller error", "error", err) fmt.Println(Version)
return
}
slog.Info("start joj3", "version", Version)
if msg == "" {
var err error
msg, err = conf.GetCommitMsg()
if err != nil {
slog.Error("get commit msg", "error", err)
return
}
}
confObj, group, err := conf.ParseMsg(confRoot, confName, msg)
if err != nil {
slog.Error("parse msg", "error", err)
validScopes, scopeErr := conf.ListValidScopes(
confRoot, confName, msg)
if scopeErr != nil {
slog.Error("list valid scopes", "error", scopeErr)
return
}
slog.Info("hint: valid scopes in commit message", "scopes", validScopes)
return
}
if err := setupSlog(confObj.LogPath); err != nil { // after conf is loaded
slog.Error("setup slog", "error", err)
return
}
if err := stage.Run(confObj, group); err != nil {
slog.Error("stage run", "error", err)
return
}
if err := teapot.Run(confObj); err != nil {
slog.Error("teapot run", "error", err)
return
} }
} }

View File

@ -1,4 +1,4 @@
package stage package main
import ( import (
"encoding/json" "encoding/json"
@ -63,7 +63,7 @@ func readStageResults(t *testing.T, path string) []stage.StageResult {
func TestRun(t *testing.T) { func TestRun(t *testing.T) {
var tests []string var tests []string
root := "../../../tmp/submodules/JOJ3-examples/examples/" root := "../../tmp/submodules/JOJ3-examples/examples/"
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
@ -105,9 +105,7 @@ func TestRun(t *testing.T) {
os.Args = []string{"./joj3"} os.Args = []string{"./joj3"}
outputFile := "joj3_result.json" outputFile := "joj3_result.json"
defer os.Remove(outputFile) defer os.Remove(outputFile)
if err := Run(); err != nil { main()
t.Fatal(err)
}
stageResults := readStageResults(t, outputFile) stageResults := readStageResults(t, outputFile)
regex := true regex := true
expectedFile := "expected_regex.json" expectedFile := "expected_regex.json"

View File

@ -2,37 +2,18 @@ package stage
import ( import (
"encoding/json" "encoding/json"
"flag"
"fmt"
"log/slog" "log/slog"
"os" "os"
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
"github.com/joint-online-judge/JOJ3/internal/executors" "github.com/joint-online-judge/JOJ3/internal/executors"
_ "github.com/joint-online-judge/JOJ3/internal/parsers" _ "github.com/joint-online-judge/JOJ3/internal/parsers"
"github.com/joint-online-judge/JOJ3/internal/stage" "github.com/joint-online-judge/JOJ3/internal/stage"
"github.com/go-git/go-git/v5"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
) )
func getCommitMsg() (msg string, err error) { func generateStages(conf conf.Conf, group string) ([]stage.Stage, error) {
r, err := git.PlainOpen(".")
if err != nil {
return
}
ref, err := r.Head()
if err != nil {
return
}
commit, err := r.CommitObject(ref.Hash())
if err != nil {
return
}
msg = commit.Message
return
}
func generateStages(conf Conf, group string) ([]stage.Stage, error) {
stages := []stage.Stage{} stages := []stage.Stage{}
existNames := map[string]bool{} existNames := map[string]bool{}
for _, s := range conf.Stages { for _, s := range conf.Stages {
@ -92,54 +73,7 @@ func outputResult(outputPath string, results []stage.StageResult) error {
append(content, []byte("\n")...), 0o600) append(content, []byte("\n")...), 0o600)
} }
var ( func Run(conf conf.Conf, group string) error {
confRoot string
confName string
msg string
showVersion *bool
Version string = "debug"
)
func init() {
flag.StringVar(&confRoot, "conf-root", ".", "root path for all config files")
flag.StringVar(&confName, "conf-name", "conf.json", "filename for config files")
flag.StringVar(&msg, "msg", "", "message to trigger the running, leave empty to use git commit message on HEAD")
showVersion = flag.Bool("version", false, "print current version")
}
func Run() error {
if err := setupSlog(""); err != nil { // before conf is loaded
return err
}
flag.Parse()
if *showVersion {
fmt.Println(Version)
return nil
}
slog.Info("start joj3", "version", Version)
if msg == "" {
var err error
msg, err = getCommitMsg()
if err != nil {
slog.Error("get commit msg", "error", err)
return err
}
}
conf, group, err := parseMsg(confRoot, confName, msg)
if err != nil {
slog.Error("parse msg", "error", err)
validScopes, scopeErr := listValidScopes(
confRoot, confName, msg)
if scopeErr != nil {
slog.Error("list valid scopes", "error", scopeErr)
return scopeErr
}
slog.Info("hint: valid scopes in commit message", "scopes", validScopes)
return err
}
if err := setupSlog(conf.LogPath); err != nil { // after conf is loaded
return err
}
executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken) executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken)
stages, err := generateStages(conf, group) stages, err := generateStages(conf, group)
if err != nil { if err != nil {

View File

@ -3,9 +3,11 @@ package teapot
import ( import (
"log/slog" "log/slog"
"os/exec" "os/exec"
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
) )
func Run() error { func Run(conf conf.Conf) error {
// TODO: call teapot // TODO: call teapot
cmd := exec.Command("joint-teapot", "--help") cmd := exec.Command("joint-teapot", "--help")
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()