feat: joj1 convert init
This commit is contained in:
		
							parent
							
								
									84e6f67f83
								
							
						
					
					
						commit
						80b33324e5
					
				|  | @ -1,10 +1,12 @@ | ||||||
| import json | import json | ||||||
| import os | import os | ||||||
|  | from pathlib import Path | ||||||
| from typing import Any, List | from typing import Any, List | ||||||
| 
 | 
 | ||||||
| import rtoml | import rtoml | ||||||
| 
 | 
 | ||||||
| from joj3_config_generator.models import joj1, repo, result, task | from joj3_config_generator.models import joj1, repo, result, task | ||||||
|  | from joj3_config_generator.processers.joj1 import get_joj1_run_stage | ||||||
| from joj3_config_generator.processers.repo import (  # get_teapotcheck_config, | from joj3_config_generator.processers.repo import (  # get_teapotcheck_config, | ||||||
|     get_healthcheck_config, |     get_healthcheck_config, | ||||||
|     get_teapot_stage, |     get_teapot_stage, | ||||||
|  | @ -25,14 +27,14 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config: | ||||||
|     result_conf = result.Config( |     result_conf = result.Config( | ||||||
|         name=task_conf.task.name, |         name=task_conf.task.name, | ||||||
|         # TODO: specify the exact folder difference |         # TODO: specify the exact folder difference | ||||||
|         log_path=f"/home/tt/.cache/joj3/{task_conf.task.type_}.log", |         log_path=f"{Path.home()}/.cache/joj3/{task_conf.task.type_}.log", | ||||||
|         expire_unix_timestamp=( |         expire_unix_timestamp=( | ||||||
|             int(task_conf.release.deadline.timestamp()) |             int(task_conf.release.deadline.timestamp()) | ||||||
|             if task_conf.release.deadline |             if task_conf.release.deadline | ||||||
|             else -1 |             else -1 | ||||||
|         ), |         ), | ||||||
|         # FIXME: don't hardcode |         # FIXME: don't hardcode | ||||||
|         actor_csv_path="/home/tt/.config/joj/students.csv", |         actor_csv_path=f"{Path.home()}/.config/joj/students.csv", | ||||||
|         stage=result.Stage( |         stage=result.Stage( | ||||||
|             stages=[], |             stages=[], | ||||||
|             sandbox_token=repo_conf.sandbox_token, |             sandbox_token=repo_conf.sandbox_token, | ||||||
|  | @ -59,47 +61,13 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config: | ||||||
|     return result_conf |     return result_conf | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # FIXME: LLM generated convert function, only for demostration |  | ||||||
| def convert_joj1(joj1_conf: joj1.Config) -> task.Config: | def convert_joj1(joj1_conf: joj1.Config) -> task.Config: | ||||||
|     stages = [] |     stages = [get_joj1_run_stage(joj1_conf)] | ||||||
|     for language in joj1_conf.languages: |  | ||||||
|         # Here you might want to create a stage for each language |  | ||||||
|         # You can define a command based on language properties |  | ||||||
|         command = f"run {language.language}" |  | ||||||
|         # Assuming we don't have explicit files, we will set empty ones or default behavior |  | ||||||
|         files = task.Files(import_=[], export=[])  # type: ignore |  | ||||||
|         # Score can be derived from the first case or set to a default |  | ||||||
|         score = 0 |  | ||||||
|         parsers: List[str] = []  # Define parsers if applicable |  | ||||||
|         if joj1_conf.cases: |  | ||||||
|             score = sum( |  | ||||||
|                 case.score for case in joj1_conf.cases |  | ||||||
|             )  # Sum scores for all cases |  | ||||||
|         # Creating a stage for each language |  | ||||||
|         stages.append( |  | ||||||
|             task.Stage( |  | ||||||
|                 name=language.language, |  | ||||||
|                 command=command, |  | ||||||
|                 files=files, |  | ||||||
|                 score=score, |  | ||||||
|                 parsers=parsers, |  | ||||||
|             ) |  | ||||||
|         ) |  | ||||||
|     # Assuming no deadline is provided in `joj1`, you can set it accordingly |  | ||||||
|     release_deadline = ( |  | ||||||
|         None  # Placeholder for future implementation if deadlines are defined |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
|     return task.Config( |     return task.Config( | ||||||
|         task=task.Task( |         task=task.Task( | ||||||
|             name=( |             name=("Blank Task"), | ||||||
|                 joj1_conf.languages[0].language |         ), | ||||||
|                 if joj1_conf.languages |         release=task.Release(deadline=None), | ||||||
|                 else "Unnamed Task" |  | ||||||
|             ), |  | ||||||
|             type_="", |  | ||||||
|         ),  # FIXME: fix this type later |  | ||||||
|         release=task.Release(deadline=release_deadline), |  | ||||||
|         stages=stages, |         stages=stages, | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ import os | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| from typing import Any, Dict | from typing import Any, Dict | ||||||
| 
 | 
 | ||||||
| import inquirer |  | ||||||
| import rtoml | import rtoml | ||||||
| import typer | import typer | ||||||
| import yaml | import yaml | ||||||
|  | @ -16,23 +15,6 @@ from joj3_config_generator.utils.logger import logger | ||||||
| app = typer.Typer(add_completion=False) | app = typer.Typer(add_completion=False) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @app.command() |  | ||||||
| def create(toml: typer.FileTextWrite) -> None: |  | ||||||
|     """ |  | ||||||
|     Create a new JOJ3 toml config file |  | ||||||
|     """ |  | ||||||
|     logger.info("Creating") |  | ||||||
|     questions = [ |  | ||||||
|         inquirer.List( |  | ||||||
|             "size", |  | ||||||
|             message="What size do you need?", |  | ||||||
|             choices=["Jumbo", "Large", "Standard", "Medium", "Small", "Micro"], |  | ||||||
|         ), |  | ||||||
|     ] |  | ||||||
|     answers = inquirer.prompt(questions) |  | ||||||
|     logger.info(answers) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @app.command() | @app.command() | ||||||
| def convert_joj1(yaml_file: typer.FileText, toml_file: typer.FileTextWrite) -> None: | def convert_joj1(yaml_file: typer.FileText, toml_file: typer.FileTextWrite) -> None: | ||||||
|     """ |     """ | ||||||
|  | @ -42,15 +24,22 @@ def convert_joj1(yaml_file: typer.FileText, toml_file: typer.FileTextWrite) -> N | ||||||
|     joj1_obj = yaml.safe_load(yaml_file.read()) |     joj1_obj = yaml.safe_load(yaml_file.read()) | ||||||
|     joj1_model = joj1.Config(**joj1_obj) |     joj1_model = joj1.Config(**joj1_obj) | ||||||
|     task_model = convert_joj1_conf(joj1_model) |     task_model = convert_joj1_conf(joj1_model) | ||||||
|     result_dict = task_model.model_dump(by_alias=True) |     result_dict = task_model.model_dump(by_alias=True, exclude_none=True) | ||||||
|     toml_file.write(rtoml.dumps(result_dict)) |     toml_file.write(rtoml.dumps(result_dict)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @app.command() | @app.command() | ||||||
| def convert(root: Path = Path(".")) -> Dict[str, Any]: | def convert( | ||||||
|     """ |     root: Path = typer.Option( | ||||||
|     Convert given dir of JOJ3 toml config files to JOJ3 json config files |         Path("."), | ||||||
|     """ |         "--conf-root", | ||||||
|  |         "-c", | ||||||
|  |         help="This should be consistent with the root of how you run JOJ3", | ||||||
|  |     ), | ||||||
|  |     debug: bool = typer.Option( | ||||||
|  |         False, "--debug", "-d", help="Enable debug mode for more verbose output" | ||||||
|  |     ), | ||||||
|  | ) -> Dict[str, Any]: | ||||||
|     logger.info(f"Converting files in {root.absolute()}") |     logger.info(f"Converting files in {root.absolute()}") | ||||||
|     repo_toml_path = os.path.join(root.absolute(), "basic", "repo.toml") |     repo_toml_path = os.path.join(root.absolute(), "basic", "repo.toml") | ||||||
|     # TODO: loop through all dirs to find all task.toml |     # TODO: loop through all dirs to find all task.toml | ||||||
|  | @ -69,16 +58,7 @@ def convert(root: Path = Path(".")) -> Dict[str, Any]: | ||||||
|         json.dump(result_dict, result_file, ensure_ascii=False, indent=4) |         json.dump(result_dict, result_file, ensure_ascii=False, indent=4) | ||||||
|         result_file.write("\n") |         result_file.write("\n") | ||||||
| 
 | 
 | ||||||
|     # FIXME: change the path to the server |     # distribution on json | ||||||
|     # homework_name = "h8" |     # need a get folder path function | ||||||
|     # folder_path = f"/mnt/c/Users/Nuvole/Desktop/engr151-joj/home/tt/.config/joj/tests/homework/{homework_name}" |  | ||||||
|     # folder_path = ( |  | ||||||
|     #     "/mnt/c/Users/Nuvole/Desktop/engr151-joj/home/tt/.config/joj/homework/h8" |  | ||||||
|     # ) |  | ||||||
|     # folder_path = "/mnt/c/Users/Nuvole/Desktop/engr151-joj/home/tt/.config/joj/homework/h7" |  | ||||||
|     # for projects |  | ||||||
|     # folder_path = "/mnt/c/Users/Nuvole/Desktop/engr151-joj/home/tt/.config/joj/tests/projects/p3/p3m3" |  | ||||||
|     # folder_path = "/mnt/c/Users/Nuvole/Desktop/engr151-joj/home/tt/.config/joj/projects/p3/p3m1" |  | ||||||
|     # assert os.path.exists(folder_path), f"there exists no {folder_path}" |  | ||||||
|     # distribute_json(folder_path, repo_obj) |     # distribute_json(folder_path, repo_obj) | ||||||
|     return result_dict |     return result_dict | ||||||
|  |  | ||||||
|  | @ -86,8 +86,7 @@ class Stage(BaseModel): | ||||||
|     class Config: |     class Config: | ||||||
|         extra = "allow" |         extra = "allow" | ||||||
| 
 | 
 | ||||||
|     @root_validator(pre=True) |     def gather_cases(self, values: Dict[str, Any]) -> Dict[str, Any]: | ||||||
|     def gather_cases(cls: Type["Stage"], values: Dict[str, Any]) -> Dict[str, Any]: |  | ||||||
|         cases = {k: v for k, v in values.items() if k.startswith("case")} |         cases = {k: v for k, v in values.items() if k.startswith("case")} | ||||||
|         for key in cases: |         for key in cases: | ||||||
|             values.pop(key) |             values.pop(key) | ||||||
|  | @ -108,5 +107,5 @@ class Task(BaseModel): | ||||||
| 
 | 
 | ||||||
| class Config(BaseModel): | class Config(BaseModel): | ||||||
|     task: Task |     task: Task | ||||||
|     release: Release  # Release configuration |     release: Release | ||||||
|     stages: List[Stage]  # list of stage configurations |     stages: List[Stage]  # list of stage configurations | ||||||
|  |  | ||||||
							
								
								
									
										50
									
								
								joj3_config_generator/processers/joj1.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								joj3_config_generator/processers/joj1.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | ||||||
|  | from typing import List | ||||||
|  | 
 | ||||||
|  | import humanfriendly | ||||||
|  | from pytimeparse.timeparse import timeparse | ||||||
|  | 
 | ||||||
|  | from joj3_config_generator.models import joj1, result, task | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_joj1_run_stage(joj1_config: joj1.Config) -> task.Stage: | ||||||
|  |     default_cpu = timeparse("1s") | ||||||
|  |     default_mem = humanfriendly.parse_size("32m") | ||||||
|  |     cases_conf = [] | ||||||
|  |     for i, case in enumerate(joj1_config.cases): | ||||||
|  |         cases_conf.append( | ||||||
|  |             task.Stage( | ||||||
|  |                 score=case.score, | ||||||
|  |                 command=case.execute_args if case.execute_args else None, | ||||||
|  |                 limit=task.Limit( | ||||||
|  |                     cpu=timeparse(case.time) if case.time else default_cpu, | ||||||
|  |                     mem=( | ||||||
|  |                         humanfriendly.parse_size(case.memory) | ||||||
|  |                         if case.memory | ||||||
|  |                         else default_mem | ||||||
|  |                     ), | ||||||
|  |                 ), | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |     for i, case in enumerate(joj1_config.cases): | ||||||
|  |         cases_conf[i].in_ = case.input | ||||||
|  |         cases_conf[i].out_ = case.output | ||||||
|  |     run_config = task.Stage( | ||||||
|  |         name="This is the converted joj1 run stage", | ||||||
|  |         group="joj", | ||||||
|  |         parsers=["diff", "result-status"], | ||||||
|  |         score=100, | ||||||
|  |         limit=task.Limit( | ||||||
|  |             cpu=( | ||||||
|  |                 timeparse(joj1_config.cases[0].time) | ||||||
|  |                 if joj1_config.cases[0].time is not None | ||||||
|  |                 else default_cpu | ||||||
|  |             ), | ||||||
|  |             mem=( | ||||||
|  |                 humanfriendly.parse_size(joj1_config.cases[0].memory) | ||||||
|  |                 if joj1_config.cases[0].memory is not None | ||||||
|  |                 else default_mem | ||||||
|  |             ), | ||||||
|  |         ), | ||||||
|  |         cases={f"case{i}": cases_conf[i] for i, case in enumerate(joj1_config.cases)}, | ||||||
|  |     ) | ||||||
|  |     return run_config | ||||||
|  | @ -28,7 +28,7 @@ def get_teapot_stage(repo_conf: repo.Config) -> result.StageDetail: | ||||||
|                 default=result.Cmd( |                 default=result.Cmd( | ||||||
|                     args=shlex.split(args_), |                     args=shlex.split(args_), | ||||||
|                     env=[ |                     env=[ | ||||||
|                         "LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log" |                         f"LOG_FILE_PATH={Path.home()}/.cache/joint-teapot-debug.log" | ||||||
|                     ],  # TODO: fix it according to the task name |                     ],  # TODO: fix it according to the task name | ||||||
|                 ), |                 ), | ||||||
|                 cases=[], |                 cases=[], | ||||||
|  | @ -72,7 +72,7 @@ def get_debug_args(repo_conf: repo.Config) -> str: | ||||||
|     args = "" |     args = "" | ||||||
|     args = ( |     args = ( | ||||||
|         args |         args | ||||||
|         + f"/usr/local/bin/joint-teapot joj3-check-env /home/tt/.config/teapot/teapot.env --grading-repo-name {get_grading_repo_name()} --group-config" |         + f"/usr/local/bin/joint-teapot joj3-check-env {Path.home()}/.config/teapot/teapot.env --grading-repo-name {get_grading_repo_name()} --group-config " | ||||||
|     ) |     ) | ||||||
|     group_config = "" |     group_config = "" | ||||||
|     for i, name in enumerate(repo_conf.groups.name): |     for i, name in enumerate(repo_conf.groups.name): | ||||||
|  | @ -100,14 +100,16 @@ def get_healthcheck_config(repo_conf: repo.Config) -> result.StageDetail: | ||||||
|                     ), |                     ), | ||||||
|                     result.OptionalCmd( |                     result.OptionalCmd( | ||||||
|                         args=shlex.split(get_debug_args(repo_conf)), |                         args=shlex.split(get_debug_args(repo_conf)), | ||||||
|                         env=["LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log"], |                         env=[ | ||||||
|  |                             f"LOG_FILE_PATH={Path.home()}/.cache/joint-teapot-debug.log" | ||||||
|  |                         ], | ||||||
|                     ), |                     ), | ||||||
|                 ], |                 ], | ||||||
|             ), |             ), | ||||||
|         ), |         ), | ||||||
|         parsers=[ |         parsers=[ | ||||||
|             result.ParserConfig(name="healthcheck", with_={"score": 1}), |             result.ParserConfig(name="healthcheck", with_={"score": 1}), | ||||||
|             result.ParserConfig(name="debug", with_={"score": 1}), |             result.ParserConfig(name="debug", with_={"score": 0}), | ||||||
|         ], |         ], | ||||||
|     ) |     ) | ||||||
|     return healthcheck_stage |     return healthcheck_stage | ||||||
|  | @ -126,6 +128,8 @@ def get_hash(immutable_files: list[str]) -> str:  # input should be a list | ||||||
|     current_file_path = Path(__file__).resolve() |     current_file_path = Path(__file__).resolve() | ||||||
|     project_root = current_file_path.parents[2] |     project_root = current_file_path.parents[2] | ||||||
|     file_path = f"{project_root}/tests/immutable_p3-test/" |     file_path = f"{project_root}/tests/immutable_p3-test/" | ||||||
|  |     # default value as hardcoded | ||||||
|  |     # file_path = "{Path.home()}/.cache/immutable" | ||||||
|     immutable_hash = [] |     immutable_hash = [] | ||||||
|     for i, file in enumerate(immutable_files): |     for i, file in enumerate(immutable_files): | ||||||
|         immutable_files[i] = file_path + file.rsplit("/", 1)[-1] |         immutable_files[i] = file_path + file.rsplit("/", 1)[-1] | ||||||
|  |  | ||||||
|  | @ -239,6 +239,7 @@ def fix_file( | ||||||
|     return conf_stage |     return conf_stage | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | # TODO: add the logic of looping through all the files in the conf-root and generated conf.toml accordingly, while also get the path of the json file. | ||||||
| def fix_diff( | def fix_diff( | ||||||
|     task_stage: task.Stage, conf_stage: result.StageDetail, task_conf: task.Config |     task_stage: task.Stage, conf_stage: result.StageDetail, task_conf: task.Config | ||||||
| ) -> result.StageDetail: | ) -> result.StageDetail: | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,26 +1,10 @@ | ||||||
| # general task configuration | # general task configuration | ||||||
| task.name = "hw7 ex2" # task name | task.name = "hw7 ex2" # task name | ||||||
| task.type = "homework/h7/e2" | task.type = "homework/h7/e2" # remove this task type later | ||||||
| 
 | 
 | ||||||
| release.deadline = 2024-12-30 23:59:59+08:00 | release.deadline = 2024-12-30 23:59:59+08:00 | ||||||
| release.stages = [ "compile" ] | release.stages = [ "compile" ] | ||||||
| 
 | 
 | ||||||
| [[stages]] |  | ||||||
| name = "healthcheck" |  | ||||||
| score = 1 |  | ||||||
| 
 |  | ||||||
| # healthcheck parsers |  | ||||||
| parsers = ["healthcheck", "debug"] |  | ||||||
| cases0.command = "/usr/local/bin/repo-health-checker -repoSize=100" |  | ||||||
| case1.command = """/usr/local/bin/joint-teapot |  | ||||||
|                   joj3-check-env |  | ||||||
|                   /home/tt/.config/teapot/teapot.env" |  | ||||||
|                   --grading-repo-name |  | ||||||
|                   JOJ3-actions-examples |  | ||||||
|                   --group-config |  | ||||||
|                   joj=50:24,=100:24""" |  | ||||||
| case1.env = ["LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log"] |  | ||||||
| 
 |  | ||||||
| [[stages]] | [[stages]] | ||||||
| name = "Compilation" | name = "Compilation" | ||||||
| command = "./tools/compile" # eg. script running cmake commands | command = "./tools/compile" # eg. script running cmake commands | ||||||
|  |  | ||||||
|  | @ -1,31 +1,25 @@ | ||||||
| task = "cc" |  | ||||||
| 
 |  | ||||||
| [[stages]] | [[stages]] | ||||||
| name = "cc" | name = "This is the converted joj1 run stage" | ||||||
| command = "run cc" | group = "joj" | ||||||
| score = 100 | score = 100 | ||||||
| parsers = [] | parsers = ["diff", "result-status"] | ||||||
| skip = [] | skip = [] | ||||||
| 
 | 
 | ||||||
| [stages.files] |  | ||||||
| import = [] |  | ||||||
| export = [] |  | ||||||
| 
 |  | ||||||
| [stages.limit] | [stages.limit] | ||||||
| mem = 4 | mem = 32000000 | ||||||
| cpu = 4 | cpu = 1 | ||||||
| stderr = 4 | stderr = 800 | ||||||
| stdout = 4 | stdout = 800 | ||||||
| 
 | 
 | ||||||
| [stages.dummy] | [stages.dummy] | ||||||
| comment = "" | comment = "" | ||||||
| score = 0 | score = 0 | ||||||
| forcequit = true | forcequit = false | ||||||
| 
 | 
 | ||||||
| [stages.result-status] | [stages.result-status] | ||||||
| comment = "" | comment = "" | ||||||
| score = 0 | score = 0 | ||||||
| forcequit = true | forcequit = false | ||||||
| 
 | 
 | ||||||
| [stages.keyword] | [stages.keyword] | ||||||
| keyword = [] | keyword = [] | ||||||
|  | @ -49,70 +43,566 @@ mem = true | ||||||
| stdout = false | stdout = false | ||||||
| stderr = false | stderr = false | ||||||
| exitstatus = false | exitstatus = false | ||||||
| [stages.diff.output] |  | ||||||
| score = 0 |  | ||||||
| ignorespaces = false |  | ||||||
| hide = false |  | ||||||
| forcequit = true |  | ||||||
| 
 | 
 | ||||||
| [stages.cases] | [stages.file] | ||||||
| 
 | [stages.cases.case0] | ||||||
| [[stages]] | command = "-abcd --aaaa bbbb" | ||||||
| name = "c" | in = "case0.in" | ||||||
| command = "run c" | out = "case0.out" | ||||||
| score = 100 | score = 10 | ||||||
| parsers = [] | parsers = [] | ||||||
| skip = [] | skip = [] | ||||||
| 
 | 
 | ||||||
| [stages.files] | [stages.cases.case0.limit] | ||||||
| import = [] | mem = 32000000 | ||||||
| export = [] | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
| 
 | 
 | ||||||
| [stages.limit] | [stages.cases.case0.dummy] | ||||||
| mem = 4 |  | ||||||
| cpu = 4 |  | ||||||
| stderr = 4 |  | ||||||
| stdout = 4 |  | ||||||
| 
 |  | ||||||
| [stages.dummy] |  | ||||||
| comment = "" | comment = "" | ||||||
| score = 0 | score = 0 | ||||||
| forcequit = true | forcequit = false | ||||||
| 
 | 
 | ||||||
| [stages.result-status] | [stages.cases.case0.result-status] | ||||||
| comment = "" | comment = "" | ||||||
| score = 0 | score = 0 | ||||||
| forcequit = true | forcequit = false | ||||||
| 
 | 
 | ||||||
| [stages.keyword] | [stages.cases.case0.keyword] | ||||||
| keyword = [] | keyword = [] | ||||||
| weight = [] | weight = [] | ||||||
| 
 | 
 | ||||||
| [stages.clangtidy] | [stages.cases.case0.clangtidy] | ||||||
| keyword = [] | keyword = [] | ||||||
| weight = [] | weight = [] | ||||||
| 
 | 
 | ||||||
| [stages.cppcheck] | [stages.cases.case0.cppcheck] | ||||||
| keyword = [] | keyword = [] | ||||||
| weight = [] | weight = [] | ||||||
| 
 | 
 | ||||||
| [stages.cpplint] | [stages.cases.case0.cpplint] | ||||||
| keyword = [] | keyword = [] | ||||||
| weight = [] | weight = [] | ||||||
| 
 | 
 | ||||||
| [stages.result-detail] | [stages.cases.case0.result-detail] | ||||||
| time = true | time = true | ||||||
| mem = true | mem = true | ||||||
| stdout = false | stdout = false | ||||||
| stderr = false | stderr = false | ||||||
| exitstatus = false | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case0.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case0.cases] | ||||||
|  | [stages.cases.case0.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1] | ||||||
|  | in = "case1.in" | ||||||
|  | out = "case1.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case1.cases] | ||||||
|  | [stages.cases.case1.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2] | ||||||
|  | in = "case2.in" | ||||||
|  | out = "case2.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case2.cases] | ||||||
|  | [stages.cases.case2.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3] | ||||||
|  | in = "case3.in" | ||||||
|  | out = "case3.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case3.cases] | ||||||
|  | [stages.cases.case3.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4] | ||||||
|  | in = "case4.in" | ||||||
|  | out = "case4.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case4.cases] | ||||||
|  | [stages.cases.case4.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5] | ||||||
|  | in = "case5.in" | ||||||
|  | out = "case5.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case5.cases] | ||||||
|  | [stages.cases.case5.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6] | ||||||
|  | in = "case6.in" | ||||||
|  | out = "case6.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case6.cases] | ||||||
|  | [stages.cases.case6.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7] | ||||||
|  | in = "case7.in" | ||||||
|  | out = "case7.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case7.cases] | ||||||
|  | [stages.cases.case7.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8] | ||||||
|  | in = "case8.in" | ||||||
|  | out = "case8.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case8.cases] | ||||||
|  | [stages.cases.case8.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9] | ||||||
|  | in = "case9.in" | ||||||
|  | out = "case9.out" | ||||||
|  | score = 10 | ||||||
|  | parsers = [] | ||||||
|  | skip = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.limit] | ||||||
|  | mem = 32000000 | ||||||
|  | cpu = 1 | ||||||
|  | stderr = 800 | ||||||
|  | stdout = 800 | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.dummy] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.result-status] | ||||||
|  | comment = "" | ||||||
|  | score = 0 | ||||||
|  | forcequit = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.keyword] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.clangtidy] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.cppcheck] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.cpplint] | ||||||
|  | keyword = [] | ||||||
|  | weight = [] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.result-detail] | ||||||
|  | time = true | ||||||
|  | mem = true | ||||||
|  | stdout = false | ||||||
|  | stderr = false | ||||||
|  | exitstatus = false | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.file] | ||||||
|  | 
 | ||||||
|  | [stages.cases.case9.cases] | ||||||
|  | [stages.cases.case9.diff.output] | ||||||
|  | score = 0 | ||||||
|  | ignorespaces = true | ||||||
|  | hide = false | ||||||
|  | forcequit = false | ||||||
| [stages.diff.output] | [stages.diff.output] | ||||||
| score = 0 | score = 0 | ||||||
| ignorespaces = false | ignorespaces = true | ||||||
| hide = false | hide = false | ||||||
| forcequit = true | forcequit = false | ||||||
| 
 | 
 | ||||||
| [stages.cases] | [task] | ||||||
|  | type = "" | ||||||
|  | name = "Blank Task" | ||||||
| 
 | 
 | ||||||
| [release] | [release] | ||||||
| deadline = "null" |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user