The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Dist::Zilla::Plugin::LocalBrew;
BEGIN {
  $Dist::Zilla::Plugin::LocalBrew::VERSION = '0.02';
}

use File::Spec;
use File::Temp qw(tempdir);

use namespace::clean;

use Moose;
with 'Dist::Zilla::Role::BeforeRelease';

use autodie qw(fork);

has brews => (
    is      => 'ro',
    isa     => 'ArrayRef[Str]',
    default => sub { [] },
);

sub mvp_multivalue_args {
    qw/brews/
}

sub with_perlbrew {
    my ( $self, $brew, $fn ) = @_;

    my $path         = $ENV{'PATH'};
    my $perlbrew_bin = File::Spec->catdir($ENV{'PERLBREW_ROOT'}, 'perls',
        $brew, 'bin');

    unless(-x File::Spec->catfile($perlbrew_bin, 'perl')) {
        $self->log_fatal("No such perlbrew environment '$brew'");
        return;
    }

    local $ENV{'PATH'} = $perlbrew_bin . ':' . $path;
    $fn->();
}

sub before_release {
    my ( $self, $tgz ) = @_;

    $tgz = $tgz->absolute;

    unless($ENV{'PERLBREW_ROOT'}) {
        $self->log_fatal("Environment variable 'PERLBREW_ROOT' not found");
        return;
    }

    my $cpanm_location = qx(which cpanm 2>/dev/null);
    unless($cpanm_location) {
        $self->log_fatal("The 'cpanm' program is required to use this plugin");
        return;
    }
    chomp $cpanm_location;

    my $brews = $self->brews;

    unless(@$brews) {
        $self->log_fatal('No perlbrew environments specified in your dist.ini');
    }

    foreach my $brew (@$brews) {
        $self->with_perlbrew($brew, sub {
            my $local_lib = tempdir(CLEANUP => 1);
            $self->log("Running cpanm in perlbrew environment '$brew'");

            my $pid = fork;

            if($pid) {
                waitpid $pid, 0;
                if($?) {
                    $self->log_fatal("cpanm $tgz failed in perlbrew environment '$brew'.  Check ~/.cpanm/build.log for details");
                } else {
                    $self->log("cpanm $tgz succeeded in perlbrew environment '$brew'");
                }
            } else {
                close STDOUT;
                close STDERR;
                exec 'perl', $cpanm_location, '-l', $local_lib, $tgz;
                ## handle failure?
            }
        });
    }
}

no Moose;
1;



=pod

=head1 NAME

Dist::Zilla::Plugin::LocalBrew - Verify that your distribution tests well in a fresh perlbrew

=head1 VERSION

version 0.02

=head1 SYNOPSIS

  # in your dist.ini
  [LocalBrew]
  brews = first-perlbrew
  brews = second-perlbrew

=head1 DESCRIPTION

This plugin builds and tests your module with a set of given perlbrew
environments before a release and aborts the release if testing in any
of them fails.  Any dependencies are installed via cpanminus into
a temporary local lib, so your perlbrew environments aren't altered.
This comes in handy when you want to build against a set of "fresh" Perl
installations (ie. those with only core modules) to make sure all of your
prerequisites are included correctly.

=head1 ATTRIBUTES

=head2 brews

A list of perlbrew environments to build and test in.

=head1 ISSUES

=over

=item Relies on the 'which' program to detect cpanm.

=back

=head1 SEE ALSO

L<Dist::Zilla>, L<App::perlbrew>, L<App::cpanminus>, L<local::lib>

=head1 AUTHOR

Rob Hoelz <rob@hoelz.ro>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Rob Hoelz.

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

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Dist-Zilla-Plugin-LocalBrew

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=cut


__END__

# ABSTRACT: Verify that your distribution tests well in a fresh perlbrew