- 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;
-
- chdir $rootdir;
- my $log = $meta->{contest} ? "ct/$meta->{contest}/log" : 'log';
- write_file "$log/src/$job." . Gruntmaster::Page::Log::FORMAT_EXTENSION->{$meta->{files}{prog}{format}}, $meta->{files}{prog}{content};
- generate "$log/job/$job.html";
- my $page = ($job + Gruntmaster::Page::Log::PAGE_SIZE - 1) / Gruntmaster::Page::Log::PAGE_SIZE;
- generate "$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 $meta = {
+ problem => $job->problem->id,
+ files => {
+ prog => {
+ name => 'prog.' . $job->extension,
+ format => $job->format,
+ content => $job->source,
+ },
+ },
+ map { $_ => $job->problem->get_column($_) } qw/generator runner judge precnt testcnt timeout olimit/
+ };
+ my $limit_override = $job->result_source->schema->limits->find($meta->{problem}, $job->format);
+ $meta->{timeout} = $limit_override->timeout if $limit_override;
+ $meta->{tests} = decode_json $job->problem->tests if $meta->{runner} eq 'File';
+ delete $meta->{precnt} unless $job->contest && $job->contest->is_running;
+ $meta->{testcnt} = $meta->{precnt} if $meta->{precnt};
+
+ $meta->{files}{ver} = {
+ name => 'ver.' . FORMAT_EXTENSION->{$job->problem->verformat},
+ format => $job->problem->verformat,
+ content => $job->problem->versource,
+ } if $job->problem->verformat;
+
+ process $meta;
+
+ $meta->{result_text} .= ' (pretests)' if $meta->{precnt};
+ $job->update({
+ result => $meta->{result},
+ result_text => $meta->{result_text},
+ ($meta->{results} ? (results => encode_json $meta->{results}) : ()),
+ $meta->{errors} ? (errors => $meta->{errors}) : ()
+ });
+
+ my $solved = $meta->{result} ? 0 : 1;
+ my $status = $db->problem_statuses->find($job->owner, $job->problem);
+ $db->problem_statuses->update_or_create({
+ problem => $job->problem,
+ owner => $job->owner,
+ job => $job->id,
+ solved => $solved}) if !$job->problem->private;