X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Flocal%2Flib.pm;h=b3953b160375da73574b34c31e80b086d6432512;hb=35f4f2618944442742df2cb7f492f66ec786ac55;hp=41a51d64dbf877926c12cbe94ebca7d4b6d83118;hpb=c40e10d7a5fafb4895f6228b5f6e532e3288fa09;p=p5sagit%2Flocal-lib.git diff --git a/lib/local/lib.pm b/lib/local/lib.pm index 41a51d6..b3953b1 100644 --- a/lib/local/lib.pm +++ b/lib/local/lib.pm @@ -184,7 +184,7 @@ sub deactivate { if (!grep { $_ eq $path } @active_lls) { warn "Tried to deactivate inactive local::lib '$path'\n"; - return; + return $self; } my %args = ( @@ -227,6 +227,9 @@ sub activate { $self->ensure_dir_structure_for($path) unless $self->no_create; + $path = ( Win32::GetShortPathName($path) || $path ) + if $^O eq 'MSWin32'; + my @active_lls = $self->active_paths; if (grep { $_ eq $path } @active_lls) { @@ -311,7 +314,8 @@ sub environment_vars_string_for { next; } if (!ref $value - && $value eq $ENV{$name}) { + && defined $value ? $value eq $ENV{$name} : !defined $ENV{$name} + ) { next; } $out .= $self->$build_method($name, $value); @@ -322,42 +326,36 @@ sub environment_vars_string_for { sub build_bourne_env_declaration { my ($class, $name, $args) = @_; my $value = $class->_interpolate($args); - $value =~ s/"/\\"/g - if defined $value; - return defined($value) ? qq{export ${name}="${value}"\n} : qq{unset ${name}\n}; + defined $value + ? qq{export ${name}="${value}";\n} + : qq{unset ${name};\n}; } sub build_csh_env_declaration { my ($class, $name, $args) = @_; - my ($value, @vars) = $class->_interpolate($args); - @vars = grep { $_ ne $name || defined $value } @vars; - $value =~ s/"/"\\""/g - if defined $value; - join '', - (map qq{if ! \$?$_ setenv $_ "";\n}, @vars), - (defined($value) + my ($value, @vars) = $class->_interpolate($args, undef, undef, '"', qq{"\\"}); + (join '', map qq{if ! \$?$_ setenv $_ "";\n}, @vars) + . defined $value ? qq{setenv $name "$value";\n} - : qq{unsetenv $name;\n}); + : qq{unsetenv $name;\n}; } sub build_cmd_env_declaration { my ($class, $name, $args) = @_; - my $value = $class->_interpolate($args, '%', '%'); - $value =~ s/"/\\"/g - if defined $value; - return qq{set $name=} . (defined($value) ? qq{"$value"} : '') . "\n"; + my $value = $class->_interpolate($args, '%', '%', qr([()!^"<>&|]), '^'); + defined $value + ? qq{set $name=$value\n} + : qq{set $name=\n}; } sub build_powershell_env_declaration { my ($class, $name, $args) = @_; - my $value = $class->_interpolate($args, '$env:'); - if (defined $value) { - $value =~ s/"/\\"/g; - return qq{\$env:$name = "$value"\n}; - } - return "Remove-Item Env:\\$name\n"; + my $value = $class->_interpolate($args, '$env:', '', '"', '`'); + defined $value + ? qq{\$env:$name = "$value"\n} + : "Remove-Item Env:\\$name\n"; } sub _interpolate { - my ($class, $args, $start, $end) = @_; + my ($class, $args, $start, $end, $escape, $escape_char) = @_; return unless defined $args; return $args @@ -366,10 +364,19 @@ sub _interpolate { unless @$args; $start = '$' unless defined $start; $end = '' unless defined $end; + $escape = '"' unless defined $escape; + $escape_char = "\\" unless defined $escape_char; my @vars; my $string = join($Config{path_sep}, map { - (ref $_ && ref $_ eq 'SCALAR') ? do { push @vars, $$_; $start.$$_.$end } - : $_ + if (ref $_ && ref $_ eq 'SCALAR') { + push @vars, $$_; + $start.$$_.$end; + } + else { + my $str = $_; + $str =~ s/($escape)/$escape_char$1/g; + $str; + } } @$args); return wantarray ? ($string, @vars) : $string; } @@ -416,9 +423,6 @@ sub resolve_path { resolve_empty_path )}($path); - $path = Win32::GetShortPathName($path) - if $^O eq 'MSWin32'; - $path; } @@ -520,38 +524,26 @@ ok(-d 't/var/splat'); =cut sub guess_shelltype { - my $shellbin = 'sh'; - if(defined $ENV{'SHELL'}) { - my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'}); - $shellbin = $shell_bin_path_parts[-1]; - } - my $shelltype = do { - local $_ = $shellbin; - if(/csh/) { - 'csh' - } else { - 'bourne' - } - }; - - # Both Win32 and Cygwin have $ENV{COMSPEC} set. - if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') { - my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'}); - $shellbin = $shell_bin_path_parts[-1]; - $shelltype = do { - local $_ = $shellbin; - if(/command\.com/) { - 'cmd' - } elsif(/cmd\.exe/) { - 'cmd' - } elsif(/4nt\.exe/) { - 'cmd' - } else { - $shelltype - } - }; + my $shellbin + = defined $ENV{SHELL} + ? (File::Spec->splitpath($ENV{SHELL}))[-1] + : ( $^O eq 'MSWin32' && exists $ENV{'!EXITCODE'} ) + ? 'bash' + : ( $^O eq 'MSWin32' && $ENV{PROMPT} && $ENV{COMSPEC} ) + ? (File::Spec->splitpath($ENV{COMSPEC}))[-1] + : ( $^O eq 'MSWin32' && !$ENV{PROMPT} ) + ? 'powershell.exe' + : 'sh'; + + for ($shellbin) { + return + /csh/ ? 'csh' + : /command\.com/ ? 'cmd' + : /cmd\.exe/ ? 'cmd' + : /4nt\.exe/ ? 'cmd' + : /powershell\.exe/ ? 'powershell' + : 'bourne'; } - return $shelltype; } 1;