X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Flocal%2Flib.pm;h=dd3d5da0ccf247f70ca2f6833f597961f7c81e9c;hb=99f8e6214f8afd8719c787b29230f3d04d3e8d86;hp=ab05cdba2e355837109843a08b8952960e52d95b;hpb=480534a88ae50b8e151a01c8488aa019d0e5d395;p=p5sagit%2Flocal-lib.git diff --git a/lib/local/lib.pm b/lib/local/lib.pm index ab05cdb..dd3d5da 100644 --- a/lib/local/lib.pm +++ b/lib/local/lib.pm @@ -11,13 +11,16 @@ use File::Path (); use Carp (); use Config; -our $VERSION = '1.008001'; # 1.8.1 +our $VERSION = '1.008003'; # 1.8.3 our @KNOWN_FLAGS = qw(--self-contained --deactivate --deactivate-all); sub DEACTIVATE_ONE () { 1 } sub DEACTIVATE_ALL () { 2 } +sub INTERPOLATE_ENV () { 1 } +sub LITERAL_ENV () { 0 } + sub import { my ($class, @args) = @_; @@ -200,9 +203,28 @@ is($c->resolve_relative_path('bar'),'FOObar'); sub setup_local_lib_for { my ($class, $path, $deactivating) = @_; - $path = $class->ensure_dir_structure_for($path) unless $deactivating; + + my $interpolate = LITERAL_ENV; + my @active_lls = $class->active_paths; + + if (! $deactivating) { + if (@active_lls && $active_lls[-1] eq $path) { + exit 0 if $0 eq '-'; + return; # Asked to add what's already at the top of the stack + } elsif (grep { $_ eq $path} @active_lls) { + # Asked to add a dir that's lower in the stack -- so we remove it from + # where it is, and then add it back at the top. + $class->setup_env_hash_for($path, DEACTIVATE_ONE); + # Which means we can no longer output "PERL5LIB=...:$PERL5LIB" stuff + # anymore because we're taking something *out*. + $interpolate = INTERPOLATE_ENV; + } + } + + $path = $class->ensure_dir_structure_for($path); + if ($0 eq '-') { - $class->print_environment_vars_for($path, $deactivating); + $class->print_environment_vars_for($path, $deactivating, $interpolate); exit 0; } else { $class->setup_env_hash_for($path, $deactivating); @@ -238,9 +260,6 @@ sub ensure_dir_structure_for { return $path; } -sub INTERPOLATE_ENV () { 1 } -sub LITERAL_ENV () { 0 } - sub guess_shelltype { my $shellbin = 'sh'; if(defined $ENV{'SHELL'}) { @@ -277,13 +296,13 @@ sub guess_shelltype { } sub print_environment_vars_for { - my ($class, $path, $deactivating) = @_; - print $class->environment_vars_string_for($path, $deactivating); + my ($class, $path, $deactivating, $interpolate) = @_; + print $class->environment_vars_string_for($path, $deactivating, $interpolate); } sub environment_vars_string_for { - my ($class, $path, $deactivating) = @_; - my @envs = $class->build_environment_vars_for($path, $deactivating, LITERAL_ENV); + my ($class, $path, $deactivating, $interpolate) = @_; + my @envs = $class->build_environment_vars_for($path, $deactivating, $interpolate); my $out = ''; # rather basic csh detection, goes on the assumption that something won't @@ -373,10 +392,17 @@ sub build_activate_environment_vars_for { ) } +sub active_paths { + my ($class) = @_; + + return () unless defined $ENV{PERL_LOCAL_LIB_ROOT}; + return split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT}; +} + sub build_deactivate_environment_vars_for { my ($class, $path, $interpolate) = @_; - my @active_lls = split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT} || ''; + my @active_lls = $class->active_paths; if (!grep { $_ eq $path } @active_lls) { warn "Tried to deactivate inactive local::lib '$path'\n"; @@ -425,7 +451,7 @@ sub build_deactivate_environment_vars_for { sub build_deact_all_environment_vars_for { my ($class, $path, $interpolate) = @_; - my @active_lls = split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT} || ''; + my @active_lls = $class->active_paths; my @new_perl5lib = split /\Q$Config{path_sep}/, $ENV{PERL5LIB}; my @new_path = split /\Q$Config{path_sep}/, $ENV{PATH}; @@ -763,6 +789,19 @@ given path as the base directory. Constructs the C<%ENV> keys for the given path, by calling L. +=head2 active_paths + +=over 4 + +=item Arguments: None + +=item Return value: @paths + +=back + +Returns a list of active C paths, according to the +C environment variable. + =head2 install_base_perl_path =over 4 @@ -973,6 +1012,9 @@ David Mertens (run4flat). Brazilian L and minor doc patches contributed by Breno G. de Oliveira . +Improvements to stacking multiple local::lib dirs and removing them from the +environment later on contributed by Andrew Rodland . + =head1 COPYRIGHT Copyright (c) 2007 - 2010 the local::lib L and L as