App-perlbrew
view release on metacpan or search on metacpan
lib/App/perlbrew.pm view on Meta::CPAN
system( "$0 env $dist > " . $pb_home->child("init") );
print "Switched to $dist.\n\n";
}
else {
$self->launch_sub_shell($dist);
}
}
sub run_command_off {
my $self = shift;
$self->launch_sub_shell;
}
sub run_command_switch_off {
my $self = shift;
my $pb_home = $self->home;
$pb_home->mkpath;
system( "env PERLBREW_PERL= $0 env > " . $pb_home->child("init") );
print "\nperlbrew is switched off. Please exit this shell and start a new one to make it effective.\n";
print
"To immediately make it effective, run this line in this terminal:\n\n exec @{[ $self->env('SHELL') ]}\n\n";
}
sub shell_env {
my ( $self, $env ) = @_;
my %env = %$env;
my @statements;
for my $k ( sort keys %env ) {
my $v = $env{$k};
if ( defined($v) && $v ne '' ) {
$v =~ s/(\\")/\\$1/g;
push @statements, ["set", $k, $v];
}
else {
push @statements, ["unset", $k];
}
}
my $statements = "";
if ( $self->env('SHELL') =~ /(ba|k|z|\/)sh\d?$/ ) {
for (@statements) {
my ( $o, $k, $v ) = @$_;
if ( $o eq 'unset' ) {
$statements .= "unset $k\n";
}
else {
$v =~ s/(\\")/\\$1/g;
$statements .= "export $k=\"$v\"\n";
}
}
}
else {
for (@statements) {
my ( $o, $k, $v ) = @$_;
if ( $o eq 'unset' ) {
$statements .= "unsetenv $k\n";
}
else {
$statements .= "setenv $k \"$v\"\n";
}
}
}
return $statements;
}
sub run_command_env {
my ( $self, $name ) = @_;
print $self->shell_env({ $self->perlbrew_env($name) });
}
sub run_command_symlink_executables {
my ( $self, @perls ) = @_;
my $root = $self->root;
unless (@perls) {
@perls = map { $_->name } grep { -d $_ && !-l $_ } $root->perls->list;
}
for my $perl (@perls) {
for my $executable ( $root->perls($perl)->bin->children ) {
my ( $name, $version ) = $executable =~ m/bin\/(.+?)(5\.\d.*)?$/;
next unless $version;
$executable->symlink( $root->perls($perl)->bin($name) );
$executable->symlink( $root->perls($perl)->perl ) if $name eq "cperl";
}
}
}
sub run_command_install_patchperl {
my ($self) = @_;
$self->do_install_program_from_url(
'https://raw.githubusercontent.com/gugod/patchperl-packing/master/patchperl',
'patchperl',
sub {
my ($body) = @_;
$body =~ s/\A#!.+?\n/ $self->system_perl_shebang . "\n" /se;
return $body;
}
);
}
sub run_command_install_cpanm {
my ($self) = @_;
$self->do_install_program_from_url(
'https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm' => 'cpanm' );
}
sub run_command_install_cpm {
my ($self) = @_;
$self->do_install_program_from_url( 'https://raw.githubusercontent.com/skaji/cpm/main/cpm' => 'cpm' );
}
sub run_command_self_upgrade {
my ($self) = @_;
require FindBin;
lib/App/perlbrew.pm view on Meta::CPAN
perlbrew_command="perlbrew"
fi
__perlbrew_activate
RC
}
sub BASH_COMPLETION_CONTENT() {
return <<'COMPLETION';
if [[ -n ${ZSH_VERSION-} ]]; then
autoload -U +X bashcompinit && bashcompinit
fi
export PERLBREW="command perlbrew"
_perlbrew_compgen()
{
COMPREPLY=( $($PERLBREW compgen $COMP_CWORD ${COMP_WORDS[*]}) )
}
complete -F _perlbrew_compgen perlbrew
COMPLETION
}
sub PERLBREW_FISH_CONTENT {
return "set -x PERLBREW_SHELLRC_VERSION $VERSION\n" . <<'END';
function __perlbrew_reinit
if not test -d "$PERLBREW_HOME"
mkdir -p "$PERLBREW_HOME"
end
echo '# DO NOT EDIT THIS FILE' > "$PERLBREW_HOME/init"
command perlbrew env $argv[1] | \grep PERLBREW_ >> "$PERLBREW_HOME/init"
__source_init
__perlbrew_set_path
end
function __perlbrew_set_path
set -l MANPATH_WITHOUT_PERLBREW (perl -e 'print join ":", grep { index($_, $ENV{PERLBREW_HOME}) < 0 } grep { index($_, $ENV{PERLBREW_ROOT}) < 0 } split/:/,qx(manpath 2> /dev/null);')
if test -n "$PERLBREW_MANPATH"
set -l PERLBREW_MANPATH $PERLBREW_MANPATH":"
set -x MANPATH {$PERLBREW_MANPATH}{$MANPATH_WITHOUT_PERLBREW}
else
set -x MANPATH $MANPATH_WITHOUT_PERLBREW
end
set -l PATH_WITHOUT_PERLBREW (eval $perlbrew_command display-pristine-path | perl -pe'y/:/ /')
# silencing stderr in case there's a non-existent path in $PATH (see GH#446)
if test -n "$PERLBREW_PATH"
set -x PERLBREW_PATH (echo $PERLBREW_PATH | perl -pe 'y/:/ /' )
eval set -x PATH $PERLBREW_PATH $PATH_WITHOUT_PERLBREW 2> /dev/null
else
eval set -x PATH $PERLBREW_ROOT/bin $PATH_WITHOUT_PERLBREW 2> /dev/null
end
end
function __perlbrew_set_env
set -l code (eval $perlbrew_command env $argv | perl -pe 's/^(export|setenv)/set -xg/; s/=/ /; s/^unset(env)* (.*)/if test -n "\$$2"; set -eg $2; end/; s/$/;/; y/:/ /')
if test -z "$code"
return 0;
else
eval $code
end
end
function __perlbrew_activate
functions -e perl
if test -n "$PERLBREW_PERL"
if test -z "${PERLBREW_LIB:-}"
__perlbrew_set_env $PERLBREW_PERL
else
__perlbrew_set_env $PERLBREW_PERL@${PERLBREW_LIB:-}
end
end
__perlbrew_set_path
end
function __perlbrew_deactivate
__perlbrew_set_env
set -x PERLBREW_PERL
set -x PERLBREW_LIB
set -x PERLBREW_PATH
__perlbrew_set_path
end
function perlbrew
test -z "$argv"
and echo " Usage: perlbrew <command> [options] [arguments]"
and echo " or: perlbrew help"
and return 1
switch $argv[1]
case use
if test ( count $argv ) -eq 1
if test -z "$PERLBREW_PERL"
echo "Currently using system perl"
else
echo "Currently using $PERLBREW_PERL"
end
else
__perlbrew_set_env $argv[2]
if test "$status" -eq 0
__perlbrew_set_path
end
end
case switch
if test ( count $argv ) -eq 1
command perlbrew switch
else
perlbrew use $argv[2]
if test "$status" -eq 0
__perlbrew_reinit $argv[2]
end
end
case off
__perlbrew_deactivate
echo "perlbrew is turned off."
case switch-off
__perlbrew_deactivate
__perlbrew_reinit
echo "perlbrew is switched off."
case '*'
command perlbrew $argv
end
end
function __source_init
perl -pe 's/^(export|setenv)/set -xg/; s/^unset(env)* (.*)/if test -n "\$$2"; set -eg $2; end/; s/=/ /; s/$/;/;' "$PERLBREW_HOME/init" | source
end
if test -z "$PERLBREW_ROOT"
set -x PERLBREW_ROOT "$HOME/perl5/perlbrew"
end
if test -z "$PERLBREW_HOME"
set -x PERLBREW_HOME "$HOME/.perlbrew"
end
if test -z "$PERLBREW_SKIP_INIT" -a -f "$PERLBREW_HOME/init"
__source_init
end
set perlbrew_bin_path "$PERLBREW_ROOT/bin"
if test -f "$perlbrew_bin_path/perlbrew"
set perlbrew_command "$perlbrew_bin_path/perlbrew"
else
set perlbrew_command perlbrew
end
set -e perlbrew_bin_path
__perlbrew_activate
## autocomplete stuff #############################################
function __fish_perlbrew_needs_command
set cmd (commandline -opc)
if test (count $cmd) -eq 1 -a $cmd[1] = 'perlbrew'
return 0
end
return 1
end
function __fish_perlbrew_using_command
set cmd (commandline -opc)
if test (count $cmd) -gt 1
if [ $argv[1] = $cmd[2] ]
return 0
end
end
end
for com in (perlbrew help | perl -ne'print lc if s/^COMMAND:\s+//')
complete -f -c perlbrew -n '__fish_perlbrew_needs_command' -a $com
end
for com in switch use;
complete -f -c perlbrew -n "__fish_perlbrew_using_command $com" \
-a '(perlbrew list | perl -pe\'s/\*?\s*(\S+).*/$1/\')'
end
END
}
sub CSH_WRAPPER_CONTENT {
return <<'WRAPPER';
set perlbrew_exit_status=0
if ( "$1" =~ -* ) then
set perlbrew_short_option="$1"
shift
else
set perlbrew_short_option=""
endif
switch ( "$1" )
case use:
if ( $%2 == 0 ) then
if ( $?PERLBREW_PERL == 0 ) then
echo "Currently using system perl"
else
if ( $%PERLBREW_PERL == 0 ) then
echo "Currently using system perl"
else
echo "Currently using $PERLBREW_PERL"
endif
endif
else
set perlbrew_line_count=0
foreach perlbrew_line ( "`\perlbrew env $2:q`" )
eval "$perlbrew_line"
@ perlbrew_line_count++
end
if ( $perlbrew_line_count == 0 ) then
set perlbrew_exit_status=1
else
source "$PERLBREW_ROOT/etc/csh_set_path"
endif
endif
breaksw
case switch:
if ( $%2 == 0 ) then
\perlbrew switch
else
perlbrew use "$2" && source "$PERLBREW_ROOT/etc/csh_reinit" "$2"
endif
breaksw
case off:
unsetenv PERLBREW_PERL
foreach perlbrew_line ( "`\perlbrew env`" )
eval "$perlbrew_line"
end
source "$PERLBREW_ROOT/etc/csh_set_path"
echo "perlbrew is turned off."
breaksw
case switch-off:
unsetenv PERLBREW_PERL
source "$PERLBREW_ROOT/etc/csh_reinit" ''
echo "perlbrew is switched off."
breaksw
default:
\perlbrew $perlbrew_short_option:q $argv:q
set perlbrew_exit_status=$?
breaksw
endsw
rehash
exit $perlbrew_exit_status
WRAPPER
}
sub CSH_REINIT_CONTENT {
return <<'REINIT';
if ( ! -d "$PERLBREW_HOME" ) then
mkdir -p "$PERLBREW_HOME"
endif
echo '# DO NOT EDIT THIS FILE' >! "$PERLBREW_HOME/init"
\perlbrew env $1 >> "$PERLBREW_HOME/init"
source "$PERLBREW_HOME/init"
source "$PERLBREW_ROOT/etc/csh_set_path"
REINIT
}
sub CSH_SET_PATH_CONTENT {
return <<'SETPATH';
unalias perl
if ( $?PERLBREW_PATH == 0 ) then
setenv PERLBREW_PATH "$PERLBREW_ROOT/bin"
endif
setenv PATH_WITHOUT_PERLBREW `perl -e 'print join ":", grep { index($_, $ENV{PERLBREW_ROOT}) } split/:/,$ENV{PATH};'`
setenv PATH "${PERLBREW_PATH}:${PATH_WITHOUT_PERLBREW}"
setenv MANPATH_WITHOUT_PERLBREW `perl -e 'print join ":", grep { index($_, $ENV{PERLBREW_ROOT}) } split/:/,qx(manpath 2> /dev/null);'`
if ( $?PERLBREW_MANPATH == 1 ) then
setenv MANPATH "${PERLBREW_MANPATH}:${MANPATH_WITHOUT_PERLBREW}"
else
setenv MANPATH "${MANPATH_WITHOUT_PERLBREW}"
endif
SETPATH
}
sub CSHRC_CONTENT {
return "setenv PERLBREW_SHELLRC_VERSION $VERSION\n\n" . <<'CSHRC';
if ( $?PERLBREW_HOME == 0 ) then
setenv PERLBREW_HOME "$HOME/.perlbrew"
endif
if ( $?PERLBREW_ROOT == 0 ) then
setenv PERLBREW_ROOT "$HOME/perl5/perlbrew"
endif
if ( $?PERLBREW_SKIP_INIT == 0 ) then
if ( -f "$PERLBREW_HOME/init" ) then
source "$PERLBREW_HOME/init"
endif
endif
if ( $?PERLBREW_PATH == 0 ) then
setenv PERLBREW_PATH "$PERLBREW_ROOT/bin"
endif
source "$PERLBREW_ROOT/etc/csh_set_path"
alias perlbrew 'source "$PERLBREW_ROOT/etc/csh_wrapper"'
CSHRC
}
sub append_log {
my ( $self, $message ) = @_;
my $log_handler;
open( $log_handler, '>>', $self->{log_file} )
or die "Cannot open log file for appending: $!";
print $log_handler "$message\n";
close($log_handler);
}
sub INSTALLATION_FAILURE_MESSAGE {
my ($self) = @_;
return <<FAIL;
Installation process failed. To spot any issues, check
$self->{log_file}
If some perl tests failed and you still want to install this distribution anyway,
do:
(cd $self->{dist_extracted_dir}; make install)
You might also want to try upgrading patchperl before trying again:
perlbrew install-patchperl
Generally, if you need to install a perl distribution known to have minor test
failures, do one of these commands to avoid seeing this message:
perlbrew --notest install $self->{dist_name}
perlbrew --force install $self->{dist_name}
FAIL
}
1;
__END__
=encoding utf8
=head1 NAME
App::perlbrew - Manage perl installations in your C<$HOME>
=head1 SYNOPSIS
# Installation
curl -L https://install.perlbrew.pl | bash
# Initialize
perlbrew init
( run in 0.598 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )