annotate scripts/miscellaneous/untar.m @ 6049:04c2ad6d1679

[project @ 2006-10-13 14:32:15 by jwe]
author jwe
date Fri, 13 Oct 2006 14:32:23 +0000
parents 8467683311f8
children cd98c1e18d48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
1 ## Copyright (C) 2005 S�ren Hauberg
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
2 ##
6049
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
3 ## This file is part of Octave.
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
4 ##
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
6 ## under the terms of the GNU General Public License as published by
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
7 ## the Free Software Foundation; either version 2, or (at your option)
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
8 ## any later version.
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
9 ##
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
13 ## General Public License for more details.
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
14 ##
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
6049
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
16 ## along with Octave; see the file COPYING. If not, write to the Free
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
17 ## Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
04c2ad6d1679 [project @ 2006-10-13 14:32:15 by jwe]
jwe
parents: 6041
diff changeset
18 ## 02110-1301, USA.
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
19
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
20 ## -*- texinfo -*-
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
21 ## @deftypefn {Function File} untar (@var{tarfile}, @var{dir})
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
22 ## Unpack the TAR archive @var{tarfile} to the directory @var{dir}.
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
23 ## If @var{dir} is not specified, it defaults to the current directory.
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
24 ## @seealso{tar, gzip, gunzip, zip, unzip}
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
25 ## @end deftypefn
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
26
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
27 ## Author: S�ren Hauberg <hauberg@gmail.com>
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
28 ## Adapted-By: jwe
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
29
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
30 function files = untar (tarfile, directory)
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
31
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
32 if (nargin == 1 || nargin == 2)
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
33
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
34 if (nargin == 1)
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
35 directory = ".";
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
36 endif
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
37
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
38 ## The file must exist (and be a file) and the directory must be a
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
39 ## string.
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
40 if (exist (tarfile, "file") && ischar (directory))
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
41
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
42 orig_dir = pwd ();
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
43
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
44 tarfile = canonicalize_file_name (tarfile);
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
45
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
46 s = stat (directory);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
47 if (isempty (s))
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
48 [status, msg] = mkdir (directory);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
49 if (! status)
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
50 error ("untar: mkdir failed to create %s: %s", directory, msg);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
51 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
52 elseif (! S_ISDIR (s.mode))
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
53 error ("untar: %s: not a directory", directory);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
54 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
55
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
56 unwind_protect
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
57 chdir (directory);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
58 [status, output] = system (sprintf ("tar -x -v -f %s", tarfile));
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
59 unwind_protect_cleanup
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
60 chdir (orig_dir);
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
61 end_unwind_protect
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
62
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
63 if (status == 0)
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
64 if (nargout > 0)
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
65 fs = filesep ();
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
66 if (directory(end) != fs)
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
67 directory = strcat (directory, fs);
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
68 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
69 ## Sadly not reliable if a filename contains a newline
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
70 ## character!
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
71 if (output(end) == "\n")
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
72 output(end) = [];
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
73 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
74 files = cellstr (split (output, "\n"));
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
75 if (! strcmp (directory, "."))
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
76 nf = length (files);
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
77 for i = 1:nf
6041
8467683311f8 [project @ 2006-10-09 16:35:36 by jwe]
jwe
parents: 5808
diff changeset
78 files{i} = strcat (directory, files{i});
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
79 endfor
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
80 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
81 files = files';
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
82 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
83 else
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
84 error ("tar: tar exited with status = %s", status);
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
85 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
86
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
87 else
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
88 error ("untar: expecting arguments to be character strings");
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
89 endif
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
90
5808
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
91 else
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
92 print_usage ("untar");
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
93 endif
a18d85bdff31 [project @ 2006-05-11 03:11:03 by jwe]
jwe
parents: 5807
diff changeset
94
5807
29c4fb42b210 [project @ 2006-05-11 01:48:56 by jwe]
jwe
parents:
diff changeset
95 endfunction