correct output for fish shell
[p5sagit/local-lib.git] / lib / local / lib.pm
index c9f9f48..216426b 100644 (file)
@@ -8,11 +8,13 @@ use 5.006;
 use File::Spec ();
 use Config;
 
-our $VERSION = '1.008026'; # 1.8.26
+our $VERSION = '2.000004'; # 2.0.4
 $VERSION = eval $VERSION;
 
 sub import {
   my ($class, @args) = @_;
+  push @args, @ARGV
+    if $0 eq '-';
 
   my @steps;
   my %opts;
@@ -380,7 +382,7 @@ sub build_bourne_env_declaration {
   $value =~ s/(^|\G|$_path_sep)\$$name$_path_sep/$1\$$name\${$name+$_path_sep}/g;
   $value =~ s/$_path_sep\$$name$/\${$name+$_path_sep}\$$name/;
 
-  qq{export ${name}="$value";\n}
+  qq{${name}="$value";\nexport ${name};\n}
 }
 
 sub build_csh_env_declaration {
@@ -426,7 +428,7 @@ sub build_powershell_env_declaration {
   my $value = $class->_interpolate($args, '$env:%s', '"', '`%s');
 
   if (!$value) {
-    return qq{Remove-Item Env:\\$name;\n};
+    return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n};
   }
 
   my $maybe_path_sep = qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})};
@@ -440,6 +442,16 @@ sub wrap_powershell_output {
   return $out || " \n";
 }
 
+sub build_fish_env_declaration {
+  my ($class, $name, $args) = @_;
+  my $value = $class->_interpolate($args, '$%s', '"', '\\%s');
+  if (!defined $value) {
+    return qq{set -e $name;\n};
+  }
+  $value =~ s/$_path_sep/ /g;
+  qq{set -x $name $value;\n};
+}
+
 sub _interpolate {
   my ($class, $args, $var_pat, $escape, $escape_pat) = @_;
   return
@@ -475,20 +487,6 @@ sub pipeline {
   }
 }
 
