File Coverage

blib/lib/Alien/Build/Plugin/Probe/CommandLine.pm
Criterion Covered Total %
statement 49 49 100.0
branch 21 22 95.4
condition 15 15 100.0
subroutine 10 10 100.0
pod 1 1 100.0
total 96 97 98.9


line stmt bran cond sub pod time code
1             package Alien::Build::Plugin::Probe::CommandLine;
2              
3 3     3   7435 use strict;
  3         8  
  3         95  
4 3     3   16 use warnings;
  3         7  
  3         92  
5 3     3   61 use 5.008004;
  3         10  
6 3     3   478 use Alien::Build::Plugin;
  3         17  
  3         34  
7 3     3   30 use Carp ();
  3         7  
  3         98  
8 3     3   26 use Capture::Tiny qw( capture );
  3         7  
  3         199  
9 3     3   21 use File::Which ();
  3         6  
  3         1705  
10              
11             # ABSTRACT: Probe for tools or commands already available
12             our $VERSION = '2.45'; # VERSION
13              
14              
15             has '+command' => sub { Carp::croak "@{[ __PACKAGE__ ]} requires command property" };
16              
17              
18             has 'args' => [];
19              
20              
21             has 'secondary' => 0;
22              
23              
24             has 'match' => undef;
25              
26              
27             has 'match_stderr' => undef;
28              
29              
30             has 'version' => undef;
31              
32              
33             has 'version_stderr' => undef;
34              
35             sub init
36             {
37 20     20 1 109 my($self, $meta) = @_;
38              
39             my $check = sub {
40 13     13   37 my($build) = @_;
41              
42 13 100       60 unless(File::Which::which($self->command))
43             {
44 2         30 die 'Command not found ' . $self->command;
45             }
46              
47 11 100 100     218 if(defined $self->match || defined $self->match_stderr || defined $self->version || defined $self->version_stderr)
      100        
      100        
48             {
49             my($out,$err,$ret) = capture {
50 10         10723 system( $self->command, @{ $self->args } );
  10         32  
51 10         331 };
52 10 50       9839 die 'Command did not return a true value' if $ret;
53 10 100 100     48 die 'Command output did not match' if defined $self->match && $out !~ $self->match;
54 9 100 100     34 die 'Command standard error did not match' if defined $self->match_stderr && $err !~ $self->match_stderr;
55 8 100       27 if(defined $self->version)
56             {
57 2 100       9 if($out =~ $self->version)
58             {
59 1         6 $build->runtime_prop->{version} = $1;
60             }
61             }
62 8 100       30 if(defined $self->version_stderr)
63             {
64 2 100       9 if($err =~ $self->version_stderr)
65             {
66 1         11 $build->hook_prop->{version} = $1;
67 1         4 $build->runtime_prop->{version} = $1;
68             }
69             }
70             }
71              
72 9         42 $build->runtime_prop->{command} = $self->command;
73 9         29 'system';
74 20         122 };
75              
76 20 100       81 if($self->secondary)
77             {
78             $meta->around_hook(
79             probe => sub {
80 4     4   12 my $orig = shift;
81 4         8 my $build = shift;
82 4         12 my $type = $orig->($build, @_);
83 4 100       30 return $type unless $type eq 'system';
84 2         21 $check->($build);
85             },
86 7         47 );
87             }
88             else
89             {
90 13         60 $meta->register_hook(
91             probe => $check,
92             );
93             }
94             }
95              
96             1;
97              
98             __END__