CPAN::Packager::Util - Utility class


CPAN-Packager documentation Contained in the CPAN-Packager distribution.

Index


Code Index:

NAME

Top

CPAN::Packager::Util - Utility class

SYNOPSIS

Top

  use CPAN::Packager::Util;

DESCRIPTION

Top

AUTHOR

Top

Takatoshi Kitano <kitano.tk@gmail.com>

SEE ALSO

Top

LICENSE

Top

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


CPAN-Packager documentation Contained in the CPAN-Packager distribution.

package CPAN::Packager::Util;
use strict;
use warnings;
use List::Util qw/first/;
use IPC::Cmd qw(run);
use Log::Log4perl qw(:easy);
use CPAN::Packager::ListUtil qw(any);

our $DEFAULT_COMMAND_TIMEOUT = 30 * 60;
our $DEFAULT_VERVOSE_MODE    = 0;
our @EXCLUSION_MODULE_LIST = ('File::Path', 'PathTools', 'ExtUtils::MakeMaker');

sub topological_sort {
    my ( $target, $modules ) = @_;
    my @results;

    if ( $modules->{$target} ) {
        push @results, $modules->{$target};
        if ( $modules->{$target}->{depends}
            && @{ $modules->{$target}->{depends} } )
        {
            for my $mod ( @{ $modules->{$target}->{depends} } ) {
                if(any { $mod eq $_ } @EXCLUSION_MODULE_LIST) {
                    next;
                }

                # ex) fix for List::AllUtils
                if ( $mod eq $target ) {
                    next;
                }

                my $result = CPAN::Packager::Util::topological_sort( $mod,
                    $modules );
                push @results, @{$result};
            }
        }
    }
    else {
        print("skipped $target. no meta data found.\n");
    }

    return \@results;
}

sub run_command {
    my ( $cmd, $verbose, $timeout ) = @_;

    $verbose ||= $DEFAULT_VERVOSE_MODE;
    $timeout ||= $DEFAULT_COMMAND_TIMEOUT;
    my $buffer;
    if (scalar run(
            command => $cmd,
            verbose => $verbose,
            buffer  => \$buffer,
            timeout => $timeout,
        )
        )
    {
        DEBUG("success running: `$cmd`");
        return 0;
    }
    else {
        WARN("running `$cmd` failed: $buffer");
        return 1;
    }
}

sub capture_command {
    my ( $cmd, $verbose, $timeout ) = @_;

    $verbose ||= $DEFAULT_VERVOSE_MODE;
    $timeout ||= $DEFAULT_COMMAND_TIMEOUT;
    my $buffer;
    my $success = run(
            command => $cmd,
            verbose => $verbose,
            buffer  => \$buffer,
            timeout => $timeout,
        );
    
    $buffer = '' if(!defined $buffer);
    if($success) {
        DEBUG("0 exit code from '$cmd': $buffer")
    } else {
        DEBUG("non-zero exit code from '$cmd': $buffer")
    }
    return $buffer;
}

1;