Support not having a lib directory
[p5sagit/App-FatPacker.git] / lib / App / FatPacker.pm
index 1ba5977..f32459e 100644 (file)
@@ -2,6 +2,7 @@ package App::FatPacker;
 
 use strict;
 use warnings FATAL => 'all';
+use 5.008001;
 use Getopt::Long;
 use Cwd qw(cwd);
 use File::Find qw(find);
@@ -9,9 +10,13 @@ use File::Spec::Functions qw(
   catdir splitpath splitdir catpath rel2abs abs2rel
 );
 use File::Copy qw(copy);
-use File::Path qw(make_path remove_tree);
+use File::Path qw(mkpath rmtree);
 use B qw(perlstring);
 
+our $VERSION = '0.009006'; # 0.9.6
+
+$VERSION = eval $VERSION;
+
 my $option_parser = Getopt::Long::Parser->new(
   config => [ qw(require_order pass_through bundling no_auto_abbrev) ]
 );
@@ -32,10 +37,6 @@ sub stripspace {
   $text;
 }
 
-our $VERSION = '0.009001'; # 0.9.1
-
-$VERSION = eval $VERSION;
-
 sub import {
   $_[1] eq '-run_script'
     and return shift->new->run_script;
@@ -46,7 +47,7 @@ sub new { bless({}, $_[0]) }
 sub run_script {
   my ($self, $args) = @_;
   my @args = $args ? @$args : @ARGV;
-  (my $cmd = shift @args) =~ s/-/_/g;
+  (my $cmd = shift @args || 'help') =~ s/-/_/g;
   if (my $meth = $self->can("script_command_${cmd}")) {
     $self->$meth(\@args);
   } else {
@@ -54,29 +55,37 @@ sub run_script {
   }
 }
 
+sub script_command_help {
+  print "Try `perldoc fatpack` for how to use me\n";
+}
+
 sub script_command_trace {
   my ($self, $args) = @_;
   
   $args = call_parser $args => [
     'to=s' => \my $file,
     'to-stderr' => \my $to_stderr,
+    'use=s' => \my @additional_use
   ];
 
   die "Can't use to and to-stderr on same call" if $file && $to_stderr;
 
-  (my $use_file = $file) ||= 'fatpacker.trace';
-  if (!$to_stderr and -e $use_file) {
-    unlink $use_file or die "Couldn't remove old trace file: $!";
+  $file ||= 'fatpacker.trace';
+  if (!$to_stderr and -e $file) {
+    unlink $file or die "Couldn't remove old trace file: $!";
   }
   my $arg = do {
-    if ($file) {
-      "=>>${file}"
-    } elsif ($to_stderr) {
+    if ($to_stderr) {
       "=>&STDERR"
-    } else {
-      ""
+    } elsif ($file) {
+      "=>>${file}"
     }
   };
+
+  if(@additional_use) {
+    $arg .= "," . join ",", @additional_use;
+  }
+
   {
     local $ENV{PERL5OPT} = '-MApp::FatPacker::Trace'.$arg;
     system $^X, @$args;
@@ -102,7 +111,7 @@ sub packlists_containing {
     $pack_rev{$_} = $File::Find::name for lines_of $File::Find::name;
   }, @search);
   chdir($cwd) or die "Couldn't chdir back to ${cwd} after find: $!";
-  my %found; @found{map $pack_rev{$INC{$_}}, @targets} = ();
+  my %found; @found{map +($pack_rev{$INC{$_}}||()), @targets} = ();
   sort keys %found;
 }
 
@@ -114,8 +123,8 @@ sub script_command_tree {
 
 sub packlists_to_tree {
   my ($self, $where, $packlists) = @_;
-  remove_tree $where;
-  make_path $where;
+  rmtree $where;
+  mkpath $where;
   foreach my $pl (@$packlists) {
     my ($vol, $dirs, $file) = splitpath $pl;
     my @dir_parts = splitdir $dirs;
@@ -134,7 +143,7 @@ sub packlists_to_tree {
       next unless substr($source,0,length $pack_base) eq $pack_base;
       my $target = rel2abs( abs2rel($source, $pack_base), $where );
       my $target_dir = catpath((splitpath $target)[0,1]);
-      make_path $target_dir;
+      mkpath $target_dir;
       copy $source => $target;
     }
   }
@@ -144,7 +153,7 @@ sub script_command_file {
   my ($self, $args) = @_;
   my $file = shift @$args;
   my $cwd = cwd;
-  my @dirs = map rel2abs($_, $cwd), ('lib','fatlib');
+  my @dirs = grep { -d $_ } map rel2abs($_, $cwd), ('lib','fatlib');
   my %files;
   foreach my $dir (@dirs) {
     find(sub {
@@ -166,7 +175,8 @@ sub script_command_file {
 
     unshift @INC, sub {
       if (my $fat = $fatpacked{$_[1]}) {
-        open my $fh, '<', \$fat;
+        open my $fh, '<', \$fat
+          or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
         return $fh;
       }
       return
@@ -177,10 +187,53 @@ sub script_command_file {
   my @segments = map {
     (my $stub = $_) =~ s/\.pm$//;
     my $name = uc join '_', split '/', $stub;
-    my $data = $files{$_}; $data =~ s/^/  /mg;
+    my $data = $files{$_}; $data =~ s/^/  /mg; $data =~ s/(?<!\n)\z/\n/;
     '$fatpacked{'.perlstring($_).qq!} = <<'${name}';\n!
     .qq!${data}${name}\n!;
   } sort keys %files;
   print join "\n", $start, @segments, $end;
 }
+
+=head1 NAME
+
+App::FatPacker - pack your dependencies onto your script file
+
+=head1 SYNOPSIS
+
+  $ fatpack trace myscript.pl
+  $ fatpack packlists-for `cat fatpacker.trace` >packlists
+  $ fatpack tree `cat packlists`
+  $ (fatpack file; cat myscript.pl) >myscript.packed.pl
+
+See the documentation for the L<fatpack> script itself for more information.
+
+The programmatic API for this code is not yet fully decided, hence the 0.9
+release version. Expect that to be cleaned up for 1.0.
+
+=head1 SUPPORT
+
+Your current best avenue is to come annoy annoy mst on #toolchain on
+irc.perl.org. There should be a non-IRC means of support by 1.0.
+
+=head1 AUTHOR
+
+Matt S. Trout (mst) <mst@shadowcat.co.uk>
+
+=head2 CONTRIBUTORS
+
+None as yet, though I probably owe lots of people thanks for ideas. Yet
+another doc nit to fix.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2010 the App::FatPacker L</AUTHOR> and L</CONTRIBUTORS>
+as listed above.
+
+=head1 LICENSE
+
+This library is free software and may be distributed under the same terms
+as perl itself.
+
+=cut
+
 1;