CPAN-Mini-Inject
view release on metacpan or search on metacpan
lib/CPAN/Mini/Inject.pm view on Meta::CPAN
Packages found in the distribution will be added to the module list
For example both C<CPAN::Mini::Inject> and
C<CPAN::Mini::Inject::Config> will be added to the F<modulelist> file
in the repository.
Packages will be looked for in the C<provides> key of the META file if
present, otherwise the files in the dist will be searched. See
L<Dist::Metadata> for more information.
=over 4
=item * module
(optional) The package name of the module to add. The distribution
file will be searched for modules but you can specify the main one
explicitly.
=item * authorid
(required) The CPAN ID of the module's author. Since this isn't
actually CPAN, the ID does not need to exist on CPAN. Typically, this
ID uses C<[A-Z]> and is three to ten letters. This is not enforced,
but other CPAN tools may not like other sorts of names.
=item * version
(optional) The module's version number. If you don't specify this.
C<add> will try to extract it from the distribution.
=item * file
(required) The path to the distribution file.
=back
$mcpani->add(
module => 'Module::Name',
authorid => 'SOMEAUTHOR',
version => 0.01,
file => './Module-Name-0.01.tar.gz'
);
=cut
sub add {
my $self = shift;
my %options = @_;
my $optionchk
= _optionchk( \%options, qw/authorid file/ );
croak "$0: required option not specified: $optionchk" if $optionchk;
croak "$0: no repository configured"
unless $self->config->get( 'repository' );
croak sprintf "$0: cannot write to repository <%s>", $self->config->get( 'repository' )
unless -w $self->config->get( 'repository' );
croak "$0: cannot read module file: $options{file}"
unless -r $options{file};
# attempt to guess module and version
my $distmeta = Dist::Metadata->new( file => $options{file} );
my $packages = $distmeta->package_versions;
# include passed in module and version (prefer the declared version)
if ( $options{module} and $options{version} ) {
$packages->{ $options{module} } ||= $options{version};
}
# if no packages were found we need explicit options
if ( !keys %$packages ) {
$optionchk = _optionchk( \%options, qw/module version/ );
croak "$0: required option not specified and no modules were found: $optionchk"
if $optionchk;
}
my $modulefile = basename( $options{file} );
$self->readlist unless exists( $self->{modulelist} );
$options{authorid} = uc( $options{authorid} );
$self->{authdir} = $self->_authordir( $options{authorid},
$self->config->get( 'repository' ) );
my $target
= $self->config->get( 'repository' )
. '/authors/id/'
. $self->{authdir} . '/'
. basename( $options{file} );
copy( $options{file}, dirname( $target ) )
or croak "$0: copy failed while adding disribution from <%s> to <%s>: $!", $options{file}, dirname( $target );
$self->_updperms( $target );
{
my $mods = join('|', keys %$packages);
# remove old versions from the list
@{ $self->{modulelist} }
= grep { $_ !~ m/\A($mods)\s+/ } @{ $self->{modulelist} };
}
# make data available afterwards (since method returns $self)
push @{ $self->{added_modules} ||= [] },
{ file => $modulefile, authorid => $options{authorid}, modules => $packages };
push(
@{ $self->{modulelist} },
map {
_fmtmodule(
$_, File::Spec::Unix->catfile( File::Spec->splitdir( $self->{authdir} ), $modulefile ),
defined($packages->{$_}) ? $packages->{$_} : 'undef'
)
} keys %$packages
);
return $self;
}
=item C<added_modules>
( run in 4.179 seconds using v1.01-cache-2.11-cpan-d01c6094234 )