rbx.cp 0.5.71__tar.gz → 0.5.73__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/PKG-INFO +1 -1
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/pyproject.toml +1 -1
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/cli.py +15 -8
- rbx_cp-0.5.73/rbx/box/contest/contest_utils.py +36 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/main.py +24 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/download.py +19 -1
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_explorer.py +1 -1
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/checker.sh +1 -1
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/c +47 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cc +47 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/cpp +48 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/java +47 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/kt +47 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py2 +47 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactive/py3 +49 -20
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/c +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cc +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/cpp +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/java +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/kt +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py2 +2 -2
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/py3 +2 -2
- rbx_cp-0.5.71/rbx/box/contest/contest_utils.py +0 -11
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/LICENSE +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/README.md +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/annotations.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/autoenum.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/builder.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/cd.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/checkers.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/code.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/compile.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/conftest.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/build_contest_statements.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/contest_package.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/contest/statements.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/creation.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/deferred.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/dump_schemas.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/environment.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/extensions.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/formatting.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/generators.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/generators_test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/git_utils.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/header.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/lazy_importing_main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/lazy_importing_test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/naming.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/package.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/extension.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/packager.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/boca/upload.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/contest_main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/moj/packager.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/packager.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/packager.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/polygon_api.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/upload.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/packaging/polygon/xml_schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/fetch.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/lock_schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/presets/schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/remote.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/retries.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/sanitizers/warning_stack.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/setter_config.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/solutions.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/solutions_test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/state.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/build_statements.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/builders.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/joiners.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/latex.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/latex_jinja.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/statements/schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stresses.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/finder_parser.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/stressing/generator_parser.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/tasks.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcase_extractors.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcase_utils.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcases/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/testcases/main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/captured_log.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/css/app.tcss +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/build.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/command.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/differ.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/error.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/rich_log_modal.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/run_test_explorer.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/selector.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/screens/test_explorer.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/utils/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/utils/run_ui.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/diff_box.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/file_log.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/interaction_box.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/rich_log_box.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/test_output_box.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/ui/widgets/two_sided_test_output_box.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/unit.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/validators.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/box/validators_test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/checker.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/clone.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/config.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/conftest.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/console.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/create.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/edit.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/caching.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/conftest.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/cacher.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/digester.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandbox.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/isolate.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/stupid_sandbox.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/sandboxes/timeit.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/storage.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/judge/testiso.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/limits.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/processing_context.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading/steps_with_caching_run_test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/grading_utils.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/hydration.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/main.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/metadata.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/codeforces.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/providers/provider.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/checkers/boilerplate.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/checkers/noop.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_config.json +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.mac.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/default_setter_config.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/envs/default.rbx.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/envs/isolate.rbx.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compare.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/c +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cc +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/java +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/kt +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/pas +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py2 +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/compile/py3 +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/interactor_compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/boca/run/bkp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/c/run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/compare.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/cpp/run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/interactor_run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/java/run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py2/run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/compile.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/prep.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/packagers/moj/scripts/py3/run.sh +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/contest.rbx.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/contest.rbx.tex +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/olymp.sty +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/contest/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/preset.rbx.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/.gitignore +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/gen.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/problem.rbx.yml +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/random.txt +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/main.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/slow.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/sols/wa.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/olymp.sty +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/projecao.png +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/statement.rbx.tex +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/statement/template.rbx.tex +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/000.in +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/tests/samples/001.in +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/validator.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/presets/default/problem/wcmp.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/templates/rbx.h +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/resources/templates/template.cpp +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/run.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/schema.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submit.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/__init__.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/codeforces.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/submitors/submitor.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/test.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testcase.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testcase_rendering.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/testing_utils.py +0 -0
- {rbx_cp-0.5.71 → rbx_cp-0.5.73}/rbx/utils.py +0 -0
@@ -60,7 +60,7 @@ app.add_typer(
|
|
60
60
|
)
|
61
61
|
app.add_typer(
|
62
62
|
download.app,
|
63
|
-
name='download',
|
63
|
+
name='download, down',
|
64
64
|
cls=annotations.AliasGroup,
|
65
65
|
help='Download an asset from supported repositories (sub-command).',
|
66
66
|
rich_help_panel='Management',
|
@@ -104,12 +104,10 @@ def main(
|
|
104
104
|
help='Whether to compile and run testlib components with sanitizers enabled. '
|
105
105
|
'If you want to run the solutions with sanitizers enabled, use the "-s" flag in the corresponding run command.',
|
106
106
|
),
|
107
|
-
|
108
|
-
|
109
|
-
'--
|
110
|
-
'
|
111
|
-
'-d',
|
112
|
-
help='Whether to save extra debug logs along with the evaluation results.',
|
107
|
+
capture: bool = typer.Option(
|
108
|
+
True,
|
109
|
+
'--capture',
|
110
|
+
help='Whether to save extra logs and outputs from interactive solutions.',
|
113
111
|
),
|
114
112
|
):
|
115
113
|
if cd.is_problem_package() and not package.is_cache_valid():
|
@@ -125,7 +123,7 @@ def main(
|
|
125
123
|
'[warning]Sanitizers are running just for testlib components.\n'
|
126
124
|
'If you want to run the solutions with sanitizers enabled, use the [item]-s[/item] flag in the corresponding run command.[/warning]'
|
127
125
|
)
|
128
|
-
state.STATE.debug_logs =
|
126
|
+
state.STATE.debug_logs = capture
|
129
127
|
|
130
128
|
|
131
129
|
@app.command('ui', hidden=True)
|
@@ -136,6 +134,15 @@ def ui():
|
|
136
134
|
ui_pkg.start()
|
137
135
|
|
138
136
|
|
137
|
+
@app.command(
|
138
|
+
'on',
|
139
|
+
help='Run a command in the context of a problem (or a set of problems) of a contest.',
|
140
|
+
context_settings={'allow_extra_args': True, 'ignore_unknown_options': True},
|
141
|
+
)
|
142
|
+
def on(ctx: typer.Context, problems: str) -> None:
|
143
|
+
contest.on(ctx, problems)
|
144
|
+
|
145
|
+
|
139
146
|
@app.command('diff', hidden=True)
|
140
147
|
def diff(path1: pathlib.Path, path2: pathlib.Path):
|
141
148
|
from rbx.box.ui import main as ui_pkg
|
@@ -0,0 +1,36 @@
|
|
1
|
+
from typing import List
|
2
|
+
|
3
|
+
from rbx.box import environment, package
|
4
|
+
from rbx.box.contest import contest_package
|
5
|
+
from rbx.box.contest.schema import ContestProblem
|
6
|
+
|
7
|
+
|
8
|
+
def match_problem(problems: str, contest_problem: ContestProblem) -> bool:
|
9
|
+
short_name = contest_problem.short_name.lower()
|
10
|
+
problems = problems.lower()
|
11
|
+
if problems == '*':
|
12
|
+
return True
|
13
|
+
if '-' in problems:
|
14
|
+
start, end = problems.split('-')
|
15
|
+
return start <= short_name <= end
|
16
|
+
problem_set = set(p.strip().lower() for p in problems.split(','))
|
17
|
+
return short_name in problem_set
|
18
|
+
|
19
|
+
|
20
|
+
def get_problems_of_interest(problems: str) -> List[ContestProblem]:
|
21
|
+
contest = contest_package.find_contest_package_or_die()
|
22
|
+
problems_of_interest = []
|
23
|
+
|
24
|
+
for p in contest.problems:
|
25
|
+
if match_problem(problems, p):
|
26
|
+
problems_of_interest.append(p)
|
27
|
+
return problems_of_interest
|
28
|
+
|
29
|
+
|
30
|
+
def clear_all_caches():
|
31
|
+
pkgs = [package, environment, contest_package]
|
32
|
+
|
33
|
+
for pkg in pkgs:
|
34
|
+
for fn in pkg.__dict__.values():
|
35
|
+
if hasattr(fn, 'cache_clear'):
|
36
|
+
fn.cache_clear()
|
@@ -232,3 +232,27 @@ def each(ctx: typer.Context) -> None:
|
|
232
232
|
console.console.print(
|
233
233
|
'[error]One of the commands above failed. Check the output![/error]'
|
234
234
|
)
|
235
|
+
|
236
|
+
|
237
|
+
@app.command(
|
238
|
+
'on',
|
239
|
+
help='Run a command in the problem (or in a set of problems) of a context.',
|
240
|
+
context_settings={'allow_extra_args': True, 'ignore_unknown_options': True},
|
241
|
+
)
|
242
|
+
@within_contest
|
243
|
+
def on(ctx: typer.Context, problems: str) -> None:
|
244
|
+
command = ' '.join(['rbx'] + ctx.args)
|
245
|
+
problems_of_interest = contest_utils.get_problems_of_interest(problems)
|
246
|
+
|
247
|
+
if not problems_of_interest:
|
248
|
+
console.console.print(
|
249
|
+
f'[error]No problems found in contest matching [item]{problems}[/item].[/error]'
|
250
|
+
)
|
251
|
+
raise typer.Exit(1)
|
252
|
+
|
253
|
+
for p in problems_of_interest:
|
254
|
+
console.console.print(
|
255
|
+
f'[status]Running [item]{command}[/item] for [item]{p.short_name}[/item]...[/status]'
|
256
|
+
)
|
257
|
+
subprocess.call(command, cwd=p.get_path(), shell=True)
|
258
|
+
console.console.print()
|
@@ -5,7 +5,7 @@ from typing import Optional
|
|
5
5
|
import typer
|
6
6
|
|
7
7
|
from rbx import annotations, console
|
8
|
-
from rbx.box import header, package
|
8
|
+
from rbx.box import header, package, remote
|
9
9
|
from rbx.box.schema import CodeItem
|
10
10
|
from rbx.config import get_builtin_checker, get_jngen, get_testlib
|
11
11
|
from rbx.grading import steps
|
@@ -72,3 +72,21 @@ def checker(name: str):
|
|
72
72
|
console.console.print(
|
73
73
|
f'[success]Downloaded [item]{name}[/item] into current package.[/success]'
|
74
74
|
)
|
75
|
+
|
76
|
+
|
77
|
+
@app.command('remote, r', help='Download a remote code.')
|
78
|
+
@package.within_problem
|
79
|
+
def remote_cmd(
|
80
|
+
name: str,
|
81
|
+
output: Optional[str] = typer.Option(
|
82
|
+
None,
|
83
|
+
'-o',
|
84
|
+
'--output',
|
85
|
+
help='Whether to not build outputs for tests and run checker.',
|
86
|
+
),
|
87
|
+
):
|
88
|
+
path = remote.expand_file(name)
|
89
|
+
|
90
|
+
if output is not None:
|
91
|
+
pathlib.Path(output).parent.mkdir(parents=True, exist_ok=True)
|
92
|
+
shutil.copy(str(path), output)
|
@@ -46,7 +46,7 @@ class RunExplorerScreen(Screen):
|
|
46
46
|
if pkg.type == TaskType.COMMUNICATION:
|
47
47
|
tips.display = True
|
48
48
|
tips.write(
|
49
|
-
'This is an interactive problem.\nYou can use the [bold blue]rbx
|
49
|
+
'This is an interactive problem.\nYou can use the [bold blue]rbx --capture run[/bold blue] command to capture the interaction between the processes and see them here.'
|
50
50
|
)
|
51
51
|
yield tips
|
52
52
|
|
@@ -26,7 +26,7 @@ printf "%s" "${TestlibContent}" >testlib.h
|
|
26
26
|
printf "%s" "${RbxHeaderContent}" >rbx.h
|
27
27
|
printf "%s" "${CheckerContent}" >$CHECKER_PATH
|
28
28
|
|
29
|
-
checker_hash=($(
|
29
|
+
checker_hash=($(cat $CHECKER_PATH rbx.h testlib.h | md5sum))
|
30
30
|
checker_cache="/tmp/boca-chk-${checker_hash}"
|
31
31
|
|
32
32
|
echo "Polygon checker hash: $checker_hash"
|
@@ -81,10 +81,10 @@ fi
|
|
81
81
|
|
82
82
|
time=$3
|
83
83
|
if [ "$time" -gt "0" ]; then
|
84
|
-
let "ttime = $time
|
84
|
+
let "ttime = $time * 4"
|
85
85
|
else
|
86
86
|
time=1
|
87
|
-
ttime=
|
87
|
+
ttime=4
|
88
88
|
fi
|
89
89
|
|
90
90
|
nruns=1
|
@@ -132,38 +132,65 @@ SFPID=\$!
|
|
132
132
|
./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
|
133
133
|
INTPID=\$!
|
134
134
|
|
135
|
-
|
136
|
-
ECSF
|
135
|
+
ECINT=0
|
136
|
+
ECSF=0
|
137
137
|
|
138
|
-
wait \$INTPID
|
139
|
-
|
138
|
+
wait -p EXITID -n \$SFPID \$INTPID
|
139
|
+
ECEXIT=\$?
|
140
|
+
if [[ \$ECEXIT -ne 0 ]]; then
|
141
|
+
kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
|
142
|
+
fi
|
143
|
+
|
144
|
+
EXITFIRST=none
|
145
|
+
if [[ \$EXITID -eq \$INTPID ]]; then
|
146
|
+
wait \$SFPID
|
147
|
+
ECSF=\$?
|
148
|
+
ECINT=\$ECEXIT
|
149
|
+
EXITFIRST=interactor
|
150
|
+
else
|
151
|
+
wait \$INTPID
|
152
|
+
ECINT=\$?
|
153
|
+
ECSF=\$ECEXIT
|
154
|
+
EXITFIRST=solution
|
155
|
+
fi
|
140
156
|
|
141
157
|
rm -rf fifo.in fifo.out
|
142
158
|
|
143
159
|
echo "Ran solution as \$@" &>>stderr0
|
144
160
|
echo "interactor exitcode \$ECINT" &>>stderr0
|
145
161
|
echo "solution exitcode \$ECSF" &>>stderr0
|
162
|
+
echo "exit first \$EXITFIRST" &>>stderr0
|
163
|
+
|
164
|
+
finish() {
|
165
|
+
echo "exitting from runit.sh with exit code \$1" &>>stderr0
|
166
|
+
exit \$1
|
167
|
+
}
|
168
|
+
|
169
|
+
# 1. Check for interactor errors.
|
170
|
+
if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
171
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
172
|
+
echo "testlib exitcode \$ECINT" >stdout0
|
173
|
+
finish 0
|
174
|
+
elif [[ \$ECINT -ne 0 ]]; then
|
175
|
+
finish 9
|
176
|
+
fi
|
177
|
+
fi
|
146
178
|
|
147
|
-
|
148
|
-
if [[ \$ECSF -
|
149
|
-
|
150
|
-
elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
151
|
-
echo "Found EOF RTE" &>>stderr0
|
152
|
-
RTE=1
|
179
|
+
# 2. Check for solution errors.
|
180
|
+
if [[ \$ECSF -ne 0 ]]; then
|
181
|
+
finish \$ECSF
|
153
182
|
fi
|
154
183
|
|
155
|
-
|
156
|
-
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]
|
184
|
+
# 3. Check for interactor without looking at solution output.
|
185
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
157
186
|
echo "testlib exitcode \$ECINT" >stdout0
|
158
|
-
|
159
|
-
elif [[ \$ECSF -ne 0 ]]; then
|
160
|
-
ret=\$ECSF
|
187
|
+
finish 0
|
161
188
|
elif [[ \$ECINT -ne 0 ]]; then
|
162
|
-
|
189
|
+
finish 9
|
163
190
|
fi
|
164
191
|
|
165
|
-
|
166
|
-
|
192
|
+
# 4. Finish with zero and later check output.
|
193
|
+
finish 0
|
167
194
|
EOF
|
168
195
|
|
169
196
|
chmod 755 runit.sh
|
@@ -81,10 +81,10 @@ fi
|
|
81
81
|
|
82
82
|
time=$3
|
83
83
|
if [ "$time" -gt "0" ]; then
|
84
|
-
let "ttime = $time
|
84
|
+
let "ttime = $time * 4"
|
85
85
|
else
|
86
86
|
time=1
|
87
|
-
ttime=
|
87
|
+
ttime=4
|
88
88
|
fi
|
89
89
|
|
90
90
|
nruns=1
|
@@ -132,38 +132,65 @@ SFPID=\$!
|
|
132
132
|
./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
|
133
133
|
INTPID=\$!
|
134
134
|
|
135
|
-
|
136
|
-
ECSF
|
135
|
+
ECINT=0
|
136
|
+
ECSF=0
|
137
137
|
|
138
|
-
wait \$INTPID
|
139
|
-
|
138
|
+
wait -p EXITID -n \$SFPID \$INTPID
|
139
|
+
ECEXIT=\$?
|
140
|
+
if [[ \$ECEXIT -ne 0 ]]; then
|
141
|
+
kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
|
142
|
+
fi
|
143
|
+
|
144
|
+
EXITFIRST=none
|
145
|
+
if [[ \$EXITID -eq \$INTPID ]]; then
|
146
|
+
wait \$SFPID
|
147
|
+
ECSF=\$?
|
148
|
+
ECINT=\$ECEXIT
|
149
|
+
EXITFIRST=interactor
|
150
|
+
else
|
151
|
+
wait \$INTPID
|
152
|
+
ECINT=\$?
|
153
|
+
ECSF=\$ECEXIT
|
154
|
+
EXITFIRST=solution
|
155
|
+
fi
|
140
156
|
|
141
157
|
rm -rf fifo.in fifo.out
|
142
158
|
|
143
159
|
echo "Ran solution as \$@" &>>stderr0
|
144
160
|
echo "interactor exitcode \$ECINT" &>>stderr0
|
145
161
|
echo "solution exitcode \$ECSF" &>>stderr0
|
162
|
+
echo "exit first \$EXITFIRST" &>>stderr0
|
163
|
+
|
164
|
+
finish() {
|
165
|
+
echo "exitting from runit.sh with exit code \$1" &>>stderr0
|
166
|
+
exit \$1
|
167
|
+
}
|
168
|
+
|
169
|
+
# 1. Check for interactor errors.
|
170
|
+
if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
171
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
172
|
+
echo "testlib exitcode \$ECINT" >stdout0
|
173
|
+
finish 0
|
174
|
+
elif [[ \$ECINT -ne 0 ]]; then
|
175
|
+
finish 9
|
176
|
+
fi
|
177
|
+
fi
|
146
178
|
|
147
|
-
|
148
|
-
if [[ \$ECSF -
|
149
|
-
|
150
|
-
elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
151
|
-
echo "Found EOF RTE" &>>stderr0
|
152
|
-
RTE=1
|
179
|
+
# 2. Check for solution errors.
|
180
|
+
if [[ \$ECSF -ne 0 ]]; then
|
181
|
+
finish \$ECSF
|
153
182
|
fi
|
154
183
|
|
155
|
-
|
156
|
-
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]
|
184
|
+
# 3. Check for interactor without looking at solution output.
|
185
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
157
186
|
echo "testlib exitcode \$ECINT" >stdout0
|
158
|
-
|
159
|
-
elif [[ \$ECSF -ne 0 ]]; then
|
160
|
-
ret=\$ECSF
|
187
|
+
finish 0
|
161
188
|
elif [[ \$ECINT -ne 0 ]]; then
|
162
|
-
|
189
|
+
finish 9
|
163
190
|
fi
|
164
191
|
|
165
|
-
|
166
|
-
|
192
|
+
# 4. Finish with zero and later check output.
|
193
|
+
finish 0
|
167
194
|
EOF
|
168
195
|
|
169
196
|
chmod 755 runit.sh
|
@@ -81,10 +81,10 @@ fi
|
|
81
81
|
|
82
82
|
time=$3
|
83
83
|
if [ "$time" -gt "0" ]; then
|
84
|
-
let "ttime = $time
|
84
|
+
let "ttime = $time * 4"
|
85
85
|
else
|
86
86
|
time=1
|
87
|
-
ttime=
|
87
|
+
ttime=4
|
88
88
|
fi
|
89
89
|
|
90
90
|
nruns=1
|
@@ -132,37 +132,65 @@ SFPID=\$!
|
|
132
132
|
./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
|
133
133
|
INTPID=\$!
|
134
134
|
|
135
|
-
|
136
|
-
ECSF
|
135
|
+
ECINT=0
|
136
|
+
ECSF=0
|
137
137
|
|
138
|
-
wait \$INTPID
|
139
|
-
|
138
|
+
wait -p EXITID -n \$SFPID \$INTPID
|
139
|
+
ECEXIT=\$?
|
140
|
+
if [[ \$ECEXIT -ne 0 ]]; then
|
141
|
+
kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
|
142
|
+
fi
|
143
|
+
|
144
|
+
EXITFIRST=none
|
145
|
+
if [[ \$EXITID -eq \$INTPID ]]; then
|
146
|
+
wait \$SFPID
|
147
|
+
ECSF=\$?
|
148
|
+
ECINT=\$ECEXIT
|
149
|
+
EXITFIRST=interactor
|
150
|
+
else
|
151
|
+
wait \$INTPID
|
152
|
+
ECINT=\$?
|
153
|
+
ECSF=\$ECEXIT
|
154
|
+
EXITFIRST=solution
|
155
|
+
fi
|
140
156
|
|
141
157
|
rm -rf fifo.in fifo.out
|
142
158
|
|
143
159
|
echo "Ran solution as \$@" &>>stderr0
|
144
160
|
echo "interactor exitcode \$ECINT" &>>stderr0
|
145
161
|
echo "solution exitcode \$ECSF" &>>stderr0
|
162
|
+
echo "exit first \$EXITFIRST" &>>stderr0
|
163
|
+
|
164
|
+
finish() {
|
165
|
+
echo "exitting from runit.sh with exit code \$1" &>>stderr0
|
166
|
+
exit \$1
|
167
|
+
}
|
168
|
+
|
169
|
+
# 1. Check for interactor errors.
|
170
|
+
if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
171
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
172
|
+
echo "testlib exitcode \$ECINT" >stdout0
|
173
|
+
finish 0
|
174
|
+
elif [[ \$ECINT -ne 0 ]]; then
|
175
|
+
finish 9
|
176
|
+
fi
|
177
|
+
fi
|
146
178
|
|
147
|
-
|
148
|
-
if [[ \$ECSF -
|
149
|
-
|
150
|
-
elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
151
|
-
echo "Found EOF RTE" &>>stderr0
|
152
|
-
RTE=1
|
179
|
+
# 2. Check for solution errors.
|
180
|
+
if [[ \$ECSF -ne 0 ]]; then
|
181
|
+
finish \$ECSF
|
153
182
|
fi
|
154
|
-
|
155
|
-
|
183
|
+
|
184
|
+
# 3. Check for interactor without looking at solution output.
|
185
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
156
186
|
echo "testlib exitcode \$ECINT" >stdout0
|
157
|
-
|
158
|
-
elif [[ \$ECSF -ne 0 ]]; then
|
159
|
-
ret=\$ECSF
|
187
|
+
finish 0
|
160
188
|
elif [[ \$ECINT -ne 0 ]]; then
|
161
|
-
|
189
|
+
finish 9
|
162
190
|
fi
|
163
191
|
|
164
|
-
|
165
|
-
|
192
|
+
# 4. Finish with zero and later check output.
|
193
|
+
finish 0
|
166
194
|
EOF
|
167
195
|
|
168
196
|
chmod 755 runit.sh
|
@@ -99,10 +99,10 @@ fi
|
|
99
99
|
|
100
100
|
time=$3
|
101
101
|
if [ "$time" -gt "0" ]; then
|
102
|
-
let "ttime = $time
|
102
|
+
let "ttime = $time * 4"
|
103
103
|
else
|
104
104
|
time=1
|
105
|
-
ttime=
|
105
|
+
ttime=4
|
106
106
|
fi
|
107
107
|
|
108
108
|
nruns=1
|
@@ -145,38 +145,65 @@ SFPID=\$!
|
|
145
145
|
./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
|
146
146
|
INTPID=\$!
|
147
147
|
|
148
|
-
|
149
|
-
ECSF
|
148
|
+
ECINT=0
|
149
|
+
ECSF=0
|
150
150
|
|
151
|
-
wait \$INTPID
|
152
|
-
|
151
|
+
wait -p EXITID -n \$SFPID \$INTPID
|
152
|
+
ECEXIT=\$?
|
153
|
+
if [[ \$ECEXIT -ne 0 ]]; then
|
154
|
+
kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
|
155
|
+
fi
|
156
|
+
|
157
|
+
EXITFIRST=none
|
158
|
+
if [[ \$EXITID -eq \$INTPID ]]; then
|
159
|
+
wait \$SFPID
|
160
|
+
ECSF=\$?
|
161
|
+
ECINT=\$ECEXIT
|
162
|
+
EXITFIRST=interactor
|
163
|
+
else
|
164
|
+
wait \$INTPID
|
165
|
+
ECINT=\$?
|
166
|
+
ECSF=\$ECEXIT
|
167
|
+
EXITFIRST=solution
|
168
|
+
fi
|
153
169
|
|
154
170
|
rm -rf fifo.in fifo.out
|
155
171
|
|
156
172
|
echo "Ran solution as \$@" &>>stderr0
|
157
173
|
echo "interactor exitcode \$ECINT" &>>stderr0
|
158
174
|
echo "solution exitcode \$ECSF" &>>stderr0
|
175
|
+
echo "exit first \$EXITFIRST" &>>stderr0
|
176
|
+
|
177
|
+
finish() {
|
178
|
+
echo "exitting from runit.sh with exit code \$1" &>>stderr0
|
179
|
+
exit \$1
|
180
|
+
}
|
159
181
|
|
160
|
-
|
161
|
-
if [[ \$ECSF -eq -
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
182
|
+
# 1. Check for interactor errors.
|
183
|
+
if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
184
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
185
|
+
echo "testlib exitcode \$ECINT" >stdout0
|
186
|
+
finish 0
|
187
|
+
elif [[ \$ECINT -ne 0 ]]; then
|
188
|
+
finish 9
|
189
|
+
fi
|
166
190
|
fi
|
167
191
|
|
168
|
-
|
169
|
-
if [[ \$
|
192
|
+
# 2. Check for solution errors.
|
193
|
+
if [[ \$ECSF -ne 0 ]]; then
|
194
|
+
finish \$ECSF
|
195
|
+
fi
|
196
|
+
|
197
|
+
# 3. Check for interactor without looking at solution output.
|
198
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
170
199
|
echo "testlib exitcode \$ECINT" >stdout0
|
171
|
-
|
172
|
-
elif [[ \$ECSF -ne 0 ]]; then
|
173
|
-
ret=\$ECSF
|
200
|
+
finish 0
|
174
201
|
elif [[ \$ECINT -ne 0 ]]; then
|
175
|
-
|
202
|
+
finish 9
|
176
203
|
fi
|
177
204
|
|
178
|
-
|
179
|
-
|
205
|
+
# 4. Finish with zero and later check output.
|
206
|
+
finish 0
|
180
207
|
EOF
|
181
208
|
|
182
209
|
chmod 755 runit.sh
|
@@ -91,10 +91,10 @@ fi
|
|
91
91
|
|
92
92
|
time=$3
|
93
93
|
if [ "$time" -gt "0" ]; then
|
94
|
-
let "ttime = $time
|
94
|
+
let "ttime = $time * 4"
|
95
95
|
else
|
96
96
|
time=1
|
97
|
-
ttime=
|
97
|
+
ttime=4
|
98
98
|
fi
|
99
99
|
|
100
100
|
nruns=1
|
@@ -136,38 +136,65 @@ SFPID=\$!
|
|
136
136
|
./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
|
137
137
|
INTPID=\$!
|
138
138
|
|
139
|
-
|
140
|
-
ECSF
|
139
|
+
ECINT=0
|
140
|
+
ECSF=0
|
141
141
|
|
142
|
-
wait \$INTPID
|
143
|
-
|
142
|
+
wait -p EXITID -n \$SFPID \$INTPID
|
143
|
+
ECEXIT=\$?
|
144
|
+
if [[ \$ECEXIT -ne 0 ]]; then
|
145
|
+
kill -SIGTERM \$SFPID \$INTPID 2>/dev/null
|
146
|
+
fi
|
147
|
+
|
148
|
+
EXITFIRST=none
|
149
|
+
if [[ \$EXITID -eq \$INTPID ]]; then
|
150
|
+
wait \$SFPID
|
151
|
+
ECSF=\$?
|
152
|
+
ECINT=\$ECEXIT
|
153
|
+
EXITFIRST=interactor
|
154
|
+
else
|
155
|
+
wait \$INTPID
|
156
|
+
ECINT=\$?
|
157
|
+
ECSF=\$ECEXIT
|
158
|
+
EXITFIRST=solution
|
159
|
+
fi
|
144
160
|
|
145
161
|
rm -rf fifo.in fifo.out
|
146
162
|
|
147
163
|
echo "Ran solution as \$@" &>>stderr0
|
148
164
|
echo "interactor exitcode \$ECINT" &>>stderr0
|
149
165
|
echo "solution exitcode \$ECSF" &>>stderr0
|
166
|
+
echo "exit first \$EXITFIRST" &>>stderr0
|
167
|
+
|
168
|
+
finish() {
|
169
|
+
echo "exitting from runit.sh with exit code \$1" &>>stderr0
|
170
|
+
exit \$1
|
171
|
+
}
|
150
172
|
|
151
|
-
|
152
|
-
if [[ \$ECSF -eq -
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
173
|
+
# 1. Check for interactor errors.
|
174
|
+
if [[ \$ECSF -eq -SIGPIPE ]] || [[ \$ECSF -eq -SIGTERM ]] || [[ \$ECSF -ne 0 ]] && ! cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
|
175
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
176
|
+
echo "testlib exitcode \$ECINT" >stdout0
|
177
|
+
finish 0
|
178
|
+
elif [[ \$ECINT -ne 0 ]]; then
|
179
|
+
finish 9
|
180
|
+
fi
|
157
181
|
fi
|
158
182
|
|
159
|
-
|
160
|
-
if [[ \$
|
183
|
+
# 2. Check for solution errors.
|
184
|
+
if [[ \$ECSF -ne 0 ]]; then
|
185
|
+
finish \$ECSF
|
186
|
+
fi
|
187
|
+
|
188
|
+
# 3. Check for interactor without looking at solution output.
|
189
|
+
if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
|
161
190
|
echo "testlib exitcode \$ECINT" >stdout0
|
162
|
-
|
163
|
-
elif [[ \$ECSF -ne 0 ]]; then
|
164
|
-
ret=\$ECSF
|
191
|
+
finish 0
|
165
192
|
elif [[ \$ECINT -ne 0 ]]; then
|
166
|
-
|
193
|
+
finish 9
|
167
194
|
fi
|
168
195
|
|
169
|
-
|
170
|
-
|
196
|
+
# 4. Finish with zero and later check output.
|
197
|
+
finish 0
|
171
198
|
EOF
|
172
199
|
|
173
200
|
chmod 755 runit.sh
|