lib/Archive/Extract/t/src/x.tar.packed Archive::Extract tests
lib/Archive/Extract/t/src/x.tgz.packed Archive::Extract tests
lib/Archive/Extract/t/src/x.zip.packed Archive::Extract tests
+lib/Archive/Extract/t/src/x.Z.packed Archive::Extract tests
lib/Archive/Extract/t/src/y.jar.packed Archive::Extract tests
lib/Archive/Extract/t/src/y.par.packed Archive::Extract tests
lib/Archive/Extract/t/src/y.tar.bz2.packed Archive::Extract tests
lib/bignum/t/bn_lite.t See if bignum with Math::BigInt::Lite works
lib/bignum/t/brinfnan.t See if bignum works
lib/bignum/t/br_lite.t See if bigrat with Math::BigInt::Lite works
-lib/bignum/t/infnan.inc See if bignum with inf/NaN works
lib/bignum/t/in_effect.t See if in_effect() works
+lib/bignum/t/infnan.inc See if bignum with inf/NaN works
lib/bignum/t/option_a.t See if bignum a => X works
lib/bignum/t/option_l.t See if bignum l => X works
lib/bignum/t/option_p.t See if bignum p => X works
lib/bignum/t/ratopt_a.t See if bigrat a => X works
-lib/bignum/t/scope_i.t See if no bigint works
lib/bignum/t/scope_f.t See if no bignum works
+lib/bignum/t/scope_i.t See if no bigint works
lib/bignum/t/scope_r.t See if no bigrat works
lib/bigrat.pl An arbitrary precision rational arithmetic package
lib/bigrat.pm bigrat
use constant ZIP => 'zip';
use constant BZ2 => 'bz2';
use constant TBZ => 'tbz';
+use constant Z => 'Z';
use vars qw[$VERSION $PREFER_BIN $PROGRAMS $WARN $DEBUG];
-$VERSION = '0.18';
+$VERSION = '0.20';
$PREFER_BIN = 0;
$WARN = 1;
$DEBUG = 0;
-my @Types = ( TGZ, TAR, GZ, ZIP, BZ2, TBZ ); # same as all constants
+my @Types = ( TGZ, TAR, GZ, ZIP, BZ2, TBZ, Z ); # same as all constants
local $Params::Check::VERBOSE = $Params::Check::VERBOSE = 1;
Archive::Extract is a generic archive extraction mechanism.
It allows you to extract any archive file of the type .tar, .tar.gz,
-.gz, tar.bz2, .tbz, .bz2 or .zip without having to worry how it does
-so, or use different interfaces for each type by using either perl
-modules, or commandline tools on your system.
+.gz, .Z, tar.bz2, .tbz, .bz2 or .zip without having to worry how it
+does so, or use different interfaces for each type by using either
+perl modules, or commandline tools on your system.
See the C<HOW IT WORKS> section further down for details.
### see what /bin/programs are available ###
$PROGRAMS = {};
-for my $pgm (qw[tar unzip gzip bunzip2]) {
+for my $pgm (qw[tar unzip gzip bunzip2 uncompress]) {
$PROGRAMS->{$pgm} = can_run($pgm);
}
is_zip => '_unzip',
is_tbz => '_untar',
is_bz2 => '_bunzip2',
+ is_Z => '_uncompress',
};
{
Gzip compressed file, as produced by, for example C</bin/gzip>.
Corresponds to a C<.gz> suffix.
+=item Z
+
+Lempel-Ziv compressed file, as produced by, for example C</bin/compress>.
+Corresponds to a C<.Z> suffix.
+
=item zip
Zip compressed file, as produced by, for example C</bin/zip>.
$ar =~ /.+?\.(zip|jar|par)$/i ? ZIP :
$ar =~ /.+?\.(?:tbz|tar\.bz2?)$/i ? TBZ :
$ar =~ /.+?\.bz2$/i ? BZ2 :
+ $ar =~ /.+?\.Z$/ ? Z :
'';
}
### to.
my $dir;
{ ### a foo.gz file
- if( $self->is_gz or $self->is_bz2 ) {
+ if( $self->is_gz or $self->is_bz2 or $self->is_Z) {
- my $cp = $self->archive; $cp =~ s/\.(?:gz|bz2)$//i;
+ my $cp = $self->archive; $cp =~ s/\.(?:gz|bz2|Z)$//i;
### to is a dir?
if ( -d $to ) {
Returns true if the file is of type C<.gz>.
See the C<new()> method for details.
+=head2 $ae->is_Z
+
+Returns true if the file is of type C<.Z>.
+See the C<new()> method for details.
+
=head2 $ae->is_zip
Returns true if the file is of type C<.zip>.
sub is_zip { return $_[0]->type eq ZIP }
sub is_tbz { return $_[0]->type eq TBZ }
sub is_bz2 { return $_[0]->type eq BZ2 }
+sub is_Z { return $_[0]->type eq Z }
=pod
=cut
### paths to commandline tools ###
-sub bin_gzip { return $PROGRAMS->{'gzip'} if $PROGRAMS->{'gzip'} }
-sub bin_unzip { return $PROGRAMS->{'unzip'} if $PROGRAMS->{'unzip'} }
-sub bin_tar { return $PROGRAMS->{'tar'} if $PROGRAMS->{'tar'} }
-sub bin_bunzip2 { return $PROGRAMS->{'bunzip2'} if $PROGRAMS->{'bunzip2'} }
+sub bin_gzip { return $PROGRAMS->{'gzip'} if $PROGRAMS->{'gzip'} }
+sub bin_unzip { return $PROGRAMS->{'unzip'} if $PROGRAMS->{'unzip'} }
+sub bin_tar { return $PROGRAMS->{'tar'} if $PROGRAMS->{'tar'} }
+sub bin_bunzip2 { return $PROGRAMS->{'bunzip2'} if $PROGRAMS->{'bunzip2'} }
+sub bin_uncompress { return $PROGRAMS->{'uncompress'}
+ if $PROGRAMS->{'uncompress'} }
#################################
#
#################################
#
+# Uncompress code
+#
+#################################
+
+
+### untar wrapper... goes to either Archive::Tar or /bin/tar
+### depending on $PREFER_BIN
+sub _uncompress {
+ my $self = shift;
+
+ my @methods = qw[_gunzip_cz _uncompress_bin];
+ @methods = reverse @methods if $PREFER_BIN;
+
+ for my $method (@methods) {
+ $self->_extractor($method) && return 1 if $self->$method();
+ }
+
+ return $self->_error(loc("Unable to untar file '%1'", $self->archive));
+}
+
+sub _uncompress_bin {
+ my $self = shift;
+
+ ### check for /bin/gzip -- we need it ###
+ return $self->_error(loc("No '%1' program found", '/bin/uncompress'))
+ unless $self->bin_uncompress;
+
+
+ my $fh = FileHandle->new('>'. $self->_gunzip_to) or
+ return $self->_error(loc("Could not open '%1' for writing: %2",
+ $self->_gunzip_to, $! ));
+
+ my $cmd = [ $self->bin_uncompress, '-c', $self->archive ];
+
+ my $buffer;
+ unless( scalar run( command => $cmd,
+ verbose => $DEBUG,
+ buffer => \$buffer )
+ ) {
+ return $self->_error(loc("Unable to uncompress '%1': %2",
+ $self->archive, $buffer));
+ }
+
+ ### no buffers available?
+ if( !IPC::Cmd->can_capture_buffer and !$buffer ) {
+ $self->_error( $self->_no_buffer_content( $self->archive ) );
+ }
+
+ print $fh $buffer if defined $buffer;
+
+ close $fh;
+
+ ### set what files where extract, and where they went ###
+ $self->files( [$self->_gunzip_to] );
+ $self->extract_path( File::Spec->rel2abs(cwd()) );
+
+ return 1;
+}
+
+
+#################################
+#
# Unzip code
#
#################################
Maybe this module should use something like C<File::Type> to determine
the type, rather than blindly trust the suffix.
+=back
+
=head1 BUG REPORTS
Please report bugs or other issues to E<lt>bug-archive-extract@rt.cpan.org<gt>.
method => 'is_tar',
outfile => 'a',
},
- 'x.gz' => { programs => [qw[gzip]],
+ 'x.gz' => { programs => [qw[gzip]],
modules => [qw[Compress::Zlib]],
method => 'is_gz',
outfile => 'a',
},
+ 'x.Z' => { programs => [qw[uncompress]],
+ modules => [qw[Compress::Zlib]],
+ method => 'is_Z',
+ outfile => 'a',
+ },
'x.zip' => { programs => [qw[unzip]],
modules => [qw[Archive::Zip]],
method => 'is_zip',
### where to extract to -- try both dir and file for gz files
### XXX test me!
#my @outs = $ae->is_gz ? ($abs_path, $OutDir) : ($OutDir);
- my @outs = $ae->is_gz || $ae->is_bz2 ? ($abs_path) : ($OutDir);
+ my @outs = $ae->is_gz || $ae->is_bz2 || $ae->is_Z
+ ? ($abs_path)
+ : ($OutDir);
skip "No binaries or modules to extract ".$archive,
(10 * scalar @outs) if $mod_fail && $pgm_fail;
diag("Extracting to: $to") if $Debug;
diag("Buffers enabled: ".!$turn_off) if $Debug;
-
+
my $rv = $ae->extract( to => $to );
ok( $rv, "extract() for '$archive' reports success");
skip "No extract path captured, can't remove paths", 2
unless $ae->extract_path;
+ ### if something went wrong with determining the out
+ ### path, don't go deleting stuff.. might be Really Bad
+ my $out_re = quotemeta( $OutDir );
+ if( $ae->extract_path !~ /^$out_re/ ) {
+ ok( 0, "Extractpath WRONG (".$ae->extract_path.")");
+ skip( "Unsafe operation -- skip cleanup!!!" ), 1;
+ }
+
eval { rmtree( $ae->extract_path ) };
ok( !$@, " rmtree gave no error" );
ok( !(-d $ae->extract_path ),
uupacktool.pl -p lib/Archive/Extract/t/src/double_dir.zip lib/Archive/Extract/t/src/double_dir.zip.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
M4$L#!`H``````&QH,S0````````````````%`!4`>"]Y+WI55`D``PR`ST,,
--- /dev/null
+#########################################################################
+This is a binary file that was packed with the 'uupacktool.pl' which
+is included in the Perl distribution.
+
+To unpack this file use the following command:
+
+ uupacktool.pl -u lib/Archive/Extract/t/src/x.Z.packed lib/Archive/Extract/t/src/x.Z
+
+To recreate it use the following command:
+
+ uupacktool.pl -p lib/Archive/Extract/t/src/x.Z lib/Archive/Extract/t/src/x.Z.packed
+
+Created at Mon May 28 12:45:27 2007
+#########################################################################
+__UU__
+''YV0>`(J````
uupacktool.pl -p lib/Archive/Extract/t/src/x.bz2 lib/Archive/Extract/t/src/x.bz2.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
.0EIH.1=R13A0D```````
uupacktool.pl -p lib/Archive/Extract/t/src/x.gz lib/Archive/Extract/t/src/x.gz.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
-6'XL(""66P4`"`V$``P``````````````
+6'XL("+F;6D8``W@``P``````````````
uupacktool.pl -p lib/Archive/Extract/t/src/x.jar lib/Archive/Extract/t/src/x.jar.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
M4$L#!`H```````MAQ3`````````````````!`!``8558#`!)`B%!EIO!0/4!
uupacktool.pl -p lib/Archive/Extract/t/src/x.par lib/Archive/Extract/t/src/x.par.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
M4$L#!`H```````MAQ3`````````````````!`!``8558#`!)`B%!EIO!0/4!
uupacktool.pl -p lib/Archive/Extract/t/src/x.tar.gz lib/Archive/Extract/t/src/x.tar.gz.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M'XL(`````````^W.NPW"0!!%T2EE2YC%:[N>#7""1,"G?QM##!&.SDE&(]W@
uupacktool.pl -p lib/Archive/Extract/t/src/x.tar lib/Archive/Extract/t/src/x.tar.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:26 2007
#########################################################################
__UU__
M80``````````````````````````````````````````````````````````
uupacktool.pl -p lib/Archive/Extract/t/src/x.tgz lib/Archive/Extract/t/src/x.tgz.packed
-Created at Wed Apr 11 21:33:15 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M'XL(`````````^W.NPW"0!!%T2EE2YC%:[N>#7""1,"G?QM##!&.SDE&(]W@
uupacktool.pl -p lib/Archive/Extract/t/src/x.zip lib/Archive/Extract/t/src/x.zip.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M4$L#!`H```````MAQ3`````````````````!`!``8558#`!)`B%!EIO!0/4!
uupacktool.pl -p lib/Archive/Extract/t/src/y.jar lib/Archive/Extract/t/src/y.jar.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M4$L#!`H``````,NBB#$````````````````"`!``>2]56`P`M%6W06Y4MT'U
uupacktool.pl -p lib/Archive/Extract/t/src/y.par lib/Archive/Extract/t/src/y.par.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M4$L#!`H``````,NBB#$````````````````"`!``>2]56`P`M%6W06Y4MT'U
uupacktool.pl -p lib/Archive/Extract/t/src/y.tar.bz2 lib/Archive/Extract/t/src/y.tar.bz2.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:28 2007
#########################################################################
__UU__
M0EIH.3%!6293636W".T``+)[E,B``$!``/>```-B"1XP!```0``((`"2A*4]
uupacktool.pl -p lib/Archive/Extract/t/src/y.tar.gz lib/Archive/Extract/t/src/y.tar.gz.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:28 2007
#########################################################################
__UU__
M'XL(`````````^W1,0Z#,`R%81\E-R"F><EY&,I2J4.!`4Y?JH@5J4,JH?[?
uupacktool.pl -p lib/Archive/Extract/t/src/y.tar lib/Archive/Extract/t/src/y.tar.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:27 2007
#########################################################################
__UU__
M>2\`````````````````````````````````````````````````````````
uupacktool.pl -p lib/Archive/Extract/t/src/y.tbz lib/Archive/Extract/t/src/y.tbz.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:28 2007
#########################################################################
__UU__
M0EIH.3%!6293636W".T``+)[E,B``$!``/>```-B"1XP!```0``((`"2A*4]
uupacktool.pl -p lib/Archive/Extract/t/src/y.tgz lib/Archive/Extract/t/src/y.tgz.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:28 2007
#########################################################################
__UU__
M'XL(`````````^W1,0Z#,`R%81\E-R"F><EY&,I2J4.!`4Y?JH@5J4,JH?[?
uupacktool.pl -p lib/Archive/Extract/t/src/y.zip lib/Archive/Extract/t/src/y.zip.packed
-Created at Wed Apr 11 21:33:16 2007
+Created at Mon May 28 12:45:28 2007
#########################################################################
__UU__
M4$L#!`H``````,NBB#$````````````````"`!``>2]56`P`M%6W06Y4MT'U