[atoms] prevent unzip of spurious __MACOSX under Darwin
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsExtract.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 // Internal function
14
15 function dir_created = atomsExtract(archive_in,dir_out)
16
17     // Check input parameters number
18     // =========================================================================
19
20     rhs  = argn(2);
21
22     if rhs <> 2 then
23         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsExtract",2));
24     end
25
26     // Check input parameters type
27     // =========================================================================
28
29     if type(archive_in) <> 10 then
30         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsExtract",1));
31     end
32
33     if type(dir_out) <> 10 then
34         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsExtract",2));
35     end
36
37     // Check input parameters size
38     // =========================================================================
39
40     if size(archive_in,"*") <> 1 then
41         error(msprintf(gettext("%s: Wrong size for input argument #%d: string expected.\n"),"atomsExtract",1));
42     end
43
44     if size(dir_out,"*") <> 1 then
45         error(msprintf(gettext("%s: Wrong size for input argument #%d: string expected.\n"),"atomsExtract",2));
46     end
47
48     // Check input parameters value
49     // =========================================================================
50
51     if regexp(archive_in,"/(\.tar\.gz|\.tgz|\.zip)$/","o") == [] then
52         error(msprintf(gettext("%s: Wrong value for input argument #%d: Single string that ends with .tar.gz, .tgz or .zip expected.\n"),"atomsExtract",1));
53     end
54
55     if fileinfo(archive_in) == [] then
56         error(msprintf(gettext("%s: The file ""%s"" does not exist or is not read accessible.\n"),"atomsExtract",archive_in));
57     end
58
59     if ~ isdir(dir_out) then
60         error(msprintf(gettext("%s: The directory ""%s"" does not exist.\n"),"atomsExtract",dir_out));
61     end
62
63     // Operating system detection + Architecture detection
64     // =========================================================================
65     [OSNAME,ARCH,LINUX,MACOSX,SOLARIS,BSD] = atomsGetPlatform();
66
67     // Get the list of directories before the extraction
68     // =========================================================================
69     dirs_before = atomsListDir(dir_out);
70
71     // Build the extract command
72     // =========================================================================
73
74     if ( LINUX | MACOSX | SOLARIS | BSD ) & regexp(archive_in,"/(\.tar\.gz|\.tgz)$/","o") <> [] then
75
76         extract_cmd = "tar xzf "+ archive_in + " -C """+ dir_out + """";
77
78     elseif regexp(archive_in,"/\.zip$/","o") <> [] then
79
80         if getos() == "Windows" then
81             extract_cmd = """" + getshortpathname(pathconvert(SCI+"/tools/zip/unzip.exe",%F)) + """";
82         else
83             extract_cmd = "unzip";
84         end
85
86         extract_cmd = extract_cmd + " -q -o """ + archive_in + """ -d """ + pathconvert(dir_out,%F) +"""";
87
88         if getos() == "Darwin"
89             extract_cmd = extract_cmd + " -x __MACOSX/*"
90         end
91
92     end
93
94     [rep,stat,err] = unix_g(extract_cmd);
95
96     if stat ~= 0 then
97         atomsError("error", ..
98         msprintf(gettext("%s: The extraction of the archive ''%s'' has failed.\n"), ..
99         "atomsExtract", ..
100         strsubst(archive_in,"\","\\") ));
101     end
102
103     // Get the list of directories after the extraction
104     // =========================================================================
105
106     dirs_after = atomsListDir(dir_out);
107
108
109     // Get the name of the created directory
110     // =========================================================================
111
112     dir_created = [];
113
114     for j=1:size(dirs_after,"*")
115         if find(dirs_after(j) == dirs_before) == [] then
116             dir_created = dirs_after(j);
117             break;
118         end
119     end
120
121 endfunction
122
123
124 // =============================================================================
125 // Just get the list of the directories present in the current directory
126 // =============================================================================
127
128 function result = atomsListDir(path)
129
130     // Init the output argument
131     // =========================================================================
132     result = [];
133
134     // Save the initial path
135     // =========================================================================
136     initialpath = pwd();
137
138     chdir(path);
139     items  = listfiles();
140
141     // Loop on items
142     // =========================================================================
143     for i=1:size(items,"*")
144         if isdir(items(i)) then
145             result = [ result ; items(i) ];
146         end
147     end
148
149     // Go to the initial location
150     // =========================================================================
151     chdir(initialpath);
152
153 endfunction