X-Git-Url: http://git.ieval.ro/?p=gruntmaster-daemon.git;a=blobdiff_plain;f=lib%2FGruntmaster%2FDaemon.pm;h=e9114c8200496a88d2a91ab05199f7815defdb47;hp=bc2518e8a6d4961c62c496ddc66c2ca772975175;hb=ddceb393c90f620dd194c22e5e85d8c9fe87ee34;hpb=fe185d88a0d504efdc40ddf71b47b40b4223e057 diff --git a/lib/Gruntmaster/Daemon.pm b/lib/Gruntmaster/Daemon.pm index bc2518e..e9114c8 100644 --- a/lib/Gruntmaster/Daemon.pm +++ b/lib/Gruntmaster/Daemon.pm @@ -8,6 +8,7 @@ our $VERSION = '0.001'; use Gruntmaster::Daemon::Constants qw/ERR/; use Gruntmaster::Daemon::Base qw/watch/; +use Gruntmaster::Daemon::Format qw/mkrun/; use Gruntmaster::Page qw/generate/; use Fcntl qw/:flock/; @@ -36,16 +37,29 @@ sub safe_can { safe_can_nodie @_ or get_logger->logdie("No such \l$type: '$name'"); } +sub prepare{ + my $name = $_[0]; + my $basename = fileparse $name, qr/\.[^.]*/; + get_logger->trace("Preparing file $name..."); + + open my $devnull, devnull; + open my $errors, '>>compile-error'; + my $ret = open3 $devnull, $errors, undef, 'gruntmaster-compile', CPP => $basename, $name; + waitpid $ret, 0; + close $devnull; + close $errors; + die 'Compile error' if $? +} + sub prepare_files{ my ($dir, $meta) = @_; for my $file (values $meta->{files}) { my ($format, $name) = @{$file}{qw/format name/}; - my $prepare = safe_can Format => prepare => $format; - $file->{run} = safe_can Format => run => $format; + $file->{run} = mkrun($format); die "No such file: '$name'" unless -e $name; - $prepare->($name); + prepare $name; } } @@ -55,7 +69,7 @@ sub process{ chdir $dir; mkdir "in"; for (<*>) { - cp $_, "in" unless $_ eq 'in' || $_ eq 'pidfile'; + cp $_, "in" unless $_ eq 'in'; } my @results; @@ -117,24 +131,23 @@ sub process{ # Clean up get_logger->info("Job result: " . $meta->{result_text}); - delete $meta->{files}{$_}{run} for keys $meta->{files}; - $meta->{date} = time; $meta->{results} = \@full_results if scalar @full_results; DumpFile "meta.yml", $meta; for (<*>) { unlink $_ unless $_ eq 'in' || $_ eq 'meta.yml' || ($_ eq 'compile-error' && -s); } chdir '../..'; - mkdir 'log' unless -d 'log'; - IO::File->new('>log/meta.yml')->close unless -f 'log/meta.yml'; - flock my $logmetafh = IO::File->new('{contest} ? "ct/$meta->{contest}/log" : 'log'; + mkdir $log unless -d $log; + IO::File->new(">$log/meta.yml")->close unless -f "$log/meta.yml"; + flock my $logmetafh = IO::File->new("<$log/meta.yml"), LOCK_EX; + my $logmeta = LoadFile "$log/meta.yml"; $logmeta->{last}++; - rename $dir, 'log/' . $logmeta->{last}; - generate 'log/' . $logmeta->{last} . '/index.html'; - DumpFile 'log/meta.yml', $logmeta; + rename $dir, "$log/$logmeta->{last}"; + generate "$log/$logmeta->{last}/index.html"; + DumpFile "$log/meta.yml", $logmeta; undef $logmetafh; - generate 'log/index.html' + generate "$log/index.html" } sub run{