]> iEval git - gruntmaster-page.git/blobdiff - lib/Gruntmaster/Page.pm
Make generate more reliable
[gruntmaster-page.git] / lib / Gruntmaster / Page.pm
index 5c63f642174ff4046837cfe57aac8df05ee71ad3..00f2cdbaa03de2b03e141cc8868040ac60abeec0 100644 (file)
@@ -4,11 +4,13 @@ use 5.014000;
 use strict;
 use warnings;
 use parent qw/Exporter/;
-our @EXPORT_OK = qw/generate header footer/;
+our @EXPORT_OK = qw/generate/;
 
+use Fcntl qw/:flock/;
 use File::Basename qw/fileparse/;
 use File::Slurp qw/write_file/;
 use IO::Compress::Gzip qw/gzip/;
+use IO::File;
 
 our $VERSION = '0.001';
 our @generators;
@@ -19,44 +21,6 @@ use constant CONTENT_TYPES => {
   txt => 'text/plain; charset=UTF-8',
 };
 
-my %header_templates = (
-  en => <<'HTML',
-<!DOCTYPE html>
-<title>TITLE_GOES_HERE</title>
-<link rel="stylesheet" href="/gm.css">
-<script src="/jquery-2.0.3.min.js"></script>
-<script src="/view.js"></script>
-<meta charset="utf-8">
-
-<span id="admin"></span>
-<div id="title"><span class="i">i</span><span class="Eval">Eval</span></div>
-<div id="subtitle">TITLE_GOES_HERE</div>
-
-<nav><ul><li><a href="/">Home</a><li><a href="/log/">View job log</a><li><a href="/submit.var">Submit job</a><li><a href="/pb/">Problem list</a></ul></nav>
-
-HTML
-);
-
-my %footer_templates = (
-  en => <<'HTML',
-
-<footer>
-Dilmom: Why don't you call your product the Gruntmaster 6000?
-Dilbert: What kind of product do you see when you imagine a Gruntmaster 6000?
-Dilmom: Well, it's a stripped-down version of the Gruntmaster 9000, of course. But it's software-upgradeable.
-</footer>
-HTML
-);
-
-sub header{
-  my ($language, $title) = @_;
-  $header_templates{$language} =~ s/TITLE_GOES_HERE/$title/ger;
-}
-
-sub footer{
-  $footer_templates{$_[0]};
-}
-
 sub declaregen{
   my ($generator, $regex) = @_;
   $generator = "Gruntmaster::Page::$generator";
@@ -65,31 +29,46 @@ sub declaregen{
   push @generators, [$regex,  $gensub];
 }
 
-declaregen Index => qr'^index$';
-declaregen Log => qr'^log/index$';
-declaregen 'Log::Entry' => qr'^log/.*/index$';
-declaregen Submit => qr'^submit$';
-declaregen Pb => qr'^pb/index$';
-declaregen 'Pb::Entry' => qr'^pb/.*/index$';
+{
+  my $component = qr'[^/]+';
+  my $contest = qr,(?:ct/$component/)?,;
+  declaregen Index        => qr,^index$,;
+  declaregen Ct           => qr,^ct/index$,;
+  declaregen 'Ct::Entry'  => qr,^ct/$component/index$,;
+  #declaregen St           => qr,^ct/$component/st/index$,;
+  declaregen Log          => qr,^${contest}log/index$,;
+  declaregen 'Log::Entry' => qr,^${contest}log/$component/index$,;
+  declaregen Submit       => qr,^${contest}submit$,;
+  declaregen Pb           => qr,^${contest}pb/index$,;
+  declaregen 'Pb::Entry'  => qr,^${contest}pb/$component/index$,;
+}
 
 sub generate{
   my ($path) = @_;
   my ($path_noext, $ext) = $path =~ m/^(.*)\.(.*)$/;
   my $basename = fileparse $path_noext;
 
-  open my $typemap, ">$path_noext.var";
+  IO::File->new(">$path_noext.var")->close unless -f "$path_noext.var";
+  flock my $lockfh = IO::File->new("<$path_noext.var"), LOCK_EX;
+  open my $typemap, ">$path_noext.var.new";
   say $typemap "URI: $basename\n";
   for my $gen(@generators) {
        my ($regex, $generator) = @$gen;
        next unless $path_noext =~ $regex;
        for my $lang (@{LANGUAGES()}) {
          my $page = $generator->($path, $lang);
-         write_file "$path_noext.$lang.$ext", $page;
+         write_file "$path_noext.$lang.$ext.new", $page;
          say $typemap "URI: $basename.$lang.$ext\nContent-Language: $lang\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
-         gzip \$page => "$path_noext.$lang.gz.$ext", Minimal => 1;
+         gzip \$page => "$path_noext.$lang.gz.$ext.new", Minimal => 1;
          say $typemap "URI: $basename.$lang.gz.$ext\nContent-Language: $lang\nContent-Encoding: gzip\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
        }
   }
+
+  for my $lang(@{LANGUAGES()}) {
+       rename "$path_noext.$lang.$ext.new", "$path_noext.$lang.$ext";
+       rename "$path_noext.$lang.gz.$ext.new", "$path_noext.$lang.gz.$ext";
+  }
+  rename "$path_noext.var.new", "$path_noext.var";
   close $typemap;
 }
 
This page took 0.028454 seconds and 4 git commands to generate.