Skip to content

Commit c981f1b

Browse files
Add flag to exit on failed compilation (#50)
* Add --ignore-compilation-errors flag * Fix tests and add tests for the new flag * Change default behaviour of run and fix tests * Remove exit_on_compilation_error flag * Fix tests * Remove "no solutions were compiled" if * Update error exit message Co-authored-by: Tomasz Nowak <[email protected]> * Fix exit message * Refactor compilation results --------- Co-authored-by: Tomasz Nowak <[email protected]>
1 parent c9f499e commit c981f1b

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

src/sinol_make/commands/run/__init__.py

+24-6
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ def compile_solutions(self, solutions):
161161
print("Compiling %d solutions..." % len(solutions))
162162
with mp.Pool(self.cpus) as pool:
163163
compilation_results = pool.map(self.compile, solutions)
164-
if not all(compilation_results):
165-
util.exit_with_error("\nCompilation failed.")
166164
return compilation_results
167165

168166

@@ -473,12 +471,20 @@ def calculate_points(self, results):
473471

474472
def compile_and_run(self, solutions):
475473
compilation_results = self.compile_solutions(solutions)
474+
compiled_solutions = []
475+
for i in range(len(solutions)):
476+
if compilation_results[i]:
477+
compiled_solutions.append(solutions[i])
478+
else:
479+
self.failed_compilations.append(solutions[i])
480+
compilation_results = [result for result in compilation_results if result]
481+
476482
os.makedirs(self.EXECUTIONS_DIR, exist_ok=True)
477483
executables = [os.path.join(self.EXECUTABLES_DIR, package_util.get_executable(solution))
478-
for solution in solutions]
479-
compiled_commands = zip(solutions, executables, compilation_results)
480-
names = solutions
481-
return self.run_solutions(compiled_commands, names, solutions, self.args.solutions_report)
484+
for solution in compiled_solutions]
485+
compiled_commands = zip(compiled_solutions, executables, compilation_results)
486+
names = compiled_solutions
487+
return self.run_solutions(compiled_commands, names, compiled_solutions, self.args.solutions_report)
482488

483489

484490
def print_expected_scores(self, expected_scores):
@@ -499,6 +505,11 @@ def validate_expected_scores(self, results):
499505
used_solutions = results.keys()
500506
if self.args.solutions == None and config_expected_scores: # If no solutions were specified, use all solutions from config
501507
used_solutions = config_expected_scores.keys()
508+
used_solutions = list(used_solutions)
509+
510+
for solution in self.failed_compilations:
511+
if solution in used_solutions:
512+
used_solutions.remove(solution)
502513

503514
used_groups = set()
504515
if self.args.tests == None and config_expected_scores: # If no groups were specified, use all groups from config
@@ -660,6 +671,11 @@ def validate_arguments(self, args):
660671

661672
return compilers, timetool_path
662673

674+
def exit(self):
675+
if len(self.failed_compilations) > 0:
676+
util.exit_with_error('Compilation failed for {cnt} solution{letter}.'.format(
677+
cnt=len(self.failed_compilations), letter='' if len(self.failed_compilations) == 1 else 's'))
678+
663679
def set_scores(self):
664680
self.tests = package_util.get_tests(self.args.tests)
665681
self.groups = list(sorted(set([self.get_group(test) for test in self.tests])))
@@ -750,7 +766,9 @@ def run(self, args):
750766
else:
751767
print(util.warning('There are no tests to run.'))
752768

769+
self.failed_compilations = []
753770
solutions = self.get_solutions(self.args.solutions)
754771
results = self.compile_and_run(solutions)
755772
validation_results = self.validate_expected_scores(results)
756773
self.print_expected_scores_diff(validation_results)
774+
self.exit()

tests/commands/run/test_unit.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_compile_solutions(create_package):
4141
def test_execution(create_package, time_tool):
4242
package_path = create_package
4343
command = get_command(package_path)
44-
command.args = argparse.Namespace(time_tool=time_tool, weak_compilation_flags=False)
44+
command.args.time_tool = time_tool
4545
solution = "abc.cpp"
4646
executable = package_util.get_executable(solution)
4747
result = command.compile_solutions([solution])

tests/commands/run/util.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ def get_command(path = None):
2525
java_compiler_path=compiler.get_java_compiler_path()
2626
)
2727
command.config = yaml.load(open(os.path.join(path, "config.yml"), "r"), Loader=yaml.FullLoader)
28+
command.failed_compilations = []
2829
set_default_args(command)
2930
return command
3031

3132

3233
def set_default_args(command):
3334
command.args = argparse.Namespace(
34-
weak_compilation_flags=False
35+
weak_compilation_flags=False,
3536
)

0 commit comments

Comments
 (0)