package CPAN::Local::Plugin::DistroList;
  $CPAN::Local::Plugin::DistroList::VERSION = '0.003';

# ABSTRACT: Populate a mirror with a list of distributions

use strict;
use warnings;

use Path::Class qw(file dir);
use File::Temp;
use URI;
use Try::Tiny;
use LWP::Simple;
use CPAN::DistnameInfo;

use Moose;
extends 'CPAN::Local::Plugin';
with 'CPAN::Local::Role::Gather';
use namespace::clean -except => 'meta';

has list =>
    is        => 'ro',
    isa       => 'Str',
    predicate => 'has_list',

has prefix =>
    is      => 'ro',
    isa     => 'Str',
    default => '',

has uris =>
    is         => 'ro',
    isa        => 'ArrayRef',
    lazy_build => 1,
    traits     => ['Array'],
    handles    => { uri_list => 'elements' },

has cache =>
    is         => 'ro',
    isa        => 'Str',
    lazy_build => 1,

has authorid =>
    is        => 'ro',
    isa       => 'Str',
    predicate => 'has_authorid',

has local =>
    is         => 'ro',
    isa        => 'Bool',

sub _build_uris
    my $self = shift;

    my $prefix = $self->prefix;

    my @uris;

    if ( $self->has_list )
        foreach my $line ( file( $self->list )->slurp )
            chomp $line;
            push @uris, $prefix . $line;

    return \@uris;

sub _build_cache
    return File::Temp::tempdir( CLEANUP => 1 );

sub gather
    my $self = shift;

    my @distros;

    foreach my $uri ( $self->uri_list )
        my %args = $self->local
            ? ( filename => $uri )
            : ( uri => $uri, cache => $self->cache );

        $args{authorid} = $self->authorid if $self->has_authorid;
        my $distro =
            try   { $self->create_distribution(%args) }
            catch { $self->log($_) };

        push @distros, $distro if $distro;

    return @distros;

sub requires_distribution_roles { 'FromURI' }



=head1 NAME

CPAN::Local::Plugin::DistroList - Populate a mirror with a list of distributions

=head1 VERSION

version 0.003


In C<cpanlocal.ini>:

  ; Add distros from backan
  [DistroList / Backpan]
  list   = backpan.distrolist
  prefix =
  cache  = /home/user/backpan/cache

  ; Add distros from filesystem
  [DistroList / Local]
  list     = local.distrolist
  prefix   = /home/user/distros/
  local    = 1
  authorid = MYCOMPANY

In C<backpan.distrolist>:


In C<local.distrolist>:


Then simply update the repo from the command line:

  % lpan update


This plugin allows you to add distributions from a list of filenames or uris.
The list is read from a configuration file containing one distribution name
per line.



=item L<CPAN::Local::Role::Gather>



=head2 list

Required. Path to the configuration file that contains the list of
distributions. The configuration file must contain absolute paths or uris,
unless L</prefix> is specified.

=head2 prefix

Optional. String to prepend to each line in the configuration file. This is
commonly the base uri of a CPAN mirror or the path to a local folder containing
distributions. Note that the prefix is simply concatenated with each line in
the configuration file, so be careful not to omit the trailing slash where

=head2 cache

Optional. Directory where to download a remote distribution before adding it
to the mirror. If a distribtuion from the configuartion file is already in the
cache, it will not be downloaded again. Ignored when L</local> is used.

=head2 local

Optional. Instructs the plugin that the distributions live in the local
filesystem, so no attempt will be made to download or cache them.

=head2 authorid

Optional. Author id to use when injecting distributions from this list.

=head1 AUTHOR

Peter Shangov <>


This software is copyright (c) 2012 by Venda, Inc..

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