File Coverage

script/prowess
Criterion Covered Total %
statement 54 54 100.0
branch 11 16 68.7
condition 7 11 63.6
subroutine 9 9 100.0
pod n/a
total 81 90 90.0


line stmt bran cond sub pod time code
1             #!/usr/bin/env perl
2 3     3   1054 use strict;
  3         6  
  3         72  
3 3     3   13 use warnings;
  3         5  
  3         69  
4 3     3   535 use App::Prove;
  3         24936  
  3         75  
5 3     3   1314 use Filesys::Notify::Simple;
  3         4750  
  3         90  
6 3   50 3   19 use constant DEBUG => $ENV{PROWESS_DEBUG} || 0;
  3         4  
  3         1378  
7              
8             sub parse_argv {
9 6     6   480 my $self = shift;
10 6         10 my (@prove, @watch);
11              
12 6         25 while (defined(my $k = shift @_)) {
13 11 100 66     135 if ($k eq '-w' and @_ and -d $_[0]) {
      100        
14 5         21 push @watch, shift;
15             }
16             else {
17 6         23 push @prove, $k;
18             }
19             }
20              
21 6 100       18 @watch = grep { -d $_ } qw( bin lib script t xt ) unless @watch;
  5         55  
22              
23 6         12 warn '[prowess] watching ', join(', ', @watch), "\n" if DEBUG;
24 6         38 return {prove => \@prove, watch => \@watch};
25             }
26              
27             sub run_prove {
28 3     3   9 my ($self, $args) = @_;
29 3         20 my $prove = App::Prove->new;
30              
31 3         401 $prove->process_args(@$args);
32              
33 3 50       10832 defined(my $pid = fork) or die "fork: $!";
34 3 50       89 exit exit($prove->run ? 0 : 1) unless $pid; # child
    100          
35 2         13 warn "[prowess] prove @$args ($pid)\n" if DEBUG;
36 2         73 return $pid;
37             }
38              
39             sub run {
40 3     3   789 my $self = shift;
41 3         19 my $args = $self->parse_argv(@_);
42 3         17 my $watcher = Filesys::Notify::Simple->new($args->{watch});
43 3         791 my $ignore = qr{(?:/\.[^/]+$|\.bak$|\.old$|\.swp$|~$)};
44 3         10 my @changed = (1);
45 3         6 my $exit = 0;
46              
47 3         4 while (1) {
48 3 50       14 my $pid = @changed ? $self->run_prove($args->{prove}) : 0;
49 2         23 eval {
50             # Try to capture:
51             # kevent error: Interrupt innerhalb eines Systemaufrufs at /usr/perl5.20.0/lib/site_perl/5.20.0/Filesys/Notify/KQueue.pm line 114.
52             $watcher->wait(
53             sub {
54 2 50 33 2   594082 return unless @changed = grep { !-d $_ && $_ !~ $ignore } map { $_->{path} } @_;
  2         111  
  2         10  
55 2         6 warn "[prowess] changed: @changed\n" if DEBUG;
56 2         35 my $kill = kill TERM => $pid;
57 2         7 warn "[prowess] kill TERM $pid\n" if DEBUG and $kill;
58 2         1354 waitpid $pid, 0;
59 2         22 $exit = $? >> 8;
60 2         16 warn "[prowess] prove \$?=$exit\n" if DEBUG;
61             }
62 2         116 );
63             };
64 2         16 warn "# $@" if DEBUG;
65 2 50       16 last if $ENV{PROWESS_ONCE};
66             }
67              
68 2         76 return $exit;
69             }
70              
71             my $prowess = bless {}, __PACKAGE__;
72             exit $prowess->run(@ARGV) unless defined wantarray;
73             return $prowess;