Merge branch 'master' into commit-parser
This commit is contained in:
		
						commit
						9d3a980272
					
				
							
								
								
									
										60
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								README.md
									
									
									
									
									
								
							|  | @ -22,7 +22,7 @@ $ # make sure you are in go-judge directory | |||
| $ ./tmp/go-judge -http-addr 0.0.0.0:5050 -grpc-addr 0.0.0.0:5051 -monitor-addr 0.0.0.0:5052 -enable-grpc -enable-debug -enable-metrics | ||||
| ``` | ||||
| 
 | ||||
| 6. Pull submodules. It might be slow, so only run it when necessary. | ||||
| 6. Pull submodules. It might be slow, so only run it when the test branches are out of date. | ||||
| 
 | ||||
| ```bash | ||||
| $ # make sure you are in JOJ3 directory | ||||
|  | @ -75,7 +75,7 @@ Check `Cmd` at <https://github.com/criyle/go-judge#rest-api-interface>. | |||
| 
 | ||||
| Some difference: | ||||
| 
 | ||||
| -   `CopyInCwd bool`: set to `true` to add everything in the current working directory to `CopyIn`. | ||||
| -   `CopyInDir string`: set to non-empty string to add everything in that directory to `CopyIn`. | ||||
| -   `CopyInCached map[string]string`: key: file name in the sandbox, value: file name used in `CopyOutCached`. | ||||
| -   `LocalFile`: now supports the relative path | ||||
| 
 | ||||
|  | @ -88,6 +88,12 @@ Check the `Result` at <https://github.com/criyle/go-judge#rest-api-interface>. | |||
| -   `Score int`: score of the stage. | ||||
| -   `Comment string`: comment on the stage. | ||||
| 
 | ||||
| ## Binaries (under `/cmd` and `/pkg`) | ||||
| 
 | ||||
| ### Sample | ||||
| 
 | ||||
| Just a sample on how to write an executable that can be called by the executor. | ||||
| 
 | ||||
| ### HealthCheck | ||||
| 
 | ||||
| The repohealth check will return a json list to for check result. The structure follows the score-comment pattern. | ||||
|  | @ -95,3 +101,53 @@ The repohealth check will return a json list to for check result. The structure | |||
| HealthCheck currently includes, `reposize`, `forbidden file`, `Metafile existence`, `non-ascii character` in file and message, `release tag`, and `ci files invariance` check. | ||||
| 
 | ||||
| The workflow is `joj3` pass cli args to healthcheck binary. See `./cmd/healthcheck/main.go` to view all flags. | ||||
| 
 | ||||
| ## Executors (under `/internal/executors`) | ||||
| 
 | ||||
| ### Dummy | ||||
| 
 | ||||
| Do not execute any command. Just return empty `ExecutorResult` slice. | ||||
| 
 | ||||
| ### Sandbox | ||||
| 
 | ||||
| Run the commands in `go-judge` and output the `ExecutorResult` slice. | ||||
| 
 | ||||
| ## Parsers (under `/internal/parsers`) | ||||
| 
 | ||||
| ### Clang Tidy | ||||
| 
 | ||||
| Parser for `clang-tidy`, check `/examples/clangtidy` on how to call `clang-tidy` with proper parameters. | ||||
| 
 | ||||
| ### Cppcheck | ||||
| 
 | ||||
| Parser for `cppcheck`, check `/examples/cppcheck` on how to call `cppcheck` with proper parameters. | ||||
| 
 | ||||
| ### Cpplint | ||||
| 
 | ||||
| Parser for `cpplint`, check `/examples/cpplint` on how to call `cpplint` with proper parameters. | ||||
| 
 | ||||
| ### Diff | ||||
| 
 | ||||
| Compare the specified output of `ExecutorResult` with the content of the answer file. If they are the same, then score will be given. Just like a normal online judge system. | ||||
| 
 | ||||
| ### Dummy | ||||
| 
 | ||||
| Does not parse the output of `ExecutorResult`. It just output what is set inside the configuration file as score and comment. Currently it is used to output metadata for `joint-teapot`. | ||||
| 
 | ||||
| In `joint-teapot`, it will take the content before `-` of the comment of the first stage with name `metadata` as the exercise name and record in the scoreboard. (e.g. If the comment is `p2-s2-0xdeadbeef`, then the exercise name is `p2`.) | ||||
| 
 | ||||
| ### Healthcheck | ||||
| 
 | ||||
| Parser for the `healthcheck` binary mentioned before. | ||||
| 
 | ||||
| ### Keyword | ||||
| 
 | ||||
| Match the given keyword from the specified output of `ExecutorResult`. For each match, a deduction of score is given. Can be useful if we do not have a specific parser for a code quality tool. Check `/examples/keyword`. | ||||
| 
 | ||||
| ### Result Status | ||||
| 
 | ||||
| Only check if all the status of the executor is `StatusAccepted`. Can be used to check whether the command run in the executor exit normally. | ||||
| 
 | ||||
| ### Sample | ||||
| 
 | ||||
| Parser for the `sample` binary mentioned before. Only used as a sample. | ||||
|  |  | |||
|  | @ -85,22 +85,6 @@ func parseConfFile(path string, jobtype JobType) (conf Conf, err error) { | |||
| 		slog.Error("parse stages conf", "error", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if err = d.Validate(&conf); err != nil { | ||||
| 		slog.Error("validate stages conf", "error", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	filteredStages := []Stage{} | ||||
| 
 | ||||
| 	for _, stage := range conf.Stages { | ||||
| 		if filterStage(stage, jobtype) { | ||||
| 			filteredStages = append(filteredStages, stage) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	conf.Stages = filteredStages | ||||
| 
 | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ func convertPBCmd(cmd []stage.Cmd) []*pb.Request_CmdType { | |||
| 			CpuSetLimit:       c.CPUSetLimit, | ||||
| 			DataSegmentLimit:  c.DataSegmentLimit, | ||||
| 			AddressSpaceLimit: c.AddressSpaceLimit, | ||||
| 			CopyIn:            convertPBCopyIn(c.CopyIn, c.CopyInCwd), | ||||
| 			CopyIn:            convertPBCopyIn(c.CopyIn, c.CopyInDir), | ||||
| 			CopyOut:           convertPBCopyOut(c.CopyOut), | ||||
| 			CopyOutCached:     convertPBCopyOut(c.CopyOutCached), | ||||
| 			CopyOutMax:        c.CopyOutMax, | ||||
|  | @ -39,9 +39,11 @@ func convertPBCmd(cmd []stage.Cmd) []*pb.Request_CmdType { | |||
| 	return ret | ||||
| } | ||||
| 
 | ||||
| func convertPBCopyIn(copyIn map[string]stage.CmdFile, copyInCwd bool) map[string]*pb.Request_File { | ||||
| 	if copyInCwd { | ||||
| 		_ = filepath.Walk(".", | ||||
| func convertPBCopyIn( | ||||
| 	copyIn map[string]stage.CmdFile, copyInDir string, | ||||
| ) map[string]*pb.Request_File { | ||||
| 	if copyInDir != "" { | ||||
| 		_ = filepath.Walk(copyInDir, | ||||
| 			func(path string, info os.FileInfo, err error) error { | ||||
| 				if err != nil { | ||||
| 					return nil | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ func severityFromString(severityString string) (Severity, error) { | |||
| 	case "information": | ||||
| 		return INFORMATION, nil | ||||
| 	default: | ||||
| 		return UNKNOWN, fmt.Errorf("unkown severity type \"%s\" for cppcheck", severityString) | ||||
| 		return UNKNOWN, fmt.Errorf("unknown severity type \"%s\" for cppcheck", severityString) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ type Cmd struct { | |||
| 
 | ||||
| 	CopyIn       map[string]CmdFile `json:"copyIn"` | ||||
| 	CopyInCached map[string]string  `json:"copyInCached"` | ||||
| 	CopyInCwd    bool               `json:"copyInCwd"` | ||||
| 	CopyInDir    string             `json:"copyInDir"` | ||||
| 
 | ||||
| 	CopyOut       []string `json:"copyOut"` | ||||
| 	CopyOutCached []string `json:"copyOutCached"` | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ import ( | |||
| 	"unicode" | ||||
| 
 | ||||
| 	"github.com/go-git/go-git/v5" | ||||
| 	"github.com/go-git/go-git/v5/plumbing/object" | ||||
| ) | ||||
| 
 | ||||
| // nonAsciiMsg checks for non-ASCII characters in the commit message.
 | ||||
|  | @ -28,23 +27,19 @@ func NonAsciiMsg(root string) error { | |||
| 		slog.Error("getting reference", "err", err) | ||||
| 		return fmt.Errorf("error getting reference: %v", err) | ||||
| 	} | ||||
| 	commits, err := repo.Log(&git.LogOptions{From: ref.Hash()}) | ||||
| 
 | ||||
| 	commit, err := repo.CommitObject(ref.Hash()) | ||||
| 	if err != nil { | ||||
| 		slog.Error("getting commits", "err", err) | ||||
| 		return fmt.Errorf("error getting commits from reference %s: %v", ref.Hash(), err) | ||||
| 		slog.Error("getting latest commit", "err", err) | ||||
| 		return fmt.Errorf("error getting latest commit: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	var msgs []string | ||||
| 	err = commits.ForEach(func(c *object.Commit) error { | ||||
| 		msgs = append(msgs, c.Message) | ||||
| 	msg := commit.Message | ||||
| 	if msg == "" { | ||||
| 		return nil | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		slog.Error("iterating commits", "err", err) | ||||
| 		return fmt.Errorf("error iterating commits: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	var nonAsciiMsgs []string | ||||
| 	var isCommitLegal bool = true | ||||
| 	// List of prefixes to ignore in the commit message
 | ||||
| 	ignoredPrefixes := []string{ | ||||
| 		"Co-authored-by:", | ||||
|  | @ -53,10 +48,6 @@ func NonAsciiMsg(root string) error { | |||
| 		"Reviewed-on:", | ||||
| 	} | ||||
| 
 | ||||
| 	for _, msg := range msgs { | ||||
| 		if msg == "" { | ||||
| 			continue | ||||
| 		} | ||||
| 	// Split message by lines and ignore specific lines with prefixes
 | ||||
| 	lines := strings.Split(msg, "\n") | ||||
| 	for _, line := range lines { | ||||
|  | @ -74,14 +65,14 @@ func NonAsciiMsg(root string) error { | |||
| 		// Check for non-ASCII characters in the rest of the lines
 | ||||
| 		for _, c := range line { | ||||
| 			if c > unicode.MaxASCII { | ||||
| 					nonAsciiMsgs = append(nonAsciiMsgs, msg) | ||||
| 				isCommitLegal = false | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	} | ||||
| 	if len(nonAsciiMsgs) > 0 { | ||||
| 		return fmt.Errorf("Non-ASCII characters in commit messages:\n%s", strings.Join(nonAsciiMsgs, "\n")) | ||||
| 
 | ||||
| 	if !isCommitLegal { | ||||
| 		return fmt.Errorf("Non-ASCII characters in commit messages:\n%s", msg) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ func getMetas(rootDir string, fileList []string) ([]string, string, error) { | |||
| 	matched := false | ||||
| 	umatchedRes := "" | ||||
| 
 | ||||
| 	// TODO: it seems that there is no good find subsitution now
 | ||||
| 	// TODO: it seems that there is no good find substitution now
 | ||||
| 	// modify current code if exist a better solution
 | ||||
| 	for i, regex := range regexList { | ||||
| 		for _, file := range files { | ||||
|  |  | |||
|  | @ -18,14 +18,14 @@ for submodule in $submodules; do | |||
|         else | ||||
|             cd $repo_dir | ||||
|             git fetch --all | ||||
|             cd - | ||||
|             cd - > /dev/null | ||||
|         fi | ||||
|     fi | ||||
|     repo_names[$repo_name]=1 | ||||
|     cd $repo_dir | ||||
|     git checkout -q $branch | ||||
|     git reset -q --hard origin/$branch | ||||
|     cd - | ||||
|     cd - > /dev/null | ||||
|     submodule_dir="$submodules_dir/$repo_name/$submodule" | ||||
|     mkdir -p $submodule_dir | ||||
|     cp -rT $repo_dir $submodule_dir | ||||
|  |  | |||
|  | @ -17,5 +17,5 @@ for submodule in $submodules; do | |||
|             mv -f "joj3_result.json" "expected.json" | ||||
|         fi | ||||
|     fi | ||||
|     cd - | ||||
|     cd - > /dev/null | ||||
| done | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 zzjc1234
						zzjc1234