The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# This file is part of App-Magpie
#
# This software is copyright (c) 2011 by Jerome Quelin.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#
use 5.012;
use strict;
use warnings;

package App::Magpie::Action::DWIM;
# ABSTRACT: dwim command implementation
$App::Magpie::Action::DWIM::VERSION = '2.010';
use File::pushd;
use Moose;
use Parallel::ForkManager;

use App::Magpie::Action::Checkout;
use App::Magpie::Action::Old;
use App::Magpie::Action::Update;

with 'App::Magpie::Role::Logging';



sub run {
    my ($self, $directory) = @_;
    
    my @sets = App::Magpie::Action::Old->new->run;
    my ($normal) = grep { $_->name eq "normal" } @sets;
    if ( not defined $normal ) {
        $self->log( "no package to update" );
        return;
    }
    my @modules = $normal->all_modules;

    my $pm = Parallel::ForkManager->new(5);
    my @failed;
    $pm->run_on_finish( sub {
            my ($pid, $rv, $id, $signal, $core, $data) = @_;
            push @failed, $id if $rv;
            print $data;
        } );

    # loop around the modules
    my %seen;
    foreach my $module (@modules) {
        my $pkg = ( $module->packages )[0];
        my $modname = $module->name;
        my $pkgname = $pkg->name;
        next if $seen{$pkgname}++; # do not try to update a pkg more than once

        # forks and returns the pid for the child:
        my $pid = $pm->start($pkgname) and next;

        $self->log( "updating " . $modname
            . " from " .  $module->oldver
            . " to "   . $module->newver
            . " in "   . $pkgname );

        # check out the package
        my $pkgdir = App::Magpie::Action::Checkout->new->run( $pkg->name, $directory );
        my $old = pushd( $pkgdir );

        # update the package
        eval { App::Magpie::Action::Update->new->run; };
        my $rv = $@ ? 1 : 0;
        $pm->finish( $rv ); # Terminates the child process
    }
    $pm->wait_all_children;
    $self->log( "error while updating: $_" ) for sort @failed;
}



1;

__END__

=pod

=encoding UTF-8

=head1 NAME

App::Magpie::Action::DWIM - dwim command implementation

=head1 VERSION

version 2.010

=head1 SYNOPSIS

    my $dwim = App::Magpie::Action::DWIM->new;
    $dwim->run;

=head1 DESCRIPTION

This module implements the C<dwim> action. It's in a module of its own
to be able to be C<require>-d without loading all other actions.

=head1 METHODS

=head2 run

    $dwim->run;

Update Mageia packages of Perl modules with a new version available on
CPAN.

=head1 AUTHOR

Jerome Quelin <jquelin@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Jerome Quelin.

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

=cut