- my %results = $judge->(@results);
- $meta->{$_} = $results{$_} for keys %results;
- } catch {
- s,(.*) at .*,$1,;
- chomp;
- $meta->{result} = -1;
- $meta->{result_text} = $_;
- };
-
- get_logger->info("Job result: " . $meta->{result_text});
- set_job_result $job, $meta->{result};
- set_job_result_text $job, $meta->{result_text};
- set_job_results $job, \@full_results if scalar @full_results;
-
- my $log = $meta->{contest} ? "ct/$meta->{contest}/log" : 'log';
- PUBLISH gensrc => $job;
- PUBLISH genpage => "$log/job/$job.html";
- PUBLISH genpage => "$log/index.html";
- my $page = ($job + Gruntmaster::Page::Log::PAGE_SIZE - 1) / Gruntmaster::Page::Log::PAGE_SIZE;
- PUBLISH genpage => "$log/$page.html"
+ my %results = $judge->(@results);
+ $meta->{$_} = $results{$_} for keys %results;
+ $meta->{results} = \@full_results
+ } catch {
+ s/(.*) at .*/$1/s;
+ chomp;
+ $meta->{result} = -1;
+ $meta->{result_text} = $_;
+ };
+ stopvms;
+ $meta->{errors} = $errors;
+
+ get_logger->info('Job result: ' . $meta->{result_text});
+}
+
+sub process_job {
+ my ($job) = @_;
+ my $pb = db()->select('problems', '*', {id => $job->{problem}})->hash;
+ my $meta = {
+ problem => $job->{problem},
+ files => {
+ prog => {
+ name => 'prog.' . $job->{extension},
+ format => $job->{format},
+ content => $job->{source},
+ },
+ },
+ map { $_ => $pb->{$_} } qw/generator runner judge precnt testcnt timeout olimit/
+ };
+ my $timeout_override = db()->query('SELECT timeout FROM limits WHERE problem=? AND format=?', $job->{problem}, $job->{format})->list;
+ $meta->{timeout} = $timeout_override if defined $timeout_override;
+ $meta->{tests} = decode_json $pb->{tests} if $meta->{runner} eq 'File';
+ $job->{contest} &&= contest_entry($job->{contest});
+ delete $meta->{precnt} unless $job->{contest} && $job->{contest}{started} && !$job->{contest}{finished}; ## no critic (ProhibitNegativeExpressionsInUnlessAndUntilConditions)
+ $meta->{testcnt} = $meta->{precnt} if $meta->{precnt};
+
+ $meta->{files}{ver} = {
+ name => 'ver.' . FORMAT_EXTENSION->{$pb->{verformat}},
+ format => $pb->{verformat},
+ content => $pb->{versource},
+ } if $pb->{verformat};
+
+ process $meta;
+
+ $meta->{result_text} .= ' (pretests)' if $meta->{precnt};
+ finish_job($job, $job->{private} || $pb->{private},
+ result => $meta->{result},
+ result_text => $meta->{result_text},
+ ($meta->{results} ? (results => encode_json $meta->{results}) : ()),
+ $meta->{errors} ? (errors => $meta->{errors}) : ());