c3e38038fb768a8bf764898de401f6b9ec830b0c
[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     end
89
90     [rep,stat,err] = unix_g(extract_cmd);
91
92     if stat ~= 0 then
93         atomsError("error", ..
94         msprintf(gettext("%s: The extraction of the archive ''%s'' has failed.\n"), ..
95         "atomsExtract", ..
96         strsubst(archive_in,"\","\\") ));
97     end
98
99     // Get the list of directories after the extraction
100     // =========================================================================
101
102     dirs_after = atomsListDir(dir_out);
103
104
105     // Get the name of the created directory
106     // =========================================================================
107
108     dir_created = [];
109
110     for j=1:size(dirs_after,"*")
111         if find(dirs_after(j) == dirs_before) == [] then
112             dir_created = dirs_after(j);
113             break;
114         end
115     end
116
117 endfunction
118
119
120 // =============================================================================
121 // Just get the list of the directories present in the current directory
122 // =============================================================================
123
124 function result = atomsListDir(path)
125
126     // Init the output argument
127     // =========================================================================
128     result = [];
129
130     // Save the initial path
131     // =========================================================================
132     initialpath = pwd();
133
134     chdir(path);
135     items  = listfiles();
136
137     // Loop on items
138     // =========================================================================
139     for i=1:size(items,"*")
140         if isdir(items(i)) then
141             result = [ result ; items(i) ];
142         end
143     end
144
145     // Go to the initial location
146     // =========================================================================
147     chdir(initialpath);
148
149 endfunction