-=begin testing
-
-#:: test pipeline
-
-package local::lib;
-
-{ package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
-my $foo = bless({}, 'Foo');
-Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
-
-=end testing
-
-=cut
-
 sub resolve_path {
   my ($class, $path) = @_;
 
@@ -510,25 +508,6 @@ sub resolve_empty_path {
   }
 }
 
-=begin testing
-
-#:: test classmethod setup
-
-my $c = 'local::lib';
-
-=end testing
-
-=begin testing
-
-#:: test classmethod
-
-is($c->resolve_empty_path, '~/perl5');
-is($c->resolve_empty_path('foo'), 'foo');
-
-=end testing
-
-=cut
-
 sub resolve_home_path {
   my ($class, $path) = @_;
   return $path unless ($path =~ /^~/);
@@ -558,17 +537,6 @@ sub resolve_relative_path {
   $path = File::Spec->rel2abs($path);
 }
 
-=begin testing
-
-#:: test classmethod
-
-local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
-is($c->resolve_relative_path('bar'),'FOObar');
-
-=end testing
-
-=cut
-
 sub ensure_dir_structure_for {
   my ($class, $path) = @_;
   unless (-d $path) {
@@ -584,20 +552,6 @@ sub ensure_dir_structure_for {
   return;
 }
 
-=begin testing
-
-#:: test classmethod
-
-File::Path::rmtree('t/var/splat');
-
-$c->ensure_dir_structure_for('t/var/splat');
-
-ok(-d 't/var/splat');
-
-=end testing
-
-=cut
-
 sub guess_shelltype {
   my $shellbin
     = defined $ENV{SHELL}
@@ -612,12 +566,13 @@ sub guess_shelltype {
 
   for ($shellbin) {
     return
-        /csh/              ? 'csh'
-      : /command\.com/i    ? 'cmd'
-      : /cmd\.exe/i        ? 'cmd'
-      : /4nt\.exe/i        ? 'cmd'
-      : /powershell\.exe/i ? 'powershell'
-                           : 'bourne';
+        /csh$/                   ? 'csh'
+      : /fish/                   ? 'fish'
+      : /command(?:\.com)?$/i    ? 'cmd'
+      : /cmd(?:\.exe)?$/i        ? 'cmd'
+      : /4nt(?:\.exe)?$/i        ? 'cmd'
+      : /powershell(?:\.exe)?$/i ? 'powershell'
+                                 : 'bourne';
   }
 }
 
@@ -654,6 +609,10 @@ From the shell -
   export PERL5LIB="/home/username/perl5/lib/perl5"
   export PATH="/home/username/perl5/bin:$PATH"
 
+From a .bashrc file -
+
+  [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
+
 =head2 The bootstrapping technique
 
 A typical way to install local::lib is using what is known as the
@@ -670,12 +629,18 @@ By default local::lib installs itself and the CPAN modules into ~/perl5.
 
 Windows users must also see L</Differences when using this module under Win32>.
 
-1. Download and unpack the local::lib tarball from CPAN (search for "Download"
+=over 4
+
+=item 1.
+
+Download and unpack the local::lib tarball from CPAN (search for "Download"
 on the CPAN page about local::lib).  Do this as an ordinary user, not as root
 or administrator.  Unpack the file in your home directory or in any other
 convenient location.
 
-2. Run this:
+=item 2.
+
+Run this:
 
   perl Makefile.PL --bootstrap
 
@@ -687,16 +652,20 @@ to specify the name of the directory when you call bootstrap, as follows:
 
   perl Makefile.PL --bootstrap=~/foo
 
-3. Run this: (local::lib assumes you have make installed on your system)
+=item 3.
+
+Run this: (local::lib assumes you have make installed on your system)
 
   make test && make install
 
-4. Now we need to setup the appropriate environment variables, so that Perl
+=item 4.
+
+Now we need to setup the appropriate environment variables, so that Perl
 starts using our newly generated lib/ directory. If you are using bash or
 any other Bourne shells, you can add this to your shell startup script this
 way:
 
-  echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
+  echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc
 
 If you are using C shell, you can do this as follows:
 
@@ -709,12 +678,14 @@ If you passed to bootstrap a directory other than default, you also need to
 give that as import parameter to the call of the local::lib module like this
 way:
 
-  echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
+  echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)"' >>~/.bashrc
 
 After writing your shell configuration file, be sure to re-read it to get the
 changed settings into your current shell's environment. Bourne shells use
 C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
 
+=back
+
 If you're on a slower machine, or are operating under draconian disk space
 limitations, you can disable the automatic generation of manpages from POD when
 installing modules by using the C<--no-manpages> argument when bootstrapping:
@@ -734,6 +705,12 @@ installation to install modules in different directories directly this way:
   cd ../mydir2
   ... REPEAT ...
 
+When used in a C<.bashrc> file, it is recommended that you protect against
+re-activating a directory in a sub-shell.  This can be done by checking the
+C<$SHLVL> variable as shown in synopsis.  Without this, sub-shells created by
+the user or other programs will override changes made to the parent shell's
+environment.
+
 If you are working with several C<local::lib> environments, you may want to
 remove some of them from the current environment without disturbing the others.
 You can deactivate one environment like this (using bourne sh):
@@ -792,7 +769,7 @@ and the subdirectories are created.
 
 =head3 PowerShell
 
-local::lib also supports PowerShell, and an be used with the
+local::lib also supports PowerShell, and can be used with the
 C<Invoke-Expression> cmdlet.
 
   Invoke-Expression "$(perl -Mlocal::lib)"
@@ -1232,6 +1209,24 @@ not set, a Bourne-compatible shell is assumed.
 
 =item * Should probably auto-fixup CPAN config if not already done.
 
+=item * local::lib loads L<File::Spec>.  When used to set shell variables,
+this isn't a problem.  When used inside a perl script, any L<File::Spec>
+version inside the local::lib will be ignored.  A workaround for this is using
+C<use lib "$ENV{HOME}/perl5/lib/perl5";> inside the script instead of using
+C<local::lib> directly.
+
+=item * Conflicts with L<ExtUtils::MakeMaker>'s C<PREFIX> option.
+C<local::lib> uses the C<INSTALL_BASE> option, as it has more predictable and
+sane behavior.  If something attempts to use the C<PREFIX> option when running
+a F<Makefile.PL>, L<ExtUtils::MakeMaker> will refuse to run, as the two
+options conflict.  This can be worked around by temporarily unsetting the
+C<PERL_MM_OPT> environment variable.
+
+=item * Conflicts with L<Module::Build>'s C<--prefix> option.  Similar to the
+previous limitation, but any C<--prefix> option specified will be ignored.
+This can be worked around by temporarily unsetting the C<PERL_MB_OPT>
+environment variable.
+
 =back
 
 Patches very much welcome for any of the above.
@@ -1332,9 +1327,12 @@ environment later on contributed by Andrew Rodland <arodland@cpan.org>.
 Patch for Carp version mismatch contributed by Hakim Cassimally
 <osfameron@cpan.org>.
 
+Rewrite of internals and numerous bug fixes and added features contributed by
+Graham Knop <haarg@haarg.org>.
+
 =head1 COPYRIGHT
 
-Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
+Copyright (c) 2007 - 2013 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
 listed above.
 
 =head1 LICENSE