line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package HTML::Perlinfo::Modules; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
8
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
30
|
|
4
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
26
|
|
5
|
1
|
|
|
1
|
|
5
|
use File::Find; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
50
|
|
6
|
1
|
|
|
1
|
|
6
|
use File::Spec; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
33
|
|
7
|
1
|
|
|
1
|
|
11
|
use Carp (); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
21
|
|
8
|
1
|
|
|
1
|
|
4
|
use Config qw(%Config); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
53
|
|
9
|
1
|
|
|
1
|
|
462
|
use HTML::Entities; |
|
1
|
|
|
|
|
5733
|
|
|
1
|
|
|
|
|
81
|
|
10
|
1
|
|
|
1
|
|
7
|
use base qw(HTML::Perlinfo::Base); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
437
|
|
11
|
1
|
|
|
1
|
|
7
|
use HTML::Perlinfo::Common; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
831
|
|
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $VERSION = '1.19'; |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
sub new { |
17
|
|
|
|
|
|
|
|
18
|
0
|
|
|
0
|
0
|
|
my ($class, %params) = @_; |
19
|
0
|
0
|
|
|
|
|
$params{'title'} = exists $params{'title'} ? $params{'title'} : 'Perl Modules'; |
20
|
|
|
|
|
|
|
|
21
|
0
|
|
|
|
|
|
$class->SUPER::new(%params); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
sub escapeHTML { |
27
|
0
|
|
|
0
|
0
|
|
return HTML::Entities::encode_entities(@_); |
28
|
|
|
|
|
|
|
} |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
sub module_color_check { |
31
|
|
|
|
|
|
|
|
32
|
0
|
|
|
0
|
0
|
|
my ($module_name, $color_specs) = @_; |
33
|
0
|
0
|
0
|
|
|
|
if (defined $color_specs && ref($color_specs->[0]) eq 'ARRAY') { |
34
|
0
|
|
|
|
|
|
foreach (@{ $color_specs }) { |
|
0
|
|
|
|
|
|
|
35
|
0
|
0
|
|
|
|
|
return $_->[0] if (match_string($module_name,$_->[1])==1); |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
else { |
39
|
0
|
0
|
0
|
|
|
|
return $color_specs->[0] if (defined $color_specs && match_string($module_name,$color_specs->[1])==1); |
40
|
|
|
|
|
|
|
} |
41
|
0
|
|
|
|
|
|
return 0; |
42
|
|
|
|
|
|
|
} |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# get_modinfo |
45
|
|
|
|
|
|
|
# This sub was created for the files_in option. |
46
|
|
|
|
|
|
|
# Returns found_mod reference |
47
|
|
|
|
|
|
|
###################################### |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
sub get_files_in { |
50
|
|
|
|
|
|
|
|
51
|
0
|
|
|
0
|
0
|
|
my ($file_path) = @_; |
52
|
|
|
|
|
|
|
|
53
|
0
|
0
|
0
|
|
|
|
return 0 unless $file_path && $file_path =~ m/\.pm$/; |
54
|
0
|
|
|
|
|
|
my $mod_info = module_info($file_path, undef); |
55
|
0
|
|
|
|
|
|
return $mod_info; |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
sub sort_modules { |
61
|
|
|
|
|
|
|
|
62
|
0
|
|
|
0
|
0
|
|
my ($modules, $sort_by) = @_; |
63
|
0
|
|
|
|
|
|
my @sorted_modules; |
64
|
|
|
|
|
|
|
|
65
|
0
|
0
|
|
|
|
|
if ($sort_by eq 'name') { |
|
|
0
|
|
|
|
|
|
66
|
0
|
|
|
|
|
|
foreach my $key (sort {lc $a cmp lc $b} keys %$modules) { |
|
0
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
# Check for duplicate modules |
68
|
0
|
0
|
|
|
|
|
if (ref($modules->{$key}) eq 'ARRAY') { |
69
|
0
|
|
|
|
|
|
foreach (@{ $modules->{$key} }) { |
|
0
|
|
|
|
|
|
|
70
|
0
|
|
|
|
|
|
push @sorted_modules, $_; |
71
|
|
|
|
|
|
|
} |
72
|
|
|
|
|
|
|
} |
73
|
|
|
|
|
|
|
else { |
74
|
0
|
|
|
|
|
|
push @sorted_modules, $modules->{$key}; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
} |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
elsif ($sort_by eq 'version') { |
79
|
0
|
|
|
|
|
|
foreach my $key (keys %$modules) { |
80
|
0
|
0
|
|
|
|
|
if (ref($modules->{$key}) eq 'ARRAY') { |
81
|
0
|
|
|
|
|
|
@{ $modules->{$key} } = sort {$a->{'version'} cmp $b->{'version'}}@{ $modules->{$key} }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
82
|
0
|
|
|
|
|
|
for (@{ $modules->{$key}}) { |
|
0
|
|
|
|
|
|
|
83
|
0
|
|
|
|
|
|
push @sorted_modules, $_; |
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
else { |
87
|
0
|
|
|
|
|
|
push @sorted_modules, $modules->{$key}; |
88
|
|
|
|
|
|
|
} |
89
|
|
|
|
|
|
|
} |
90
|
0
|
|
|
|
|
|
@sorted_modules = sort {$a->{'version'} cmp $b->{'version'}}@sorted_modules; |
|
0
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
} |
92
|
0
|
|
|
|
|
|
return @sorted_modules; |
93
|
|
|
|
|
|
|
} |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
sub html_setup { |
96
|
|
|
|
|
|
|
|
97
|
0
|
|
|
0
|
0
|
|
my ($self, $columns, $color_specs, $section, $full_page) = @_; |
98
|
|
|
|
|
|
|
|
99
|
0
|
|
|
|
|
|
my $html; |
100
|
|
|
|
|
|
|
|
101
|
0
|
0
|
|
|
|
|
$html .= $self->print_htmlhead if $full_page; |
102
|
|
|
|
|
|
|
|
103
|
0
|
|
|
|
|
|
my %show_columns = ( |
104
|
|
|
|
|
|
|
'name' => 'Module name', |
105
|
|
|
|
|
|
|
'version' => 'Version', |
106
|
|
|
|
|
|
|
'path' => 'Location', |
107
|
|
|
|
|
|
|
'core' => 'Core', |
108
|
|
|
|
|
|
|
'desc' => 'Description' |
109
|
|
|
|
|
|
|
); |
110
|
|
|
|
|
|
|
|
111
|
0
|
0
|
|
|
|
|
$html .= $section ? print_section($section) : ''; |
112
|
0
|
0
|
0
|
|
|
|
$html .= print_color_codes($color_specs) if $color_specs && $color_specs->[2]; |
113
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
114
|
0
|
|
|
|
|
|
$html .= print_table_header(scalar @$columns, map{ $show_columns{$_} }@$columns); |
|
0
|
|
|
|
|
|
|
115
|
0
|
|
|
|
|
|
return $html; |
116
|
|
|
|
|
|
|
} |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
sub module_info { |
119
|
0
|
|
|
0
|
0
|
|
my ($module_path, $show_only) = @_; |
120
|
|
|
|
|
|
|
|
121
|
0
|
|
|
|
|
|
( $module_path ) = $module_path =~ /^(.*)$/; |
122
|
|
|
|
|
|
|
|
123
|
0
|
|
|
|
|
|
my ($mod_name, $mod_version, $mod_desc); |
124
|
|
|
|
|
|
|
|
125
|
1
|
|
|
1
|
|
8
|
no warnings 'all'; # silence warnings |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
2654
|
|
126
|
0
|
0
|
|
|
|
|
open(MOD, $module_path) or return 0; |
127
|
0
|
|
|
|
|
|
while () { |
128
|
|
|
|
|
|
|
|
129
|
0
|
0
|
|
|
|
|
unless ($mod_name) { |
130
|
0
|
0
|
|
|
|
|
if (/^ *package +(\S+);/) { |
131
|
0
|
|
|
|
|
|
$mod_name = $1; |
132
|
|
|
|
|
|
|
} |
133
|
|
|
|
|
|
|
} |
134
|
|
|
|
|
|
|
|
135
|
0
|
0
|
|
|
|
|
unless ($mod_version) { |
136
|
|
|
|
|
|
|
|
137
|
0
|
0
|
|
|
|
|
if (/([\$*])(([\w\:\']*)\bVERSION)\b.*\=/) { |
138
|
|
|
|
|
|
|
|
139
|
0
|
|
|
|
|
|
my $line = substr $_, index($_, $1); |
140
|
0
|
|
|
|
|
|
my $eval = qq{ |
141
|
|
|
|
|
|
|
package HTML::Perlinfo::_version; |
142
|
|
|
|
|
|
|
no strict; |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
local $1$2; |
145
|
|
|
|
|
|
|
\$$2=undef; do { |
146
|
|
|
|
|
|
|
$line |
147
|
|
|
|
|
|
|
}; \$$2 |
148
|
|
|
|
|
|
|
}; |
149
|
|
|
|
|
|
|
|
150
|
0
|
|
|
|
|
|
( $eval ) = $eval =~ /^(.*)$/sm; |
151
|
0
|
|
|
|
|
|
$mod_version = eval($eval); |
152
|
|
|
|
|
|
|
# Again let us be nice here. |
153
|
0
|
0
|
0
|
|
|
|
$mod_version = 'unknown' if (not defined $mod_version) || ($@); |
154
|
0
|
|
|
|
|
|
$mod_version =~ s/^\s+|\s+$//; |
155
|
|
|
|
|
|
|
} |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
|
158
|
0
|
0
|
|
|
|
|
unless ($mod_desc) { |
159
|
0
|
0
|
|
|
|
|
if (/=head\d\s+NAME/) { |
160
|
0
|
|
|
|
|
|
local $/ = ''; |
161
|
0
|
|
|
|
|
|
local $_; |
162
|
0
|
|
|
|
|
|
chomp($_ = ); |
163
|
0
|
|
|
|
|
|
($mod_desc) = /^.*?-+\s*(.*?)$/ism; |
164
|
|
|
|
|
|
|
} |
165
|
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
|
|
167
|
0
|
0
|
0
|
|
|
|
last if $mod_name && $mod_version && $mod_desc; |
|
|
|
0
|
|
|
|
|
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
} |
170
|
|
|
|
|
|
|
|
171
|
0
|
|
|
|
|
|
close (MOD); |
172
|
0
|
0
|
0
|
|
|
|
return 0 if (! $mod_name || $show_only && ref $show_only && (match_string($mod_name, $show_only) == 0)); |
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
173
|
0
|
0
|
0
|
|
|
|
$mod_version = 'unknown' if !($mod_version) || ($mod_version !~ /^[\.\d+_]+$/); |
174
|
0
|
0
|
|
|
|
|
$mod_desc = escapeHTML($mod_desc) if $mod_desc; |
175
|
0
|
0
|
|
|
|
|
$mod_desc = "No description found" unless $mod_desc; |
176
|
0
|
|
|
|
|
|
return { 'name' => $mod_name, 'version' => $mod_version, 'desc' => $mod_desc }; |
177
|
|
|
|
|
|
|
} |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
sub print_color_codes { |
180
|
0
|
|
|
0
|
0
|
|
my $color_specs = shift; |
181
|
0
|
|
|
|
|
|
my ($html, $label); |
182
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
183
|
0
|
|
|
|
|
|
$html .= print_table_header(1, "Module Color Codes"); |
184
|
0
|
|
|
|
|
|
$html .= print_table_color_start(); |
185
|
|
|
|
|
|
|
|
186
|
0
|
0
|
|
|
|
|
if (ref($color_specs->[0]) eq 'ARRAY') { |
187
|
0
|
|
|
|
|
|
my $count = 0; |
188
|
0
|
|
|
|
|
|
foreach (@{ $color_specs }) { |
|
0
|
|
|
|
|
|
|
189
|
0
|
0
|
|
|
|
|
$html .= " |
" if $count++ % 5 == 0;
190
|
0
|
|
0
|
|
|
|
$label = $_->[2] || $_->[1]; |
191
|
0
|
|
|
|
|
|
$html .= print_color_box($_->[0], $label); |
192
|
0
|
0
|
0
|
|
|
|
$html .= " |
" if (($count >= 5 && $count % 5 == 0)||($count >= @{$color_specs}));
|
0
|
|
0
|
|
|
|
|
193
|
|
|
|
|
|
|
} |
194
|
|
|
|
|
|
|
} |
195
|
|
|
|
|
|
|
else { |
196
|
0
|
|
0
|
|
|
|
$label = $color_specs->[2] || $color_specs->[1]; |
197
|
0
|
|
|
|
|
|
$html .= print_color_box($color_specs->[0], $label); |
198
|
|
|
|
|
|
|
} |
199
|
|
|
|
|
|
|
|
200
|
0
|
|
|
|
|
|
$html .= print_table_color_end(); |
201
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
202
|
0
|
|
|
|
|
|
return $html; |
203
|
|
|
|
|
|
|
} |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
sub print_module_results { |
206
|
|
|
|
|
|
|
|
207
|
0
|
|
|
0
|
0
|
|
my ($mod_dir, $mod_count, $from, $overall_total, $show_dir) = @_; |
208
|
|
|
|
|
|
|
|
209
|
0
|
|
|
|
|
|
my ($html, $total_amount, $searched, @mod_dir, @bad_dir, %seen); |
210
|
|
|
|
|
|
|
|
211
|
0
|
0
|
|
|
|
|
if ($show_dir) { |
212
|
|
|
|
|
|
|
|
213
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
214
|
0
|
|
|
|
|
|
$html .= print_table_header(2, "Directory", "Number of Modules"); |
215
|
0
|
|
|
|
|
|
for my $dir (keys %{$mod_count}) { |
|
0
|
|
|
|
|
|
|
216
|
0
|
|
|
|
|
|
my $amount_found = $mod_count->{$dir}; |
217
|
0
|
0
|
|
|
|
|
push (@mod_dir, $dir) if $amount_found; |
218
|
|
|
|
|
|
|
} |
219
|
|
|
|
|
|
|
|
220
|
0
|
|
|
|
|
|
for my $dir1 (@mod_dir) { |
221
|
0
|
|
|
|
|
|
for my $dir2 (@mod_dir) { |
222
|
0
|
0
|
0
|
|
|
|
if ($dir1 ne $dir2 && $dir2 =~ /^$dir1/) { |
223
|
0
|
|
|
|
|
|
push @bad_dir, $dir2; |
224
|
|
|
|
|
|
|
} |
225
|
|
|
|
|
|
|
} |
226
|
|
|
|
|
|
|
} |
227
|
0
|
|
|
|
|
|
for my $top_dir (@mod_dir) { |
228
|
0
|
0
|
|
|
|
|
unless (grep{$_ eq $top_dir }@bad_dir) { |
|
0
|
|
|
|
|
|
|
229
|
0
|
|
|
|
|
|
$html .= print_table_row(2, add_link('local', File::Spec->canonpath($top_dir)), $mod_count->{$top_dir}); |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
} |
232
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
233
|
|
|
|
|
|
|
} |
234
|
|
|
|
|
|
|
else { |
235
|
|
|
|
|
|
|
# Print out directories not in @INC |
236
|
0
|
0
|
0
|
|
|
|
@mod_dir = grep { -d $_ && -r $_ && !$seen{$_}++ } map {File::Spec->canonpath($_)}@INC; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
237
|
0
|
|
|
|
|
|
my @module_paths = grep { not exists $seen{$_} }@$mod_dir; |
|
0
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
|
239
|
0
|
0
|
|
|
|
|
if (@module_paths >= 1) { |
240
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
241
|
0
|
|
|
|
|
|
$html .= print_table_header(3, "Directory", "Searched", "Number of Modules"); |
242
|
|
|
|
|
|
|
|
243
|
0
|
|
|
|
|
|
for my $dir (map{ File::Spec->canonpath($_) }@module_paths) { |
|
0
|
|
|
|
|
|
|
244
|
0
|
0
|
|
|
|
|
$searched = (grep { $_ eq $dir } @$mod_dir) ? "yes" : "no"; |
|
0
|
|
|
|
|
|
|
245
|
0
|
0
|
|
|
|
|
my $amount_found = ($searched eq 'yes') ? $mod_count->{$dir} : 'unknown'; |
246
|
0
|
|
|
|
|
|
$html .= print_table_row(3, add_link('local', File::Spec->canonpath($dir)), $searched, $amount_found); |
247
|
|
|
|
|
|
|
} |
248
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
249
|
|
|
|
|
|
|
} |
250
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
|
252
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
253
|
0
|
|
|
|
|
|
$html .= print_table_header(3, "Include path (INC) directories", "Searched", "Number of Modules"); |
254
|
0
|
|
|
|
|
|
for my $dir (@mod_dir) { |
255
|
0
|
0
|
|
|
|
|
$searched = exists $mod_count->{$dir} ? 'yes' : 'no'; |
256
|
0
|
0
|
|
|
|
|
my $amount_found = ($searched eq 'yes') ? $mod_count->{$dir} : 'unknown'; |
257
|
0
|
|
|
|
|
|
$html .= print_table_row(3, add_link('local', File::Spec->canonpath($dir)), $searched, $amount_found); |
258
|
|
|
|
|
|
|
} |
259
|
|
|
|
|
|
|
|
260
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
261
|
|
|
|
|
|
|
} |
262
|
|
|
|
|
|
|
|
263
|
0
|
|
|
|
|
|
$html .= print_table_start(); |
264
|
|
|
|
|
|
|
#my $view = ($from eq 'all') ? 'installed' : |
265
|
|
|
|
|
|
|
# ($from eq 'core') ? 'core' : 'found'; |
266
|
|
|
|
|
|
|
|
267
|
0
|
|
|
|
|
|
$html .= print_table_row(2, "Total modules", $overall_total); |
268
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
269
|
|
|
|
|
|
|
|
270
|
0
|
|
|
|
|
|
return $html; |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
} |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
sub search_dir { |
275
|
|
|
|
|
|
|
|
276
|
0
|
|
|
0
|
0
|
|
my ($from, $show_only, $core_dir1, $core_dir2) = @_; |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
|
279
|
0
|
|
|
|
|
|
my %seen = (); |
280
|
|
|
|
|
|
|
|
281
|
0
|
0
|
0
|
|
|
|
my @user_dir = (ref($from) eq 'ARRAY') && $show_only ne 'core' ? @{$from} : |
|
0
|
0
|
|
|
|
|
|
282
|
|
|
|
|
|
|
($show_only eq 'core') ? ($core_dir1, $core_dir2) : $from; |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
# Make sure only unique entries and readable directories in @mod_dir |
285
|
0
|
0
|
0
|
|
|
|
my @mod_dir = grep { -d $_ && -r $_ && !$seen{$_}++ } map {File::Spec->canonpath($_)}@user_dir; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
286
|
0
|
0
|
|
|
|
|
if (@mod_dir != @user_dir) { |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
# Looks like there might have been a problem with the directories given to us. |
289
|
|
|
|
|
|
|
# Or maybe not. @user_dir could have duplicate values and that's ok. |
290
|
|
|
|
|
|
|
# But let's still warn about any unreadable or non-directories given |
291
|
|
|
|
|
|
|
|
292
|
0
|
|
|
|
|
|
my @debug; |
293
|
0
|
|
|
|
|
|
%seen = (); |
294
|
0
|
|
|
|
|
|
@user_dir = grep { !$seen{$_}++ } map {File::Spec->canonpath($_)}@user_dir; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
295
|
0
|
0
|
|
|
|
|
if (@user_dir > @mod_dir) { |
296
|
|
|
|
|
|
|
#%seen = map {$_ => undef} @mod_dir; |
297
|
0
|
|
|
|
|
|
%seen = (); |
298
|
0
|
|
|
|
|
|
@seen{@mod_dir} = (); |
299
|
0
|
|
|
|
|
|
my @difference = grep { !$seen{$_}++ }@user_dir; |
|
0
|
|
|
|
|
|
|
300
|
0
|
|
|
|
|
|
foreach my $element (@difference) { |
301
|
0
|
0
|
|
|
|
|
if (! -d $element) { |
|
|
0
|
|
|
|
|
|
302
|
0
|
0
|
|
|
|
|
if ( grep {$_ eq $element} map {File::Spec->canonpath($_)}@INC) { |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
303
|
0
|
|
|
|
|
|
warn "$element is in the Perl include path, but is not a directory"; |
304
|
|
|
|
|
|
|
} |
305
|
|
|
|
|
|
|
else { |
306
|
0
|
|
|
|
|
|
warn "$element is not a directory"; |
307
|
|
|
|
|
|
|
} |
308
|
0
|
|
|
|
|
|
push @debug, $element; |
309
|
|
|
|
|
|
|
} |
310
|
|
|
|
|
|
|
elsif (! -r $element) { |
311
|
0
|
0
|
|
|
|
|
if ( grep {$_ eq $element} map {File::Spec->canonpath($_)}@INC) { |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
312
|
0
|
|
|
|
|
|
warn "$element is in the Perl include path, but is not readable"; |
313
|
|
|
|
|
|
|
} |
314
|
|
|
|
|
|
|
else { |
315
|
0
|
|
|
|
|
|
warn "$element is not a readable directory"; |
316
|
|
|
|
|
|
|
} |
317
|
|
|
|
|
|
|
|
318
|
0
|
|
|
|
|
|
push @debug, $element; |
319
|
|
|
|
|
|
|
} |
320
|
|
|
|
|
|
|
} |
321
|
|
|
|
|
|
|
} |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
|
324
|
0
|
0
|
|
|
|
|
error_msg("Search directories are invalid") unless @mod_dir >= 1; |
325
|
|
|
|
|
|
|
|
326
|
0
|
|
|
|
|
|
return @mod_dir; |
327
|
|
|
|
|
|
|
} |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
sub get_input { |
330
|
|
|
|
|
|
|
|
331
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
332
|
0
|
|
|
|
|
|
my $args = process_args(@_, \&check_module_args); |
333
|
0
|
|
|
|
|
|
my %input = (); |
334
|
0
|
|
0
|
|
|
|
$input{'files_in'} = $args->{'files_in'} || undef; |
335
|
0
|
|
0
|
|
|
|
$input{'sort_by'} = $args->{'sort_by'} || 'name'; |
336
|
0
|
|
0
|
|
|
|
$input{'from'} = $args->{'from'} || \@INC; |
337
|
0
|
|
0
|
|
|
|
$input{'show_only'} = $args->{'show_only'} || ""; |
338
|
0
|
|
|
|
|
|
$input{'color_specs'} = $args->{'color'}; |
339
|
0
|
|
|
|
|
|
$input{'link'} = $args->{'link'}; |
340
|
|
|
|
|
|
|
$input{'section'} = exists $args->{'section'} ? $args->{'section'} : |
341
|
0
|
0
|
|
|
|
|
$input{'show_only'} eq 'core' ? 'Core Perl modules installed' : ''; |
|
|
0
|
|
|
|
|
|
342
|
0
|
0
|
|
|
|
|
$input{'full_page'} = exists $args->{'full_page'} ? $args->{'full_page'} : $self->{'full_page'}; |
343
|
0
|
0
|
|
|
|
|
$input{'show_inc'} = exists $args->{'show_inc'} ? $args->{'show_inc'} : 1; |
344
|
0
|
0
|
|
|
|
|
$input{'show_dir'} = exists $args->{'show_dir'} ? $args->{'show_dir'} : 0; |
345
|
0
|
0
|
|
|
|
|
$input{'columns'} = exists $args->{'columns'} ? $args->{'columns'} : ['name','version','desc']; |
346
|
0
|
|
|
|
|
|
return %input; |
347
|
|
|
|
|
|
|
} |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
sub print_modules { |
350
|
|
|
|
|
|
|
|
351
|
0
|
|
|
0
|
1
|
|
my %input = get_input(@_); |
352
|
|
|
|
|
|
|
|
353
|
0
|
|
|
|
|
|
my ($found_mod, $mod_count, $overall_total, @mod_dir, $core_dir1, $core_dir2); |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
# Check to see if a search is even needed |
356
|
0
|
0
|
|
|
|
|
if (defined $input{'files_in'}) { |
357
|
|
|
|
|
|
|
|
358
|
0
|
|
|
|
|
|
my @files = @{ $input{'files_in'} }; |
|
0
|
|
|
|
|
|
|
359
|
0
|
|
|
|
|
|
my %found_mod = (); |
360
|
|
|
|
|
|
|
|
361
|
0
|
|
|
|
|
|
foreach my $file_path (@files) { |
362
|
|
|
|
|
|
|
|
363
|
0
|
|
|
|
|
|
my $mod_info = get_files_in($file_path); |
364
|
0
|
0
|
|
|
|
|
next unless (ref $mod_info eq 'HASH'); |
365
|
0
|
|
|
|
|
|
$found_mod{$mod_info->{'name'}} = $mod_info; |
366
|
|
|
|
|
|
|
} |
367
|
0
|
0
|
|
|
|
|
return undef unless (keys %found_mod > 0); |
368
|
0
|
|
|
|
|
|
$found_mod = \%found_mod; |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
else { |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
# Get ready to search |
373
|
0
|
|
|
|
|
|
$core_dir1 = File::Spec->canonpath($Config{installarchlib}); |
374
|
0
|
|
|
|
|
|
$core_dir2 = File::Spec->canonpath($Config{installprivlib}); |
375
|
|
|
|
|
|
|
|
376
|
0
|
|
|
|
|
|
@mod_dir = search_dir($input{'from'}, $input{'show_only'}, $core_dir1, $core_dir2); |
377
|
|
|
|
|
|
|
|
378
|
0
|
|
|
|
|
|
($overall_total, $found_mod, $mod_count) = find_modules($input{'show_only'}, \@mod_dir); |
379
|
|
|
|
|
|
|
|
380
|
0
|
0
|
|
|
|
|
return undef unless $overall_total; |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
} |
383
|
|
|
|
|
|
|
|
384
|
0
|
|
|
|
|
|
my @sorted_modules = sort_modules($found_mod, $input{'sort_by'}); |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
my $html .= html_setup( $_[0], |
387
|
|
|
|
|
|
|
$input{'columns'}, |
388
|
|
|
|
|
|
|
$input{'color_specs'}, |
389
|
|
|
|
|
|
|
$input{'section'}, |
390
|
0
|
|
|
|
|
|
$input{'full_page'} |
391
|
|
|
|
|
|
|
); |
392
|
|
|
|
|
|
|
|
393
|
0
|
|
|
|
|
|
my $numberof_columns = scalar @{$input{'columns'}}; |
|
0
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
|
395
|
0
|
|
|
|
|
|
foreach my $module (@sorted_modules) { |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
$html .= print_table_row_color( $numberof_columns, |
398
|
|
|
|
|
|
|
module_color_check($module->{'name'}, $input{'color_specs'}), |
399
|
|
|
|
|
|
|
map{ |
400
|
0
|
0
|
|
|
|
|
if ($_ eq 'name') { |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
401
|
0
|
|
|
|
|
|
add_link('cpan', $module->{'name'}, $input{'link'}); |
402
|
|
|
|
|
|
|
} |
403
|
|
|
|
|
|
|
elsif ($_ eq 'core') { |
404
|
0
|
0
|
|
|
|
|
(grep File::Spec->rel2abs($module->{'path'}) =~ /\Q$_/, ($core_dir1, $core_dir2)) ? 'yes' : 'no'; |
405
|
|
|
|
|
|
|
} |
406
|
|
|
|
|
|
|
elsif ($_ eq 'path') { |
407
|
0
|
|
|
|
|
|
add_link('local', $module->{'path'}); |
408
|
|
|
|
|
|
|
} |
409
|
|
|
|
|
|
|
else { |
410
|
0
|
|
|
|
|
|
$module->{$_}; |
411
|
|
|
|
|
|
|
} |
412
|
|
|
|
|
|
|
|
413
|
0
|
|
|
|
|
|
} @{$input{'columns'}} ); |
|
0
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
} |
415
|
|
|
|
|
|
|
|
416
|
0
|
|
|
|
|
|
$html .= print_table_end(); |
417
|
|
|
|
|
|
|
|
418
|
0
|
0
|
0
|
|
|
|
unless (defined $input{'files_in'} && ref $input{'files_in'} eq 'ARRAY') { |
419
|
|
|
|
|
|
|
$html .= print_module_results( \@mod_dir, |
420
|
|
|
|
|
|
|
$mod_count, |
421
|
|
|
|
|
|
|
$input{'from'}, |
422
|
|
|
|
|
|
|
$overall_total, |
423
|
0
|
0
|
|
|
|
|
$input{'show_dir'}) if $input{'show_inc'}; |
424
|
|
|
|
|
|
|
} |
425
|
|
|
|
|
|
|
|
426
|
0
|
0
|
|
|
|
|
$html .= " |