File Coverage

blib/lib/Alien/Build/Plugin/Probe/GnuWin32.pm
Criterion Covered Total %
statement 31 84 36.9
branch 4 34 11.7
condition 3 9 33.3
subroutine 9 12 75.0
pod 2 2 100.0
total 49 141 34.7


line stmt bran cond sub pod time code
1             package Alien::Build::Plugin::Probe::GnuWin32;
2              
3 2     2   243332 use strict;
  2         9  
  2         70  
4 2     2   16 use warnings;
  2         7  
  2         85  
5 2     2   1025 use Alien::Build::Plugin;
  2         6271  
  2         21  
6 2     2   276 use Module::Load ();
  2         8  
  2         56  
7 2     2   16 use File::Spec;
  2         8  
  2         65  
8 2     2   16 use Carp ();
  2         8  
  2         61  
9 2     2   1549 use Capture::Tiny qw( capture );
  2         88494  
  2         263  
10 2     2   34 use List::Util ();
  2         10  
  2         2672  
11              
12             # ABSTRACT: Probe for GnuWin32 packages using the Windows registry
13             our $VERSION = '0.59'; # VERSION
14              
15              
16             has native_only => 0;
17             has registery_key_regex => undef;
18             has registry_key_regex => undef;
19             has exe_name => undef;
20             has exe_match => undef;
21             has exe_version => undef;
22             has exe_args => ['--version'];
23              
24             sub _short ($)
25             {
26 0 0   0   0 $_[0] =~ /\s+/ ? Win32::GetShortPathName( $_[0] ) : $_[0];
27             }
28              
29             sub new
30             {
31 3     3 1 13352 my $class = shift;
32            
33 3         30 my $self = $class->SUPER::new(@_);
34            
35 3 100       204 if($self->registery_key_regex)
36             {
37 1         869 require Alien::Build;
38 1         47280 Alien::Build->log("warning: you are using a typo'd property, 'registery_key_regex', please use 'registry_key_regex' instead");
39             }
40            
41 3 100 100     117 $self->registry_key_regex || $self->registry_key_regex($self->registery_key_regex) || Carp::croak "register_key_regex is required";
42            
43 2         42 $self;
44             }
45              
46             sub init
47             {
48 0     0 1   my($self, $meta) = @_;
49            
50             # we may decide to take this module out of core.
51 0           $meta->add_requires( 'configure' => 'Alien::Build::Plugin::Probe::GnuWin32' => 0 );
52            
53 0 0         if($^O eq 'MSWin32')
54             {
55             $meta->register_hook(
56             probe => sub {
57 0     0     my($build) = @_;
58            
59 0           my @paths = ([]);
60            
61 0 0         if(eval { Module::Load::load "Win32API::Registry"; 1 })
  0            
  0            
62             {
63 0           my @uninstall_key_names = qw(
64             software\microsoft\windows\currentversion\uninstall
65             );
66 0 0         unshift @uninstall_key_names, qw( software\wow6432node\microsoft\windows\currentversion\uninstall )
67             unless $self->native_only;
68            
69 0           foreach my $uninstall_key_name (@uninstall_key_names)
70             {
71 0           my $uninstall_key;
72 0 0         Win32API::Registry::RegOpenKeyEx(
73             Win32API::Registry::HKEY_LOCAL_MACHINE(),
74             $uninstall_key_name,
75             0,
76             Win32API::Registry::KEY_READ(),
77             $uninstall_key ) || next;
78            
79 0           my $pos = 0;
80 0           my($subkey, $class, $time) = ('','','');
81 0           my($namSiz, $clsSiz) = (1024,1024);
82 0           while(Win32API::Registry::RegEnumKeyEx( $uninstall_key, $pos++, $subkey, $namSiz, [], $class, $clsSiz, $time))
83             {
84 0 0         next unless $subkey =~ $self->registery_key_regex;
85 0           my $flex_key;
86 0 0         Win32API::Registry::RegOpenKeyEx(
87             $uninstall_key,
88             $subkey,
89             0,
90             Win32API::Registry::KEY_READ(),
91             $flex_key ) || next;
92            
93 0           my $data;
94 0 0         if(Win32API::Registry::RegQueryValueEx($flex_key, "InstallLocation", [], Win32API::Registry::REG_SZ(), $data, [] ))
95             {
96 0           push @paths, [File::Spec->catdir(_short $data, "bin")];
97             }
98              
99 0 0         if(Win32API::Registry::RegQueryValueEx($flex_key, "Inno Setup: App Path", [], Win32API::Registry::REG_SZ(), $data, [] ))
100             {
101 0           push @paths, [File::Spec->catdir(_short $data, "bin")];
102             }
103            
104 0           Win32API::Registry::RegCloseKey( $flex_key );
105             }
106 0           Win32API::Registry::RegCloseKey($uninstall_key);
107             }
108            
109             }
110            
111 0           push @paths, map { [_short $ENV{$_}, qw( GnuWin32 bin )] } grep { defined $ENV{$_} } qw[ ProgramFiles ProgramFiles(x86) ];
  0            
  0            
112 0           push @paths, ['C:\\GnuWin32\\bin'];
113            
114 0           $build->log("try system paths:");
115            
116 0           foreach my $path (map { File::Spec->catdir(@$_) } @paths)
  0            
117             {
118 0 0         $build->log(" - @{[ $path eq '' ? 'PATH' : $path ]}");
  0            
119 0           foreach my $exe_name ($self->exe_name, $self->exe_name . '.exe')
120             {
121 0           my $exe = File::Spec->catfile($path, $exe_name);
122 0 0 0       next unless $path eq '' || -f $exe;
123 0           my @cmd = ($exe, @{ $self->exe_args });
  0            
124             my($out, $err) = capture {
125 0           system @cmd;
126 0           };
127 0 0         if($self->exe_match)
128             {
129 0 0         next unless $out =~ $self->exe_match;
130             }
131 0 0 0       if($self->exe_version && $out =~ $self->exe_version)
132             {
133 0           $build->runtime_prop->{version} = $1;
134             }
135 0 0         $build->runtime_prop->{system_bin_dir} = File::Spec->catfile($path) unless $path eq '';
136 0           return 'system';
137             }
138             }
139            
140 0           'share';
141             }
142 0           );
143            
144             }
145            
146 0           $self;
147             }
148              
149             1;
150              
151             __END__