fix missing whitespace before (
[p5sagit/App-FatPacker.git] / lib / App / FatPacker.pm
index aa3caef..c225ac7 100644 (file)
@@ -4,27 +4,28 @@ use strict;
 use warnings FATAL => 'all';
 use 5.008001;
 use Getopt::Long;
+use Capture::Tiny ();
 use Cwd qw(cwd);
 use File::Find qw(find);
 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.009003'; # 0.9.3
+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) ]
-);
-
 sub call_parser {
-  local *ARGV = [ @{$_[0]} ];
-  $option_parser->getoptions(@{$_[1]});
-  [ @ARGV ];
+  my $self = shift;
+  my ( $args, $options ) = @_;
+
+  local *ARGV = [ @{$args} ];
+  $self->{'option_parser'}->getoptions( @{$options} );
+
+  return [ @ARGV ];
 }
 
 sub lines_of {
@@ -38,16 +39,23 @@ sub stripspace {
 }
 
 sub import {
-  $_[1] eq '-run_script'
+  $_[1] && $_[1] eq '-run_script'
     and return shift->new->run_script;
 }
 
-sub new { bless({}, $_[0]) }
+sub new {
+  bless {
+    option_parser => Getopt::Long::Parser->new(
+      config => [ qw(require_order pass_through bundling no_auto_abbrev) ]
+    ),
+  }, $_[0];
+}
 
 sub run_script {
   my ($self, $args) = @_;
   my @args = $args ? @$args : @ARGV;
   (my $cmd = shift @args || 'help') =~ s/-/_/g;
+
   if (my $meth = $self->can("script_command_${cmd}")) {
     $self->$meth(\@args);
   } else {
@@ -61,31 +69,69 @@ sub script_command_help {
 
 sub script_command_trace {
   my ($self, $args) = @_;
-  
-  $args = call_parser $args => [
+
+  $args = $self->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) {
-      "=>&STDERR"
-    } else {
-      ""
+    if ($to_stderr) {
+      "=&STDERR"
+    } elsif ($file) {
+      ">>${file}"
     }
   };
-  {
-    local $ENV{PERL5OPT} = '-MApp::FatPacker::Trace'.$arg;
-    system $^X, @$args;
+
+  $self->trace(
+    use => \@additional_use,
+    args => $args,
+    output => $arg,
+  );
+}
+
+sub trace {
+  my ($self, %opts) = @_;
+  my $use = defined $opts{'use'} ? $opts{'use'} : [];
+  my $args = defined $opts{'args'} ? $opts{'args'} : [];
+  my $output = $opts{'output'};
+  my $capture;
+
+  # if the user doesn't provide output, they want to actually
+  # capture the output and receive it back
+  if (!$output) {
+    # throw to STDOUT to differ from STDERR
+    $output .= '>&STDOUT';
+
+    # raise capture flag
+    $capture++;
+  }
+
+  if(@$use) {
+    $output .= "," . join ",", @$use;
   }
+
+  my $trace_sub = sub {
+     local $ENV{PERL5OPT} = '-MApp::FatPacker::Trace='.$output;
+     system $^X, @$args;
+  };
+
+  if ($capture) {
+    # capture both STDOUT and STDERR so we could throw away STDERR
+    # STDOUT will contain the trace
+    # STDERR will contain the "syntax OK" statement
+    my ($stdout, $stderr) = Capture::Tiny::capture {$trace_sub->()};
+    return $stdout;
+  } else {
+    $trace_sub->();
+   }
 }
 
 sub script_command_packlists_for {
@@ -119,8 +165,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;
@@ -139,7 +185,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;
     }
   }
@@ -203,7 +249,7 @@ App::FatPacker - pack your dependencies onto your script file
 
 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.1
+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
@@ -233,3 +279,4 @@ as perl itself.
 =cut
 
 1;
+