WIP: dev #4
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -15,7 +15,7 @@ dist/
|
|||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
# lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from joj3_config_generator.lib.repo import getHealthcheckConfig, getTeapotConfig
|
||||
from joj3_config_generator.models import (
|
||||
Cmd,
|
||||
CmdFile,
|
||||
|
@ -18,29 +19,59 @@ def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig:
|
|||
# Create the base ResultConf object
|
||||
result_conf = ResultConfig(
|
||||
name=task_conf.task,
|
||||
log_path=f"{task_conf.task.replace(' ', '_')}.log",
|
||||
# TODO: specify the exact folder difference
|
||||
log_path=f"{task_conf.task.replace(' ', '-')}.log",
|
||||
expire_unix_timestamp=(
|
||||
int(task_conf.release.deadline.timestamp())
|
||||
if task_conf.release.deadline
|
||||
else -1
|
||||
),
|
||||
stage=StageConfig(stages=[], sandbox_token=repo_conf.sandbox_token),
|
||||
teapot=TeapotConfig(),
|
||||
teapot=getTeapotConfig(repo_conf, task_conf),
|
||||
)
|
||||
|
||||
# Construct healthcheck stage
|
||||
healthcheck_stage = getHealthcheckConfig(repo_conf, task_conf)
|
||||
result_conf.stage.stages.append(healthcheck_stage)
|
||||
cached = []
|
||||
# Convert each stage in the task configuration
|
||||
for task_stage in task_conf.stages:
|
||||
file_import = (
|
||||
task_stage.files.import_
|
||||
if hasattr(task_stage, "files")
|
||||
and hasattr(task_stage.files, "import_")
|
||||
and (task_stage.files is not None)
|
||||
and (task_stage.files.import_ is not None)
|
||||
else []
|
||||
)
|
||||
copy_in_files = [file for file in file_import if (file not in cached)]
|
||||
file_export = (
|
||||
task_stage.files.export
|
||||
if hasattr(task_stage, "files")
|
||||
and hasattr(task_stage.files, "export")
|
||||
and (task_stage.files is not None)
|
||||
else []
|
||||
)
|
||||
executor_with_config = ExecutorWithConfig(
|
||||
default=Cmd(
|
||||
args=task_stage.command.split(),
|
||||
copy_in={file: CmdFile(src=file) for file in task_stage.files.import_},
|
||||
copy_out_cached=task_stage.files.export,
|
||||
copy_in={
|
||||
file: CmdFile(src=f"/home/tt/.config/joj/{file}")
|
||||
for file in copy_in_files
|
||||
},
|
||||
copy_in_cached={file: file for file in copy_in_files},
|
||||
copy_out_cached=file_export if file_export is not None else [],
|
||||
),
|
||||
cases=[], # You can add cases if needed
|
||||
)
|
||||
if file_export is not None:
|
||||
for file in file_export:
|
||||
if file not in cached:
|
||||
cached.append(file)
|
||||
conf_stage = Stage(
|
||||
name=task_stage.name,
|
||||
group=task_conf.task,
|
||||
# TODO: we may have cq in future
|
||||
group="joj" if "judge" in task_stage.name else None,
|
||||
executor=ExecutorConfig(
|
||||
name="sandbox",
|
||||
with_=executor_with_config,
|
||||
|
@ -49,12 +80,12 @@ def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig:
|
|||
ParserConfig(name=parser, with_={}) for parser in task_stage.parsers
|
||||
],
|
||||
)
|
||||
|
||||
if "result-detail" in task_stage.parsers:
|
||||
result_detail_parser = next(
|
||||
p for p in conf_stage.parsers if p.name == "result-detail"
|
||||
)
|
||||
result_detail_parser.with_.update(task_stage.result_detail)
|
||||
if task_stage.result_detail is not None:
|
||||
result_detail_parser.with_.update(task_stage.result_detail)
|
||||
|
||||
result_conf.stage.stages.append(conf_stage)
|
||||
|
||||
|
|
11
joj3_config_generator/lib/__init__.py
Normal file
11
joj3_config_generator/lib/__init__.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from joj3_config_generator.models.repo import Repo as Repo
|
||||
from joj3_config_generator.models.result import Cmd as Cmd
|
||||
from joj3_config_generator.models.result import CmdFile as CmdFile
|
||||
from joj3_config_generator.models.result import ExecutorConfig as ExecutorConfig
|
||||
from joj3_config_generator.models.result import ExecutorWithConfig as ExecutorWithConfig
|
||||
from joj3_config_generator.models.result import ParserConfig as ParserConfig
|
||||
from joj3_config_generator.models.result import ResultConfig as ResultConfig
|
||||
from joj3_config_generator.models.result import Stage as Stage
|
||||
from joj3_config_generator.models.result import StageConfig as StageConfig
|
||||
from joj3_config_generator.models.result import TeapotConfig as TeapotConfig
|
||||
from joj3_config_generator.models.task import Task as Task
|
123
joj3_config_generator/lib/repo.py
Normal file
123
joj3_config_generator/lib/repo.py
Normal file
|
@ -0,0 +1,123 @@
|
|||
import hashlib
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
from joj3_config_generator.models import (
|
||||
Cmd,
|
||||
CmdFile,
|
||||
ExecutorConfig,
|
||||
ExecutorWithConfig,
|
||||
ParserConfig,
|
||||
Repo,
|
||||
ResultConfig,
|
||||
Stage,
|
||||
StageConfig,
|
||||
Task,
|
||||
TeapotConfig,
|
||||
)
|
||||
|
||||
|
||||
def get_temp_directory() -> str:
|
||||
return tempfile.mkdtemp(prefix="repo-checker-")
|
||||
|
||||
|
||||
def getGradingRepoName() -> str:
|
||||
path = os.path.expanduser("~/.config/teapot/teapot.env")
|
||||
if os.path.exists(path):
|
||||
load_dotenv(path)
|
||||
repo_name = os.environ.get("GITEA_ORG_NAME")
|
||||
if repo_name is not None:
|
||||
return f"{repo_name.split('-')[0]}-joj"
|
||||
return "ece482-joj"
|
||||
|
||||
|
||||
def getTeapotConfig(repo_conf: Repo, task_conf: Task) -> TeapotConfig:
|
||||
teapot = TeapotConfig(
|
||||
# TODO: fix the log path
|
||||
log_path=f"{task_conf.task.replace(' ', '-')}-joint-teapot-debug.log",
|
||||
scoreboard_path=f"{task_conf.task.replace(' ', '-')}-scoreboard.csv",
|
||||
failed_table_path=f"{task_conf.task.replace(' ', '-')}-failed-table.md",
|
||||
grading_repo_name=getGradingRepoName(),
|
||||
)
|
||||
return teapot
|
||||
|
||||
|
||||
def getHealthcheckCmd(repo_conf: Repo) -> Cmd:
|
||||
repoSize = repo_conf.max_size
|
||||
immutable = repo_conf.files.immutable
|
||||
repo_size = f"-repoSize={str(repoSize)} "
|
||||
required_files = repo_conf.files.required
|
||||
|
||||
for i, meta in enumerate(required_files):
|
||||
required_files[i] = f"-meta={meta} "
|
||||
|
||||
immutable_files = f"-checkFileNameList="
|
||||
for i, name in enumerate(immutable):
|
||||
if i == len(immutable) - 1:
|
||||
immutable_files = immutable_files + name + " "
|
||||
else:
|
||||
immutable_files = immutable_files + name + ","
|
||||
# FIXME: need to make solution and make things easier to edit with global scope
|
||||
chore = f"/{get_temp_directory}/repo-health-checker -root=. "
|
||||
args = ""
|
||||
args = args + chore
|
||||
args = args + repo_size
|
||||
for meta in required_files:
|
||||
args = args + meta
|
||||
|
||||
args = args + get_hash(immutable)
|
||||
|
||||
args = args + immutable_files
|
||||
|
||||
cmd = Cmd(
|
||||
args=args.split(),
|
||||
# FIXME: easier to edit within global scope
|
||||
copy_in={
|
||||
f"/{get_temp_directory()}/repo-health-checker": CmdFile(
|
||||
src=f"/{get_temp_directory()}/repo-health-checker"
|
||||
)
|
||||
},
|
||||
)
|
||||
return cmd
|
||||
|
||||
|
||||
def getHealthcheckConfig(repo_conf: Repo, task_conf: Task) -> Stage:
|
||||
healthcheck_stage = Stage(
|
||||
name="healthcheck",
|
||||
group="",
|
||||
executor=ExecutorConfig(
|
||||
name="sandbox",
|
||||
with_=ExecutorWithConfig(default=getHealthcheckCmd(repo_conf), cases=[]),
|
||||
),
|
||||
parsers=[ParserConfig(name="healthcheck", with_={"score": 0, "comment": ""})],
|
||||
)
|
||||
return healthcheck_stage
|
||||
|
||||
|
||||
def calc_sha256sum(file_path: str) -> str:
|
||||
sha256_hash = hashlib.sha256()
|
||||
with open(file_path, "rb") as f:
|
||||
for byte_block in iter(lambda: f.read(65536 * 2), b""):
|
||||
sha256_hash.update(byte_block)
|
||||
return sha256_hash.hexdigest()
|
||||
|
||||
|
||||
def get_hash(immutable_files: list[str]) -> str: # input should be a list
|
||||
file_path = "../immutable_file/" # TODO: change this when things are on the server
|
||||
immutable_hash = []
|
||||
for i, file in enumerate(immutable_files):
|
||||
immutable_files[i] = file_path + file.rsplit("/", 1)[-1]
|
||||
|
||||
for i, file in enumerate(immutable_files):
|
||||
immutable_hash.append(calc_sha256sum(file))
|
||||
|
||||
hash_check = "-checkFileSumList="
|
||||
|
||||
for i, file in enumerate(immutable_hash):
|
||||
if i == len(immutable_hash) - 1:
|
||||
hash_check = hash_check + file + " "
|
||||
else:
|
||||
hash_check = hash_check + file + ","
|
||||
return hash_check
|
|
@ -54,6 +54,7 @@ def convert(root: Path = Path(".")) -> None:
|
|||
task_toml = task_file.read()
|
||||
repo_obj = rtoml.loads(repo_toml)
|
||||
task_obj = rtoml.loads(task_toml)
|
||||
print(task_obj)
|
||||
result_model = convert_conf(Repo(**repo_obj), Task(**task_obj))
|
||||
result_dict = result_model.model_dump(by_alias=True)
|
||||
with open(result_json_path, "w") as result_file:
|
||||
|
|
|
@ -9,7 +9,7 @@ class CmdFile(BaseModel):
|
|||
content: Optional[str] = None
|
||||
file_id: Optional[str] = Field(None, serialization_alias="fileId")
|
||||
name: Optional[str] = None
|
||||
max: Optional[int] = None
|
||||
max: Optional[int] = 4 * 1024 * 1024
|
||||
symlink: Optional[str] = None
|
||||
stream_in: bool = Field(False, serialization_alias="streamIn")
|
||||
stream_out: bool = Field(False, serialization_alias="streamOut")
|
||||
|
@ -18,16 +18,16 @@ class CmdFile(BaseModel):
|
|||
|
||||
class Cmd(BaseModel):
|
||||
args: list[str]
|
||||
env: list[str] = []
|
||||
stdin: Optional[CmdFile] = None
|
||||
stdout: Optional[CmdFile] = None
|
||||
stderr: Optional[CmdFile] = None
|
||||
cpu_limit: int = Field(0, serialization_alias="cpuLimit")
|
||||
env: list[str] = ["PATH=/usr/bin:/bin:/usr/local/bin"]
|
||||
stdin: Optional[CmdFile] = CmdFile(content="")
|
||||
stdout: Optional[CmdFile] = CmdFile(name="stdout", max=4 * 1024)
|
||||
stderr: Optional[CmdFile] = CmdFile(name="stderr", max=4 * 1024)
|
||||
cpu_limit: int = Field(4 * 1000000000, serialization_alias="cpuLimit")
|
||||
real_cpu_limit: int = Field(0, serialization_alias="realCpuLimit")
|
||||
clock_limit: int = Field(0, serialization_alias="clockLimit")
|
||||
memory_limit: int = Field(0, serialization_alias="memoryLimit")
|
||||
clock_limit: int = Field(8 * 1000000000, serialization_alias="clockLimit")
|
||||
memory_limit: int = Field(4 * 1024 * 1024, serialization_alias="memoryLimit")
|
||||
stack_limit: int = Field(0, serialization_alias="stackLimit")
|
||||
proc_limit: int = Field(0, serialization_alias="procLimit")
|
||||
proc_limit: int = Field(50, serialization_alias="procLimit")
|
||||
cpu_rate_limit: int = Field(0, serialization_alias="cpuRateLimit")
|
||||
cpu_set_limit: str = Field("", serialization_alias="cpuSetLimit")
|
||||
copy_in: dict[str, CmdFile] = Field({}, serialization_alias="copyIn")
|
||||
|
@ -45,16 +45,18 @@ class Cmd(BaseModel):
|
|||
|
||||
class OptionalCmd(BaseModel):
|
||||
args: Optional[list[str]] = None
|
||||
env: Optional[list[str]] = None
|
||||
env: Optional[list[str]] = ["PATH=/usr/bin:/bin:/usr/local/bin"]
|
||||
stdin: Optional[CmdFile] = None
|
||||
stdout: Optional[CmdFile] = None
|
||||
stderr: Optional[CmdFile] = None
|
||||
cpu_limit: Optional[int] = Field(None, serialization_alias="cpuLimit")
|
||||
cpu_limit: Optional[int] = Field(4 * 1000000000, serialization_alias="cpuLimit")
|
||||
real_cpu_limit: Optional[int] = Field(None, serialization_alias="realCpuLimit")
|
||||
clock_limit: Optional[int] = Field(None, serialization_alias="clockLimit")
|
||||
memory_limit: Optional[int] = Field(None, serialization_alias="memoryLimit")
|
||||
clock_limit: Optional[int] = Field(8 * 1000000000, serialization_alias="clockLimit")
|
||||
memory_limit: Optional[int] = Field(
|
||||
4 * 1024 * 1024, serialization_alias="memoryLimit"
|
||||
)
|
||||
stack_limit: Optional[int] = Field(None, serialization_alias="stackLimit")
|
||||
proc_limit: Optional[int] = Field(None, serialization_alias="procLimit")
|
||||
proc_limit: Optional[int] = Field(50, serialization_alias="procLimit")
|
||||
cpu_rate_limit: Optional[int] = Field(None, serialization_alias="cpuRateLimit")
|
||||
cpu_set_limit: Optional[str] = Field(None, serialization_alias="cpuSetLimit")
|
||||
copy_in: Optional[dict[str, CmdFile]] = Field(None, serialization_alias="copyIn")
|
||||
|
@ -82,7 +84,7 @@ class OptionalCmd(BaseModel):
|
|||
|
||||
class Stage(BaseModel):
|
||||
name: str
|
||||
group: str
|
||||
group: Optional[str] = None
|
||||
executor: "ExecutorConfig"
|
||||
parsers: list["ParserConfig"]
|
||||
|
||||
|
|
|
@ -5,26 +5,49 @@ from pydantic import BaseModel, Field
|
|||
|
||||
|
||||
class ParserResultDetail(BaseModel):
|
||||
time: bool = True # Display run time
|
||||
mem: bool = True # Display memory usage
|
||||
stdout: bool = False # Display stdout messages
|
||||
stderr: bool = False # Display stderr messages
|
||||
time: Optional[bool] = True # Display run time
|
||||
mem: Optional[bool] = True # Display memory usage
|
||||
stdout: Optional[bool] = False # Display stdout messages
|
||||
stderr: Optional[bool] = False # Display stderr messages
|
||||
exitstatus: Optional[bool] = False
|
||||
|
||||
|
||||
class ParserDummy(BaseModel):
|
||||
comment: Optional[str] = ""
|
||||
|
||||
|
||||
class ParserKeyword(BaseModel):
|
||||
keyword: Optional[list[str]] = None
|
||||
weight: Optional[list[int]] = None
|
||||
|
||||
|
||||
class Files(BaseModel):
|
||||
import_: list[str] = Field(alias="import")
|
||||
export: list[str]
|
||||
import_: Optional[list[str]] = Field([], alias="import")
|
||||
export: Optional[list[str]] = []
|
||||
|
||||
|
||||
class Limit(BaseModel):
|
||||
mem: Optional[int] = 4
|
||||
cpu: Optional[int] = 4
|
||||
stderr: Optional[int] = 4
|
||||
stdout: Optional[int] = 4
|
||||
|
||||
|
||||
class Stage(BaseModel):
|
||||
name: str # Stage name
|
||||
command: str # Command to run
|
||||
files: Files # Files to import and export
|
||||
score: int # Score for the task
|
||||
files: Optional[Files] = None
|
||||
score: Optional[int] = 0
|
||||
parsers: list[str] # list of parsers
|
||||
result_detail: ParserResultDetail = (
|
||||
ParserResultDetail()
|
||||
) # for result-detail parser
|
||||
limit: Optional[Limit] = None
|
||||
dummy: Optional[ParserDummy] = ParserDummy()
|
||||
keyword: Optional[ParserKeyword] = ParserKeyword()
|
||||
clangtidy: Optional[ParserKeyword] = ParserKeyword()
|
||||
cppcheck: Optional[ParserKeyword] = ParserKeyword()
|
||||
cpplint: Optional[ParserKeyword] = ParserKeyword()
|
||||
result_detail: Optional[ParserResultDetail] = Field(
|
||||
ParserResultDetail(), alias="result-detail"
|
||||
)
|
||||
|
||||
|
||||
class Release(BaseModel):
|
||||
|
|
|
@ -7,4 +7,4 @@ sandbox_token = "test"
|
|||
whitelist_patterns = ["*.py", "*.txt", "*.md"]
|
||||
whitelist_file = ".whitelist"
|
||||
required = ["main.py", "README.md"]
|
||||
immutable = ["config.yaml", "setup.py"]
|
||||
immutable = [".gitignore", ".gitattributes", "push.yaml", "release.yaml"]
|
||||
|
|
|
@ -1,53 +1,79 @@
|
|||
{
|
||||
"name": "hw3 ex5",
|
||||
"logPath": "hw3_ex5.log",
|
||||
"expireUnixTimestamp": 1729267140,
|
||||
"name": "Homework 1 exercise 2",
|
||||
"logPath": "Homework-1-exercise-2.log",
|
||||
"expireUnixTimestamp": 1728748740,
|
||||
"stage": {
|
||||
"sandboxExecServer": "172.17.0.1:5051",
|
||||
"sandboxToken": "test",
|
||||
"outputPath": "/tmp/joj3_result.json",
|
||||
"stages": [
|
||||
{
|
||||
"name": "judge_base",
|
||||
"group": "hw3 ex5",
|
||||
"name": "healthcheck",
|
||||
"group": "",
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"./matlab-joj",
|
||||
"./h3/ex5.m"
|
||||
"/tmp/repo-health-checker",
|
||||
|
||||
"-root=.",
|
||||
"-repoSize=50.5",
|
||||
"-meta=main.py",
|
||||
"-meta=README.md",
|
||||
"-checkFileSumList=a5b63323a692d3d8b952442969649b4f823d58dae26429494f613df160710dfc,b1bbad25b830db0a77b15a033f9ca1b7ab44c1d2d05056412bd3e4421645f0bf,8d1229900c6fc6711b5cc141d1ab5ea7f5b7b7a4b921d9cfa3957408b43ae723,eb857bcd94857cedc4045cb2d6ba04cb5bbb3daf188abc95fb9478db823ef47e",
|
||||
"-checkFileNameList=.gitignore,.gitattributes,push.yaml,release.yaml"
|
||||
],
|
||||
"env": [],
|
||||
"stdin": null,
|
||||
"stdout": null,
|
||||
"stderr": null,
|
||||
"cpuLimit": 0,
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 0,
|
||||
"memoryLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {
|
||||
"tools/matlab-joj": {
|
||||
"src": "tools/matlab-joj",
|
||||
"/tmp/repo-health-checker": {
|
||||
"src": "/tmp/repo-health-checker",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": null,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"tools/matlab_formatter.py": {
|
||||
"src": "tools/matlab_formatter.py",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
|
@ -57,9 +83,139 @@
|
|||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "healthcheck",
|
||||
"with": {
|
||||
"score": 0,
|
||||
"comment": ""
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Compilation",
|
||||
"group": null,
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"make.sh"
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {
|
||||
"tools/make.sh": {
|
||||
"src": "/home/tt/.config/joj/tools/make.sh",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
张泊明518370910136
commented
unnecessary unnecessary
李衍志523370910113
commented
match the templates, it is automatically updated onto it.. I may find a way to trim them off match the templates, it is automatically updated onto it.. I may find a way to trim them off
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"src/main.c": {
|
||||
"src": "/home/tt/.config/joj/src/main.c",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"src/task.h": {
|
||||
"src": "/home/tt/.config/joj/src/task.h",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"srcCMakelist.txt": {
|
||||
"src": "/home/tt/.config/joj/srcCMakelist.txt",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
}
|
||||
},
|
||||
"copyInCached": {
|
||||
"tools/make.sh": "tools/make.sh",
|
||||
"src/main.c": "src/main.c",
|
||||
"src/task.h": "src/task.h",
|
||||
"srcCMakelist.txt": "srcCMakelist.txt"
|
||||
},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [
|
||||
"output/ex5_results.txt",
|
||||
"output/ex5_logs.txt"
|
||||
"driver",
|
||||
"p2",
|
||||
"p2-msan"
|
||||
],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
|
@ -73,7 +229,119 @@
|
|||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "diff",
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-status",
|
||||
"with": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "File length check",
|
||||
"group": null,
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"./file-length",
|
||||
"500",
|
||||
"400",
|
||||
"*.c",
|
||||
"*.h"
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {
|
||||
"tools/file-length": {
|
||||
"src": "/home/tt/.config/joj/tools/file-length",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
}
|
||||
},
|
||||
"copyInCached": {
|
||||
"tools/file-length": "tools/file-length"
|
||||
},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "keyword",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
|
@ -82,65 +350,361 @@
|
|||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true
|
||||
"stderr": true,
|
||||
"exitstatus": false
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "judge_base2",
|
||||
"group": "hw3 ex5",
|
||||
"name": "Clang-tidy checks",
|
||||
"group": null,
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"./matlab-joj",
|
||||
"./h3/ex5.m"
|
||||
"run-clang-tidy-18",
|
||||
"-header-filter=.*",
|
||||
"-quiet",
|
||||
"-load=/usr/local/lib/libcodequality.so",
|
||||
"-p",
|
||||
"build"
|
||||
],
|
||||
"env": [],
|
||||
"stdin": null,
|
||||
"stdout": null,
|
||||
"stderr": null,
|
||||
"cpuLimit": 0,
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 0,
|
||||
"memoryLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {
|
||||
"tools/matlab-joj": {
|
||||
"src": "tools/matlab-joj",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": null,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"tools/matlab_formatter.py": {
|
||||
"src": "tools/matlab_formatter.py",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": null,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
}
|
||||
},
|
||||
"copyIn": {},
|
||||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [
|
||||
"output/ex5_results2.txt",
|
||||
"output/ex5_logs2.txt"
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "clangtidy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": true,
|
||||
"stderr": false,
|
||||
"exitstatus": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Cppcheck check",
|
||||
"group": null,
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"cppcheck",
|
||||
"--template='{\"file\":\"{file}\",\"line\":{line},",
|
||||
"\"column\":{column},",
|
||||
"\"severity\":\"{severity}\",",
|
||||
"\"message\":\"{message}\",",
|
||||
"\"id\":\"{id}\"}'",
|
||||
"--force",
|
||||
张泊明518370910136
commented
it's keywords now it's keywords now
|
||||
"--enable=all",
|
||||
"--quiet",
|
||||
"./"
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {},
|
||||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "cppcheck",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Cpplint check",
|
||||
"group": null,
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"cpplint",
|
||||
"--linelength=120",
|
||||
"--filter=-legal,-readability/casting,-whitespace,-runtime/printf,-runtime/threadsafe_fn,-readability/todo,-build/include_subdir,-build/header_guard",
|
||||
"--recursive",
|
||||
"--exclude=build",
|
||||
"."
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
张泊明518370910136
commented
remove the single quote and why break the command here? remove the single quote
and why break the command here?
李衍志523370910113
commented
Oh, it should be split by spaces......I just use Oh, it should be split by spaces......I just use `string.split()` to make command.....
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {},
|
||||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "cpplint",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": true,
|
||||
"stderr": false,
|
||||
"exitstatus": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "judge-base",
|
||||
"group": "joj",
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"./driver",
|
||||
"./mumsh"
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {},
|
||||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
|
@ -156,13 +720,109 @@
|
|||
"name": "diff",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": true,
|
||||
"mem": true,
|
||||
"stdout": false,
|
||||
"stderr": false
|
||||
"stderr": true,
|
||||
"exitstatus": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "judge-msan",
|
||||
"group": "joj",
|
||||
"executor": {
|
||||
"name": "sandbox",
|
||||
"with": {
|
||||
"default": {
|
||||
"args": [
|
||||
"./driver",
|
||||
"./mumsh-msan"
|
||||
],
|
||||
"env": [
|
||||
"PATH=/usr/bin:/bin:/usr/local/bin"
|
||||
],
|
||||
"stdin": {
|
||||
"src": null,
|
||||
"content": "",
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
"max": 4194304,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stdout": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stdout",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"stderr": {
|
||||
"src": null,
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": "stderr",
|
||||
"max": 4096,
|
||||
"symlink": null,
|
||||
"streamIn": false,
|
||||
"streamOut": false,
|
||||
"pipe": false
|
||||
},
|
||||
"cpuLimit": 4000000000,
|
||||
"realCpuLimit": 0,
|
||||
"clockLimit": 8000000000,
|
||||
"memoryLimit": 4194304,
|
||||
"stackLimit": 0,
|
||||
张泊明518370910136
commented
it also uses keywords it also uses keywords
李衍志523370910113
commented
it maybe outdated here. I already fixed that before it maybe outdated here. I already fixed that before
|
||||
"procLimit": 50,
|
||||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {},
|
||||
"copyInCached": {},
|
||||
"copyInDir": ".",
|
||||
"copyOut": [],
|
||||
"copyOutCached": [],
|
||||
"copyOutMax": 0,
|
||||
"copyOutDir": "",
|
||||
"tty": false,
|
||||
"strictMemoryLimit": false,
|
||||
"dataSegmentLimit": false,
|
||||
"addressSpaceLimit": false
|
||||
},
|
||||
"cases": []
|
||||
}
|
||||
},
|
||||
"parsers": [
|
||||
{
|
||||
"name": "diff",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "dummy",
|
||||
"with": {}
|
||||
},
|
||||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": true,
|
||||
"mem": true,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -170,10 +830,10 @@
|
|||
]
|
||||
},
|
||||
"teapot": {
|
||||
"logPath": "/home/tt/.cache/joint-teapot-debug.log",
|
||||
"scoreboardPath": "scoreboard.csv",
|
||||
"failedTablePath": "failed-table.md",
|
||||
"gradingRepoName": "",
|
||||
"logPath": "Homework-1-exercise-2-joint-teapot-debug.log",
|
||||
"scoreboardPath": "Homework-1-exercise-2-scoreboard.csv",
|
||||
"failedTablePath": "Homework-1-exercise-2-failed-table.md",
|
||||
"gradingRepoName": "engr151-joj",
|
||||
"skipIssue": false,
|
||||
"skipScoreboard": false,
|
||||
"skipFailedTable": false
|
||||
|
|
|
@ -1,30 +1,119 @@
|
|||
task = "hw3 ex5"
|
||||
# general task configuration
|
||||
task="Homework 1 exercise 2" # task name
|
||||
|
||||
[release]
|
||||
deadline = "2024-10-18T23:59:00+08:00"
|
||||
release.deadline = 2024-10-12 23:59:00+08:00
|
||||
release.stages = [ "compile" ]
|
||||
|
||||
[[stages]]
|
||||
name = "judge_base"
|
||||
command = "./matlab-joj ./h3/ex5.m"
|
||||
score = 100
|
||||
parsers = ["diff", "result-detail"]
|
||||
name = "Compilation"
|
||||
command = "make.sh" # eg. script running cmake commands
|
||||
files.import = [ "tools/make.sh", "src/main.c", "src/task.h", "srcCMakelist.txt" ]
|
||||
files.export = [ "driver", "p2", "p2-msan" ]
|
||||
limit.cpu = 180 # p2 takes long to compile
|
||||
limit.stderr = 128
|
||||
|
||||
files.import = ["tools/matlab-joj", "tools/matlab_formatter.py"]
|
||||
files.export = ["output/ex5_results.txt", "output/ex5_logs.txt"]
|
||||
|
||||
result_detail.time = false
|
||||
result_detail.mem = false
|
||||
result_detail.stderr = true
|
||||
# compile parsers
|
||||
parsers = [ "result-detail", "dummy", "result-status" ]
|
||||
result-status.comment = "Congratulations! Your code compiled successfully."
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stderr = true
|
||||
result-detail.time = false
|
||||
result-detail.mem = false
|
||||
|
||||
[[stages]]
|
||||
name = "judge_base2"
|
||||
command = "./matlab-joj ./h3/ex5.m"
|
||||
score = 80
|
||||
parsers = ["diff", "result-detail"]
|
||||
name = "File length check"
|
||||
command = "./file-length 500 400 *.c *.h" # command to run
|
||||
files.import = [ "tools/file-length" ]
|
||||
|
||||
files.import = ["tools/matlab-joj", "tools/matlab_formatter.py"]
|
||||
files.export = ["output/ex5_results2.txt", "output/ex5_logs2.txt"]
|
||||
parsers = [ "keyword", "dummy", "result-detail" ]
|
||||
keyword.keyword = [ "max", "recommend"] # keywords caught by corresponding JOJ plugin
|
||||
keyword.weight = [ 50, 20 ] # weight of each keyword
|
||||
result-detail.exitstatus = false
|
||||
result-detail.stderr = true
|
||||
result-detail.time = false
|
||||
result-detail.mem = false
|
||||
|
||||
result_detail.time = true
|
||||
result_detail.mem = true
|
||||
result_detail.stderr = false
|
||||
[[stages]]
|
||||
name = "Clang-tidy checks"
|
||||
command = "run-clang-tidy-18 -header-filter=.* -quiet -load=/usr/local/lib/libcodequality.so -p build"
|
||||
limit.stdout = 65
|
||||
|
||||
parsers = [ "clangtidy", "dummy", "result-detail" ]
|
||||
clangtidy.keyword = [ "codequality-no-global-variables", "codequality-no-header-guard", "readability-function-size", "readability-duplicate-include", "readability-identifier-naming", "readability-redundant", "readability-misleading-indentation", "readability-misplaced-array-index", "cppcoreguidelines-init-variables", "bugprone-suspicious-string-compare", "google-global-names-in-headers", "clang-diagnostic", "clang-analyzer", "misc performance" ]
|
||||
clangtidy.weight = [10, 10, 50, 10, 5, 5, 10, 5, 5, 8, 5, 5, 5, 5, 8]
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stdout = true
|
||||
result-detail.time = false
|
||||
result-detail.mem = false
|
||||
|
||||
[[stages]]
|
||||
name = "Cppcheck check"
|
||||
command = "cppcheck --template='{\"file\":\"{file}\",\"line\":{line}, \"column\":{column}, \"severity\":\"{severity}\", \"message\":\"{message}\", \"id\":\"{id}\"}' --force --enable=all --quiet ./"
|
||||
limit.stderr = 65
|
||||
|
||||
parsers = [ "cppcheck", "dummy", "result-detail" ]
|
||||
cppcheck.keyword = ["error", "warning", "portability", "performance", "style"]
|
||||
cppcheck.weight = [20, 10, 15, 15, 10]
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stderr = true
|
||||
result-detail.time = false
|
||||
result-detail.mem = false
|
||||
|
||||
[[stages]]
|
||||
name = "Cpplint check"
|
||||
command = "cpplint --linelength=120 --filter=-legal,-readability/casting,-whitespace,-runtime/printf,-runtime/threadsafe_fn,-readability/todo,-build/include_subdir,-build/header_guard --recursive --exclude=build ."
|
||||
limit.stdout = 65
|
||||
|
||||
parsers = [ "cpplint", "dummy", "result-detail" ]
|
||||
cpplint.keyword = [ "runtime", "readability", "build" ]
|
||||
cpplint.weight = [ 10, 20, 15]
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stdout = true
|
||||
result-detail.time = false
|
||||
result-detail.mem = false
|
||||
|
||||
[[stages]]
|
||||
name = "judge-base"
|
||||
command="./driver ./mumsh"
|
||||
limit.cpu = 3
|
||||
limit.mem = 75
|
||||
score = 10
|
||||
|
||||
parsers = ["diff", "dummy", "result-detail"]
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stderr = true
|
||||
|
||||
case4.score = 15
|
||||
case4.limit.cpu = 30
|
||||
case4.limit.mem = 10
|
||||
case4.limit.stdout = 8
|
||||
|
||||
case5.score = 25
|
||||
|
||||
case8.limit.stderr = 128
|
||||
|
||||
[[stages]]
|
||||
name = "judge-msan"
|
||||
command="./driver ./mumsh-msan"
|
||||
limit.cpu = 10 # default cpu limit (in sec) for each test case
|
||||
limit.mem = 500 # set default mem limit (in MB) for all OJ test cases
|
||||
score = 10
|
||||
skip = ["case0", "case11"]
|
||||
|
||||
parsers = ["diff", "dummy", "result-detail"]
|
||||
dummy.comment = "\n\n### Details\n"
|
||||
result-detail.exitstatus = true
|
||||
result-detail.stderr = true
|
||||
|
||||
case4.score = 15
|
||||
case4.limit.cpu = 30
|
||||
case4.limit.mem = 10
|
||||
|
||||
case5.diff.output.ignorespaces = false
|
||||
|
||||
case6.diff.output.hide = true
|
||||
|
|
33
tests/immutable_file/.gitattributes
vendored
Normal file
33
tests/immutable_file/.gitattributes
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
*.avi filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.djvu filter=lfs diff=lfs merge=lfs -text
|
||||
*.doc filter=lfs diff=lfs merge=lfs -text
|
||||
*.docx filter=lfs diff=lfs merge=lfs -text
|
||||
*.epub filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ipynb filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
||||
*.JPEG filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||
*.JPG filter=lfs diff=lfs merge=lfs -text
|
||||
*.mkv filter=lfs diff=lfs merge=lfs -text
|
||||
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
||||
*.ods filter=lfs diff=lfs merge=lfs -text
|
||||
*.odt filter=lfs diff=lfs merge=lfs -text
|
||||
*.otf filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.PDF filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.PNG filter=lfs diff=lfs merge=lfs -text
|
||||
*.ppt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pptx filter=lfs diff=lfs merge=lfs -text
|
||||
*.ps filter=lfs diff=lfs merge=lfs -text
|
||||
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||
*.webm filter=lfs diff=lfs merge=lfs -text
|
||||
*.xls filter=lfs diff=lfs merge=lfs -text
|
||||
*.xlsx filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
23
tests/immutable_file/.gitignore
vendored
Normal file
23
tests/immutable_file/.gitignore
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
################################
|
||||
## White list based gitignore ##
|
||||
################################
|
||||
|
||||
# forbidden
|
||||
*
|
||||
.*
|
||||
|
||||
# allowed
|
||||
!.gitignore
|
||||
!.gitattributes
|
||||
!.gitea/
|
||||
!.gitea/issue_template/
|
||||
!.gitea/workflows/
|
||||
!*.yaml
|
||||
!Makefile
|
||||
!CMakeLists.txt
|
||||
!h[0-8]/
|
||||
!*.m
|
||||
!*.c
|
||||
!*.cpp
|
||||
!*.h
|
||||
!*.md
|
18
tests/immutable_file/push.yaml
Normal file
18
tests/immutable_file/push.yaml
Normal file
|
@ -0,0 +1,18 @@
|
|||
name: Run JOJ3 on Push
|
||||
on: [push]
|
||||
jobs:
|
||||
run:
|
||||
container:
|
||||
image: focs.ji.sjtu.edu.cn:5000/gitea/runner-images:focs-ubuntu-latest-slim
|
||||
volumes:
|
||||
- /home/tt/.config:/home/tt/.config
|
||||
- /home/tt/.cache:/home/tt/.cache
|
||||
- /home/tt/.ssh:/home/tt/.ssh
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: https://gitea.com/BoYanZh/checkout@focs
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: run joj3
|
||||
run: |
|
||||
sudo -E -u tt joj3 -conf-root /home/tt/.config/joj
|
20
tests/immutable_file/release.yaml
Normal file
20
tests/immutable_file/release.yaml
Normal file
|
@ -0,0 +1,20 @@
|
|||
name: Run JOJ3 on Release
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
jobs:
|
||||
run:
|
||||
container:
|
||||
image: focs.ji.sjtu.edu.cn:5000/gitea/runner-images:focs-ubuntu-latest-slim
|
||||
volumes:
|
||||
- /home/tt/.config:/home/tt/.config
|
||||
- /home/tt/.cache:/home/tt/.cache
|
||||
- /home/tt/.ssh:/home/tt/.ssh
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: https://gitea.com/BoYanZh/checkout@focs
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: run joj3
|
||||
run: |
|
||||
sudo -E -u tt joj3 -conf-root /home/tt/.config/joj -msg "feat(h1-release): joj on ${{ github.ref }}"
|
Loading…
Reference in New Issue
Block a user
?