# using only one command
#
# Author: Patrick Canterino <patrick@patshaping.de>
-# Last modified: 2005-08-01
+# Last modified: 2011-02-11
#
# Copyright (C) 1999-2000 Roland Bluethgen, Frank Schoenmann
-# Copyright (C) 2003-2009 Patrick Canterino
+# Copyright (C) 2003-2011 Patrick Canterino
# All Rights Reserved.
#
# This file can be distributed and/or modified under the terms of
-# of the Artistic License 1.0 (see also the LICENSE file found at
+# of the Artistic License 2.0 (see also the LICENSE file found at
# the top level of the Dev-Editor distribution).
#
use strict;
use vars qw(@EXPORT
- $has_flock);
+ $has_flock
+ $has_archive_extract
+ $archive_extract_error);
use Fcntl qw(:DEFAULT
:flock);
use base qw(Exporter);
-@EXPORT = qw(dir_copy
+@EXPORT = qw(archive_unpack
+ dir_copy
dir_read
file_create
file_lock
$has_flock = eval { local $SIG{'__DIE__'}; flock(STDOUT,0); 1 };
+# Check if Archive::Extract is available
+
+$has_archive_extract = eval { local $SIG{'__DIE__'}; require Archive::Extract; 1 };
+
# Predeclaration of dir_copy()
sub dir_copy($$);
+# archive_unpack()
+#
+# Unpack an archive
+# (archive type must be supported by Archive::Extract)
+#
+# Params: 1. Archive path
+# 2. Path to extract (optional)
+#
+# Return: - Status code (Boolean)
+# - undef if Archive::Extract is not available
+
+sub archive_unpack($;$)
+{
+ my ($archive,$path) = @_;
+
+ return undef unless($has_archive_extract);
+
+ return unless(-f $archive);
+ return if($path && not -d $path);
+
+ my $ae = Archive::Extract->new(archive => $archive);
+ return unless($ae);
+
+ if($path)
+ {
+ if($ae->extract(to => $path))
+ {
+ return 1;
+ }
+ else
+ {
+ $archive_extract_error = $ae->error;
+ return;
+ }
+ }
+ else
+ {
+ if($ae->extract)
+ {
+ return 1;
+ }
+ else
+ {
+ $archive_extract_error = $ae->error;
+ return;
+ }
+ }
+}
+
# dir_copy()
#
# Copy a directory