use File::Path ();
use Config;
-our $VERSION = '1.008007'; # 1.8.4
+our $VERSION = '1.008011'; # 1.8.11
our @KNOWN_FLAGS = qw(--self-contained --deactivate --deactivate-all);
my %arg_store;
for my $arg (@args) {
# check for lethal dash first to stop processing before causing problems
- if ($arg =~ /−/) {
+ # the fancy dash is U+2212 or \xE2\x88\x92
+ if ($arg =~ /\xE2\x88\x92/ or $arg =~ /−/) {
die <<'DEATH';
WHOA THERE! It looks like you've got some fancy dashes in your commandline!
These are *not* the traditional -- dashes that software recognizes. You
my $interpolate = LITERAL_ENV;
my @active_lls = $class->active_paths;
- $path = $class->ensure_dir_structure_for($path);
+ $class->ensure_dir_structure_for($path);
+
+ # On Win32 directories often contain spaces. But some parts of the CPAN
+ # toolchain don't like that. To avoid this, GetShortPathName() gives us
+ # an alternate representation that has none.
+ # This only works if the directory already exists.
+ $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
if (! $deactivating) {
if (@active_lls && $active_lls[-1] eq $path) {
exit 0;
} else {
$class->setup_env_hash_for($path, $deactivating);
- @INC = _uniq(split($Config{path_sep}, $ENV{PERL5LIB}), @INC);
+ my $arch_dir = $Config{archname};
+ @INC = _uniq(
+ (
+ # Inject $path/$archname for each path in PERL5LIB
+ map { ( File::Spec->catdir($_, $arch_dir), $_ ) }
+ split($Config{path_sep}, $ENV{PERL5LIB})
+ ),
+ @INC
+ );
}
}
warn "Attempting to create directory ${path}\n";
}
File::Path::mkpath($path);
- # Need to have the path exist to make a short name for it, so
- # converting to a short name here.
- $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
-
- return $path;
+ return
}
sub guess_shelltype {
filter => sub { 1 },
empty => undef,
);
-sub _env_list_value(%@) {
+sub _env_list_value {
my $options = shift;
die(sprintf "unknown option '$_' at %s line %u\n", (caller)[1..2])
for grep { !exists $ENV_LIST_VALUE_DEFAULTS{$_} } keys %$options;
&& (!$options{exists} || -e $_))
} map {
if (ref $_ eq 'SCALAR' && $options{interpolate} == INTERPOLATE_ENV) {
- exists $ENV{${$_}} ? (split /\Q$Config{path_sep}/, $ENV{${$_}}) : ()
+ defined $ENV{${$_}} ? (split /\Q$Config{path_sep}/, $ENV{${$_}}) : ()
} else {
$_
}
PERL5LIB =>
_env_list_value(
{ interpolate => $interpolate, exists => 0, empty => '' },
- $class->install_base_arch_path($path),
$class->install_base_perl_path($path),
\'PERL5LIB',
),
PATH => _env_list_value(
{ interpolate => $interpolate, exists => 0, empty => '' },
+ $class->install_base_bin_path($path),
\'PATH',
),
)
my ($class) = @_;
return () unless defined $ENV{PERL_LOCAL_LIB_ROOT};
- return split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT};
+ return grep { $_ ne '' } split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT};
}
sub build_deactivate_environment_vars_for {
# If removing ourselves from the "top of the stack", set install paths to
# correspond with the new top of stack.
if ($active_lls[-1] eq $path) {
- if (@active_lls > 1) {
- my $new_top = $active_lls[-2];
- %env = (%env,
- PERL_MB_OPT => "--install_base ${new_top}",
- PERL_MM_OPT => "INSTALL_BASE=${new_top}",
- );
- } else {
- %env = (%env,
- PERL_MB_OPT => undef,
- PERL_MM_OPT => undef,
- );
- }
+ my $new_top = $active_lls[-2];
+ $env{PERL_MB_OPT} = defined($new_top) ? "--install_base ${new_top}" : undef;
+ $env{PERL_MM_OPT} = defined($new_top) ? "INSTALL_BASE=${new_top}" : undef;
}
return %env;
=head1 LIMITATIONS
The perl toolchain is unable to handle directory names with spaces in it,
-so you cant put your local::lib bootstrap into a directory with spaces. What
+so you can't put your local::lib bootstrap into a directory with spaces. What
you can do is moving your local::lib to a directory with spaces B<after> you
installed all modules inside your local::lib bootstrap. But be aware that you
-cant update or install CPAN modules after the move.
+can't update or install CPAN modules after the move.
Rather basic shell detection. Right now anything with csh in its name is
assumed to be a C shell or something compatible, and everything else is assumed
=back
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
+
+=back
+
=head1 SUPPORT
IRC: