X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Flocal%2Flib.pm;h=c466e4e56c38f80d1c826e0ec90cbf83d44d0f92;hb=469251c5f37705a022d40c98a20fd20d0baa37ed;hp=2e0ca1b14e38913ddd218c717023b55fb5648aac;hpb=f878d9c10aac3774831bb1d7d7d206dc79e645d7;p=p5sagit%2Flocal-lib.git diff --git a/lib/local/lib.pm b/lib/local/lib.pm index 2e0ca1b..c466e4e 100644 --- a/lib/local/lib.pm +++ b/lib/local/lib.pm @@ -10,7 +10,7 @@ use File::Spec (); 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); @@ -29,7 +29,8 @@ sub import { 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 @@ -207,7 +208,13 @@ sub setup_local_lib_for { 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) { @@ -228,7 +235,15 @@ sub setup_local_lib_for { 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 + ); } } @@ -253,11 +268,7 @@ sub ensure_dir_structure_for { 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 { @@ -375,7 +386,7 @@ my %ENV_LIST_VALUE_DEFAULTS = ( 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; @@ -395,7 +406,7 @@ sub _env_list_value(%@) { && (!$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 { $_ } @@ -417,12 +428,12 @@ sub build_activate_environment_vars_for { 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', ), ) @@ -432,7 +443,7 @@ sub active_paths { 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 { @@ -478,18 +489,9 @@ 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; @@ -970,10 +972,10 @@ install UNINST=1" and local::lib if you understand these possible consequences. =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 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 @@ -1023,6 +1025,14 @@ On Win32 systems, C is also examined. =back +=head1 SEE ALSO + +=over 4 + +=item * L + +=back + =head1 SUPPORT IRC: