This commit brings support of whitelisted characters during repo healthcheck/non-ascii file check. Supported by an extra switch to `repo-health-checker`, `-whitelistedChars`. The argument takes a comma-separated list of non-ASCII characters and ignores them during repo healthcheck. Illegal cmdline input is logged by the logger. Co-Authored-By: GitHub Copilot <noreply@microsoft.com> <details> <summary>Copilot Prompt</summary> <br> This is a repo for an online judge orchestrator system «JOJ3». Under `cmd/` lies a source directory for a Go command, `repo-health-checker`. You tell from its name that it checks the repo for stuff like repo size, commit message, non-ASCII character usage, etc. before sending the work to the actual judging and grading system. Now, I want the non-ASCII character checking function of the repo health checker to be flexible - it shall accept a list of non-ASCII characters and deem them acceptable. ## Your task - Accept this new cmdline arg. In `cmd/repo-health-checker/main.go`, accept a new command line flag `-whitelisted-chars`, which shall take exactly one string of comma-separated non-ASCII characters. This string shall be passed to the actual healthcheck package. - Respect this list while scanning the files. In `pkg/healthcheck/nonascii.go`, function `getNonASCII()`, we utilize a bufio *Scanner* to scan through all files for non-ASCII characters. We would like the list of acceptable chars to be passed from the cmdline to here, and modify the scanner logic to actually accept the corresponding characters. - Error handling and reporting. This command line arg, `-whitelisted-chars`, could be completely abscent; in which case, no characters shall be escaped by default. The comma-separated list passed to the command may contain ASCII characters or multiple characters that are not properly separated; in which case, ignore that element, and report the incident via the SLog logging framework used in this project. - Test your work. Create new testcases under `examples/healthcheck/` to reflect this change. Reflect to `examples/healthcheck/asciifile/` to learn about how to configure the repo health checker. Integrate your work to the Go test framework such that it could be invoked by running `make test` at the terminal. - Note: Use `git init` to init your testcase directory and make a initial commit - this project, JOJ3, only runs in Git repos. ## Notes - Directory structure. `cmd/` for invokable commands, `pkg/` for the actual logic, `internal` - something you don't need to worry about. - JOJ3 vs. Health Check. `joj3` is a separate executable; in this session we are only working on the `repo-health-checker`. - Extras. Make sure to read `README.md` and the directory structure before you go; also, create To-do before you execute your plan. </details> Reviewed-on: https://focs.ji.sjtu.edu.cn/git/JOJ/JOJ3/pulls/100 Reviewed-by: 张泊明518370910136 <bomingzh@sjtu.edu.cn> Co-authored-by: Mack Wang <mac-wang@sjtu.edu.cn> Co-committed-by: Mack Wang <mac-wang@sjtu.edu.cn>
78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
// Package healthcheck provides a set of health checks for a repository.
|
|
package healthcheck
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Result struct {
|
|
Msg string
|
|
Failed bool
|
|
}
|
|
|
|
func All(
|
|
rootDir, checkFileNameList, checkFileSumList, whitelistedChars,
|
|
allowedDomainList, actorCsvPath string,
|
|
metaFile []string, repoSize float64,
|
|
) (res Result) {
|
|
var err error
|
|
err = RepoSize(rootDir, repoSize)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Repo Size Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Repo Size Check Passed\n"
|
|
}
|
|
err = RepoLFS(rootDir)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Repo LFS Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Repo LFS Check Passed\n"
|
|
}
|
|
err = ForbiddenCheck(rootDir)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Forbidden File Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Forbidden File Check Passed\n"
|
|
}
|
|
err = MetaCheck(rootDir, metaFile)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Meta File Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Meta File Check Passed\n"
|
|
}
|
|
err = NonASCIIFiles(rootDir, whitelistedChars)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Non-ASCII Characters File Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Non-ASCII Characters File Check Passed\n"
|
|
}
|
|
err = NonASCIIMsg(rootDir)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Non-ASCII Characters Commit Message Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Non-ASCII Characters Commit Message Check Passed\n"
|
|
}
|
|
err = VerifyFiles(rootDir, checkFileNameList, checkFileSumList)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Repo File Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Repo File Check Passed\n"
|
|
}
|
|
err = AuthorEmailCheck(rootDir, strings.Split(allowedDomainList, ","), actorCsvPath)
|
|
if err != nil {
|
|
res.Msg += fmt.Sprintf("### Author Email Check Failed:\n%s\n", err.Error())
|
|
res.Failed = true
|
|
} else {
|
|
res.Msg += "### Author Email Check Passed\n"
|
|
}
|
|
return res
|
|
}
|