App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN/Deploy.pm view on Meta::CPAN
foreach my $dist ( values %$snapshot_info )
{
my $src = $dist->{pathname};
foreach my $provide ( keys %{ $dist->{provides} } )
{
if ( exists $srcs{$provide} )
{
error "Found duplicate distribution for $provide in $file.snapshot";
info " $src and $srcs{$provide} both provide the same module";
info " This will cause an error if it is used as a dependency";
$srcs{$provide} = undef;
next;
}
$srcs{$provide} = $src;
}
foreach my $req ( keys %{ $dist->{requirements} } )
{
$reqs{$req} = undef;
}
}
if ( ref $opts->{source} eq 'HASH' )
{
%srcs = ( %srcs, %{ $opts->{source} } );
}
$opts->{source} = { %reqs, %srcs };
$opts->{update} = 0;
$opts->{'only-sources'} = 1;
$opts->{'smart-tests'} = 1
if !defined $opts->{'smart-tests'};
}
my $result;
$opts->{update} //= 0;
if ( !$opts->{'skip-perl'} )
{
$result = App::MechaCPAN::Perl->go($opts);
return $result if $result;
}
$result = App::MechaCPAN::Install->go( $opts, @reqs );
return $result if $result;
return 0;
}
my $snapshot_re = qr/^\# carton snapshot format: version 1\.0/;
sub parse_snapshot
{
my $file = shift;
my $result = {};
open my $snap_fh, '<', $file;
if ( my $line = <$snap_fh> !~ $snapshot_re )
{
die "File doesn't looks like a carton snapshot: $file";
}
my @stack = ($result);
my $prefix = '';
while ( my $line = <$snap_fh> )
{
chomp $line;
if ( $line =~ m/^ \Q$prefix\E (\S+?) :? $/xms )
{
my $new_depth = {};
$stack[0]->{$1} = $new_depth;
unshift @stack, $new_depth;
$prefix = ' ' x $#stack;
next;
}
if ( $line =~ m/^ \Q$prefix\E (\S+?) (?: :? \s (.*) )? $/xms )
{
$stack[0]->{$1} = $2;
next;
}
if ( $line !~ m/^ \Q$prefix\E /xms )
{
shift @stack;
$prefix = ' ' x $#stack;
redo;
}
die "Unable to parse snapshot (line $.)\n";
}
return $result->{DISTRIBUTIONS};
}
1;
__END__
=encoding utf-8
=head1 NAME
App::MechaCPAN::Deploy - Mechanize the deployment of CPAN things.
=head1 SYNOPSIS
# Install perl and everything from the cpanfile into local/
# If cpanfile.snapshot exists, it will be consulted exclusivly
user@host:~$ mechacpan deploy
user@host:~$ mechacpan deploy git://git@example.com/MyApp.git
user@host:~$ zhuli do the thing
=head1 DESCRIPTION
=head2 Deploy
user@host:~$ mechacpan deploy
The C<deploy> command is used for automating a deployment. It will install both L<perl> and all the modules specified from the C<cpanfile>.
( run in 0.871 second using v1.01-cache-2.11-cpan-39bf76dae61 )