#!/usr/bin/perl
=head1 NAME
cgi_prove - Web based interface to /usr/bin/prove
=cut
use base qw(CGI::Ex::App);
use strict;
use warnings;
use vars qw($BASE_DIR $LIB_DIR $PROVE_PROG);
use CGI::Ex::Dump qw(debug);
BEGIN {
require config;
$BASE_DIR = $config::config{'rootdir_server'} .'/t';
$LIB_DIR = $config::config{'rootdir_server'} .'/lib';
$PROVE_PROG = '/usr/bin/prove';
}
###----------------------------------------------------------------###
__PACKAGE__->navigate;
sub main_file_print {
return \ qq {
[% rows = [];
FOREACH dir IN files.keys.sort ;
rows.push("\${dir.html}
");
FOREACH file IN files.\$dir ;
rows.push(" \${file.html}
");
END;
END;
cols = 4;
n_per_col = rows.size / cols;
IF n_per_col - n_per_col.int; n_per_col = n_per_col.int + 1; END;
FOREACH j = [0 .. cols - 1] %]
[% min = j * n_per_col;
max = min + n_per_col - 1;
IF max > rows.max; max = rows.max; END;
FOREACH i IN [min .. max]
rows.\$i;
END %]
[% END %]
};
}
sub main_hash_swap {
my $self = shift;
my $dir = $BASE_DIR;
require File::Find;
my $files = {};
File::Find::find(sub {
return if -d;
return if $File::Find::name !~ m|^\Q$dir\E/(.+)/(.+\.t)$|;
$files->{$1}->{$2} = 1;
}, $dir);
$files->{$_} = [sort keys %{$files->{$_}}] foreach keys %$files;
return {files => $files};
}
sub main_info_complete {
my $self = shift;
my $file = $self->form->{'test'} || return 0;
return 0 if $file =~ /\.\./;
return 0 if $file !~ /^([\w\.\/\-]+)$/;
$file = $1;
$file =~ s|^/+||;
my $dir = $BASE_DIR;
return 0 if ! -e "$dir/$file" && lc $file ne 'all';
$self->stash->{'test'} = $self->form->{'test'} = $file;
$self->append_path('_run');
return 1;
}
sub _run_file_print {
return \ qq {
Test - [% test %]
};
}
sub _run_info_complete { 0 }
sub _run_post_print {
my $self = shift;
my $file = $self->stash->{'test'} || die "Missing test";
my $exe = $PROVE_PROG;
$file = '' if lc($file) eq 'all';
open(my $fh, "$exe -v -I$LIB_DIR -r $BASE_DIR/$file 2>&1 |") || do { debug "Couldn't exec", $exe, $!; die "Couldn't exec: $!" };
my $r;
if ($self->cgix->is_mod_perl_2) {
$r = $self->cgix->apache_request;
} else {
$| = 1;
}
print "\n";
while (defined(my $line = <$fh>)) {
$line =~ s/\s+$//;
if ($line =~ /^\s*not/) {
$line = "$line";
} elsif ($line !~ /^\s*ok/) {
$line = "$line";
}
print $line."
\n";
$r->rflush if $r;
}
print "\n";
}