Mercurial > hg > octave-nkf
diff scripts/miscellaneous/untar.m @ 5808:a18d85bdff31
[project @ 2006-05-11 03:11:03 by jwe]
author | jwe |
---|---|
date | Thu, 11 May 2006 03:11:08 +0000 |
parents | 29c4fb42b210 |
children | 8467683311f8 |
line wrap: on
line diff
--- a/scripts/miscellaneous/untar.m +++ b/scripts/miscellaneous/untar.m @@ -15,83 +15,76 @@ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -*- texinfo -*- -## @deftypefn {Function File} untar (@var{filename}) -## @deftypefnx {Function File} untar (@var{filename}, @var{outputdir}) -## Unpacks the archive @var{filename} using the tar program. -## The resulting files are placed in the directory @var{outputdir}, -## which defaults to the current directory. -## The used uncompressing algorithm depends on the extension of -## @var{filename}. If @var{filename} doesn't have an extension a list -## of supported extensions is tried. +## @deftypefn {Function File} untar (@var{tarfile}, @var{dir}) +## Unpack the TAR archive @var{tarfile} to the directory @var{dir}. +## If @var{dir} is not specified, it defaults to the current directory. +## @seealso{tar, gzip, gunzip, zip, unzip} ## @end deftypefn -## Author: Søren Hauberg <hauberg at gmail dot com> +## Author: Søren Hauberg <hauberg@gmail.com> +## Adapted-By: jwe -# XXX: how do we support returning the extracted filenames? -# If strip was sane, we could simply return strip(output), -# which is what is currently done. However this is not -# Matlab compatible, since Matlab returns a cellstr and -# this implementation returns a matrix. -function out = untar(filename, outputdir) - if (nargin == 0) - print_usage("untar"); - elseif (nargin == 1) - outputdir = "."; - endif - - ## If filename is a sq_string, convert it to a string - filename = sprintf("%s", filename); - - ## XXX: what about "" (i.e. no extension) ? - supported_extensions = {"tar", "tar.gz", "tgz", "tar.bz", "tar.bz2", "tbz", "tbz2"}; +function files = untar (tarfile, dir) - ## Make sure filename and outputdir are strings - if (!ischar(filename) || !ischar(outputdir)) - error("All arguments must be strings.\n"); - endif - - ## Get extension of filename - dots = find(filename == "."); - for dot = dots - curext = filename(dot+1:end); - if (any(strcmp(curext, supported_extensions))) - ext = curext; - break; - endif - endfor + if (nargin == 1 || nargin == 2) - ## If no extension was found, iterate over possible extensions - ## and try to append them to filename - if (!exist("ext", "var")) - for i = 1:length(supported_extensions) - curext = supported_extensions{i}; - if (exist([filename "." curext], "file")) - filename = [filename "." curext]; - ext = curext; - break; - endif - endfor + if (nargin == 1) + dir = "."; endif - ## If no usable extension was found give an error - if (!exist("ext", "var")) - error("No supported extension was found for %s\n", filename); + if (ischar (tarfile) && ischar (dir)) + + orig_dir = pwd (); + + tarfile = canonicalize_file_name (tarfile); + + s = stat (dir); + if (isempty (s)) + [status, msg] = mkdir (dir); + if (! status) + error ("untar: mkdir failed to create %s: %s", dir, msg); + endif + elseif (! S_ISDIR (s.mode)) + error ("untar: %s: not a directory", dir); + endif + + unwind_protect + chdir (dir); + [status, output] = system (sprintf ("tar -x -v -f %s", tarfile)); + unwind_protect_cleanup + chdir (orig_dir); + end_unwind_protect + + if (status == 0) + if (nargout > 0) + fs = filesep (); + if (dir(end) != fs) + dir = strcat (dir, fs); + endif + ## Sadly not reliable if a filename contains a newline + ## character! + if (output(end) == "\n") + output(end) = []; + endif + files = cellstr (split (output, "\n")); + if (! strcmp (dir, ".")) + nf = length (files); + for i = 1:nf + files{i} = strcat (dir, files{i}); + endfor + endif + files = files'; + endif + else + error ("tar: tar exited with status = %s", status); + endif + + else + error ("untar: expecting arguments to be character strings"); endif - - ## Determine which flags to use with tar - switch (ext) - case {"tar"} flag = ""; - case {"tar.gz", "tgz"} flag = "z"; - case {"tar.bz", "tar.bz2", "tbz", "tbz2"} flag = "j"; - endswitch - ## Call tar - [output, status] = system(["tar -" flag "xvf " filename " -C " outputdir]); - if (status != 0) - error("tar returned the following error: %s\n", output); - endif - - if (nargout > 0) - out = split(output, "\n"); - endif + else + print_usage ("untar"); + endif + endfunction