File Coverage

blib/lib/CPAN/Packager/Util.pm
Criterion Covered Total %
statement 33 55 60.0
branch 5 14 35.7
condition 2 15 13.3
subroutine 8 10 80.0
pod 0 3 0.0
total 48 97 49.4


line stmt bran cond sub pod time code
1             package CPAN::Packager::Util;
2 3     3   828 use strict;
  3         6  
  3         163  
3 3     3   19 use warnings;
  3         5  
  3         94  
4 3     3   17 use List::Util qw/first/;
  3         6  
  3         386  
5 3     3   2839 use IPC::Cmd qw(run);
  3         152588  
  3         192  
6 3     3   3481 use Log::Log4perl qw(:easy);
  3         119665  
  3         27  
7 3     3   6785 use CPAN::Packager::ListUtil qw(any);
  3         8  
  3         1952  
8              
9             our $DEFAULT_COMMAND_TIMEOUT = 30 * 60;
10             our $DEFAULT_VERVOSE_MODE = 0;
11             our @EXCLUSION_MODULE_LIST = ('File::Path', 'PathTools', 'ExtUtils::MakeMaker');
12              
13             sub topological_sort {
14 9     9 0 14 my ( $target, $modules ) = @_;
15 9         10 my @results;
16              
17 9 50       24 if ( $modules->{$target} ) {
18 9         14 push @results, $modules->{$target};
19 9 100 66     34 if ( $modules->{$target}->{depends}
  5         21  
20             && @{ $modules->{$target}->{depends} } )
21             {
22 5         9 for my $mod ( @{ $modules->{$target}->{depends} } ) {
  5         13  
23 6 50   18   40 if(any { $mod eq $_ } @EXCLUSION_MODULE_LIST) {
  18         58  
24 0         0 next;
25             }
26              
27             # ex) fix for List::AllUtils
28 6 50       21 if ( $mod eq $target ) {
29 0         0 next;
30             }
31              
32 6         19 my $result = CPAN::Packager::Util::topological_sort( $mod,
33             $modules );
34 6         8 push @results, @{$result};
  6         16  
35             }
36             }
37             }
38             else {
39 0         0 print("skipped $target. no meta data found.\n");
40             }
41              
42 9         19 return \@results;
43             }
44              
45             sub run_command {
46 0     0 0   my ( $cmd, $verbose, $timeout ) = @_;
47              
48 0   0       $verbose ||= $DEFAULT_VERVOSE_MODE;
49 0   0       $timeout ||= $DEFAULT_COMMAND_TIMEOUT;
50 0           my $buffer;
51 0 0         if (scalar run(
52             command => $cmd,
53             verbose => $verbose,
54             buffer => \$buffer,
55             timeout => $timeout,
56             )
57             )
58             {
59 0           DEBUG("success running: `$cmd`");
60 0           return 0;
61             }
62             else {
63 0           WARN("running `$cmd` failed: $buffer");
64 0           return 1;
65             }
66             }
67              
68             sub capture_command {
69 0     0 0   my ( $cmd, $verbose, $timeout ) = @_;
70              
71 0   0       $verbose ||= $DEFAULT_VERVOSE_MODE;
72 0   0       $timeout ||= $DEFAULT_COMMAND_TIMEOUT;
73 0           my $buffer;
74 0           my $success = run(
75             command => $cmd,
76             verbose => $verbose,
77             buffer => \$buffer,
78             timeout => $timeout,
79             );
80            
81 0 0         $buffer = '' if(!defined $buffer);
82 0 0         if($success) {
83 0           DEBUG("0 exit code from '$cmd': $buffer")
84             } else {
85 0           DEBUG("non-zero exit code from '$cmd': $buffer")
86             }
87 0           return $buffer;
88             }
89              
90             1;
91              
92             =head1 NAME
93              
94             CPAN::Packager::Util - Utility class
95              
96             =head1 SYNOPSIS
97              
98             use CPAN::Packager::Util;
99              
100             =head1 DESCRIPTION
101              
102              
103             =head1 AUTHOR
104              
105             Takatoshi Kitano Ekitano.tk@gmail.comE
106              
107             =head1 SEE ALSO
108              
109             =head1 LICENSE
110              
111             This library is free software; you can redistribute it and/or modify
112             it under the same terms as Perl itself.
113              
114             =cut