Vimana
view release on metacpan or search on metacpan
lib/Vimana/Installer.pm view on Meta::CPAN
is => 'rw',
isa => 'Str';
# For text type installer , target is a file path.
# For other type installer , target is a directory path.
has target =>
is => 'rw',
isa => 'Str';
# runtime path to install to.
has runtime_path =>
is => 'rw',
isa => 'Str';
# Command Object (command options)
has cmd =>
is => 'rw';
# verbose
has verbose =>
is => 'rw';
# script info from vim.org (optional)
has script_info =>
is => 'rw';
# script page info from vim.org (optional)
has script_page =>
is => 'rw';
=pod
Vimana::Installer->install( 'package name' );
Vimana::Installer->install_from_url( 'url' );
Vimana::Installer->install_from_rcs( 'git:......' );
Vimana::Installer->install_from_dir( '/path/to/plugin' );
For Text type installer, inspect content like this:
" Script type: plugin
" Script dependency:
" foo1 > 0.1
" bar2 > 0.2
"
" Description:
" ....
=cut
sub download {
my ( $self, $url, $target ) = @_;
use HTTP::Lite;
my $savetofile = sub {
my ( $self, $dataref, $cbargs ) = @_;
print STDERR ".";
print $cbargs $$dataref;
return undef;
};
my $http = new HTTP::Lite;
$http->proxy( $ENV{HTTP_PROXY} ) if $ENV{HTTP_PROXY};
open my $dl, ">", $target or die $!;
my $res = $http->request( $url, $savetofile, $dl );
close $dl;
print "\n";
}
sub get_installer {
my $self = shift;
my $type = shift;
my $class = qq{Vimana::Installer::} . ucfirst($type);
return $class->new( @_ );
}
sub install_by_strategy {
my ( $self, %args ) = @_;
my $verbose = $args{verbose};
my $ret;
# XXX: migrate this to Installer::*
my @ins_type = $self->check_strategies(
{
name => 'Makefile',
desc => q{Check if makefile exists.},
installer => 'Makefile',
deps => [qw(makefile Makefile)],
},
{
name => 'Rakefile',
desc => q{Check if rakefile exists.},
installer => 'Rakefile',
deps => [qw(rakefile Rakefile)],
});
if( @ins_type == 0 ) {
print "Package doesn't contain Rakefile or Makefile file\n" if $verbose;
print "No availiable strategy, Try to auto-install.\n" if $verbose;
push @ins_type, 'auto';
}
DONE:
for my $ins_type ( @ins_type ) {
my $installer = $self->get_installer( $ins_type, %args );
$ret = $installer->run();
last DONE if $ret; # succeed
last DONE if ! $installer->_continue; # not succeed, but we should continue other installation.
}
unless( $ret ) {
print "Installation failed.\n";
print "Vimana does not know how to install this package\n";
# XXX: provide more usable help message.
return $ret;
}
return $ret;
}
sub check_strategies {
( run in 0.496 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )