a2d0c6a7547566deb2f0166872fbd29d73e07beb
[scilab.git] / scilab / modules / atoms / macros / atomsLoad.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 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 // Load one or several toolboxes
11
12 function result = atomsLoad(name,version,section)
13         
14         // Load Atoms Internals lib if it's not already loaded
15         // =========================================================================
16         if ~ exists("atomsinternalslib") then
17                 load("SCI/modules/atoms/macros/atoms_internals/lib");
18         end
19         
20         // Init the output argument
21         // =========================================================================
22         result = [];
23         
24         // Check number of input arguments
25         // =========================================================================
26         rhs = argn(2);
27         
28         if rhs < 1 | rhs > 3 then
29                 error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsLoad",1,3));
30         end
31         
32         // Check input parameters type
33         // =========================================================================
34         
35         if type(name) <> 10 then
36                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsLoad",1));
37         end
38         
39         if (rhs>1) & (type(version) <> 10) then
40                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsLoad",2));
41         end
42         
43         // name and version must have the same size
44         // =========================================================================
45         
46         if (rhs>1) & (or( size(name) <> size(version) )) then
47                 error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsLoad",1,2));
48         end
49         
50         // Allusers/user management
51         // =========================================================================
52         
53         if rhs < 3 then
54                 section = "all";
55         
56         else
57                 
58                 // Process the 2nd input argument : allusers
59                 // Allusers can be a boolean or equal to "user" or "allusers"
60                 
61                 if type(section) <> 10 then
62                         error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean or a single string expected.\n"),"atomsLoad",3));
63                 end
64                 
65                 if and(section<>["user","allusers","all"]) then
66                         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' or ''all'' expected.\n"),"atomsLoad",3));
67                 end
68                 
69         end
70         
71         // If only one input argument, define the version (The Most Recent Version)
72         // =========================================================================
73         
74         if (rhs<2) | (rhs>=2 & isempty(version)) then
75                 
76                 for i=1:size(name,"*")
77                         
78                         this_module_versions = atomsGetInstalledVers(name(i),section);
79                         
80                         if isempty(this_module_versions) then
81                                 error(msprintf(gettext("%s: No version of the module ''%s'' is installed.\n"),"atomsLoad",name(i)));
82                         else
83                                 version(i) = this_module_versions(1);
84                         end
85                         
86                 end
87                 
88         else
89         
90         // Check if the packages to load are installed
91         // =========================================================================
92         
93                 if or( ~ atomsIsInstalled(name,version,section) ) then
94                         for i=1:size(name,"*")
95                                 if ~atomsIsInstalled(name(i),version(i),section) then
96                                         error(msprintf(gettext("%s: the module ''%s - %s'' is not installed.\n"),"atomsLoad",name(i),version(i)));
97                                 end
98                         end
99                 end
100         end
101         
102         // Get path of the toolboxes
103         // =========================================================================
104         path = atomsGetInstalledPath(name,version);
105         
106         // Create the TMPDIR/atoms directory
107         // =========================================================================
108         if ~ isdir(TMPDIR+"/atoms") then
109                 status = mkdir( TMPDIR+"/atoms" );
110                 if status <> 1 then
111                         error(msprintf( ..
112                                 gettext("%s: The directory ""%s"" cannot been created, please check if you have write access on this directory.\n"), ..
113                                 "atomsLoad", ..
114                                 TMPDIR+"/atoms"));
115                 end
116         end
117         
118         // Verbose Mode ?
119         // =========================================================================
120         if strcmpi(atomsGetConfig("Verbose"),"True") == 0 then
121                 ATOMSVERBOSE = %T;
122         else
123                 ATOMSVERBOSE = %F;
124         end
125         
126         // Define the path of the loaded file
127         // =========================================================================
128         loaded_file = pathconvert(TMPDIR+"/atoms/loaded",%F);
129         
130         // Does the loaded file exist, if yes load it
131         // =========================================================================
132         nbAdd = 0;
133         if fileinfo(loaded_file) <> [] then
134                 loaded = mgetl(loaded_file);
135         else
136                 loaded = [];
137         end
138         
139         // Loop on packages gived by the user
140         // =========================================================================
141         
142         mandatory_packages      = struct();
143         mandatory_packages_name = struct();
144         mandatory_packages_mat  = [];
145         
146         for i=1:size(name,"*")
147                 
148                 // Check if the user try to load 2 versions of the same toolbox at the
149                 // same time
150                 // =====================================================================
151                 if size( find( name(i) == name ) > 1 ) then
152                         this_versions = version( find( name(i) == name ) );
153                         for j=2:size(this_versions,"*")
154                                 if this_versions(j) <> this_versions(1) then
155                                         mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",name(i));
156                                         mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),name(i),this_versions(1));
157                                         mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),name(i),this_versions(j));
158                                         mprintf("\n");
159                                         error("");
160                                 end
161                         end
162                 end
163                 
164                 // Check if this toolbox is already loaded
165                 // =====================================================================
166                 if atomsIsLoaded(name(i),version(i)) then
167                         atomsDisp(msprintf("\tThe package %s (%s) is already loaded\n\n",name(i),version(i)));
168                         continue;
169                 end
170                 
171                 // Check if another version of this toolbox is already loaded
172                 // =====================================================================
173                 [is_loaded,loaded_version] =  atomsIsLoaded(name(i));
174                 if is_loaded then
175                         error(msprintf(gettext("%s: Another version of the package %s is already loaded : %s\n"),"atomsLoad",name(i),loaded_version));
176                         continue;
177                 end
178                 
179                 mandatory_packages(name(i)+" - "+version(i)) = "asked_by_user";
180                 mandatory_packages_name(name(i)) = version(i);
181                 mandatory_packages_mat = [ mandatory_packages_mat ; name(i) version(i) path(i) ];
182                 
183         end
184         
185         // Fill the list of package to load
186         // =========================================================================
187         
188         for i=1:size(name,"*")
189                 
190                 childs = atomsGetDepChilds(name(i),version(i));
191                 
192                 for j=1:size( childs(:,1) , "*")
193                         
194                         // Check if it is already loaded
195                         // -------------------------------------------------------
196                         if atomsIsLoaded( childs(j,1) , childs(j,2) ) then
197                                 continue;
198                         end
199                         
200                         // Check if another version of this package is already loaded
201                         // -------------------------------------------------------
202                         [is_loaded,loaded_version] =  atomsIsLoaded(childs(j,1));
203                         if is_loaded then
204                                 mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",childs(j,1));
205                                 mprintf(gettext("\t - ''%s - %s'' is already loaded\n"),childs(j,1),loaded_version);
206                                 mprintf(gettext("\t - ''%s - %s'' is needed by ''%s - %s''\n"),childs(j,1),childs(j,2),name(i),version(i));
207                                 mprintf("\n");
208                                 error("");
209                         end
210                         
211                         // Check if it is already in the list
212                         // -------------------------------------------------------
213                         if isfield( mandatory_packages , childs(j,1)+" - "+childs(j,2) ) then
214                                 continue;
215                         end
216                         
217                         // Check if another version is already in the list
218                         // -------------------------------------------------------
219                         if isfield( mandatory_packages_name , childs(j,1) ) then
220                                 
221                                 // if it's not the name version => error
222                                 if mandatory_packages_name(childs(j,1)) <> childs(j,2) then
223                                         
224                                         mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",childs(j,1));
225                                         mprintf(gettext("\t - ''%s - %s'' is needed by ''%s - %s''\n"),childs(j,1),childs(j,2),name(i),version(i));
226                                         
227                                         // The other version of the package is asked by the user
228                                         if mandatory_packages(childs(j,1)+" - "+mandatory_packages_name(childs(j,1))) == "asked_by_user" then
229                                                 mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),childs(j,1),mandatory_packages_name(childs(j,1)));
230                                         
231                                         // The other version of the package is a need by another package
232                                         else
233                                                 mprintf(gettext("\t - ''%s - %s'' is needed by ''%s''\n"), .. 
234                                                         childs(j,1), .. // name
235                                                         mandatory_packages_name(childs(j,1)), .. // version
236                                                         mandatory_packages(childs(j,1)+" - "+mandatory_packages_name(childs(j,1))) .. // name - version
237                                                         );
238                                         end
239                                         
240                                         mprintf("\n");
241                                         error("");
242                                 end
243                         end
244                         
245                         // The child has passed the test, add it to the mandatory
246                         // packages to load
247                         // -------------------------------------------------------
248                         
249                         mandatory_packages(childs(j,1)+" - "+childs(j,2)) = name(i)+" - "+version(i);
250                         mandatory_packages_name(childs(j,1)) = childs(j,2);
251                         mandatory_packages_mat = [ mandatory_packages_mat ; childs(j,1) childs(j,2) atomsGetInstalledPath(childs(j,1),childs(j,2),section) ];
252                         
253                 end
254         end
255         
256         // Libraries to resume
257         // =========================================================================
258         libs_resume = [];
259         
260         if ~ isempty(mandatory_packages_mat) then
261                 mprintf("\n");
262         end
263         
264         for i=1:size(mandatory_packages_mat(:,1),"*")
265                 
266                 this_package_name    = mandatory_packages_mat(i,1);
267                 this_package_version = mandatory_packages_mat(i,2);
268                 this_package_path    = mandatory_packages_mat(i,3);
269                 
270                 // Get the list of lib
271                 // =====================================================================
272                 libs_before = librarieslist();
273                 
274                 // Exec the loader
275                 // =====================================================================
276                 
277                 loader_file = pathconvert(this_package_path) + "loader.sce";
278                 
279                 if fileinfo(loader_file)==[] then
280                         error(msprintf(gettext("%s: The file ''%s'' doesn''t exist or is not read accessible.\n"),"atomsLoad",loader_file));
281                 end
282                 
283                 exec( loader_file );
284                 mprintf("\n");
285                 
286                 // Get the list of libraries (macros)
287                 // =====================================================================
288                 libs_after = librarieslist();
289                 
290                 // Loop on libs_after
291                 // =====================================================================
292                 for j=1:size(libs_after,"*")
293                         
294                         if find(libs_after(j) == libs_before) == [] then
295                                 libs_resume = [ libs_resume ; libs_after(j) ];
296                         end
297                 end
298                 
299                 // Fill the output argument
300                 // =====================================================================
301                 result = [ result ; mandatory_packages_mat(i,:) ];
302                 
303                 // fill the loaded matrix
304                 // =====================================================================
305                 if find(loaded == this_package_name + " - " + this_package_version) == [] then
306                         nbAdd  = nbAdd + 1;
307                         loaded = [ loaded ; this_package_name + " - " + this_package_version ];
308                 end
309                 
310         end
311         
312         // Apply changes
313         // =========================================================================
314         if nbAdd > 0 then
315                 mputl(loaded,loaded_file);
316         end
317         
318         // If libs_resume is empty, the job is done
319         // =========================================================================
320         if isempty(libs_resume) then
321                 return;
322         end
323         
324         // Build the resume cmd
325         // =========================================================================
326         
327         resume_cmd = "[";
328         
329         for i=1:size(libs_resume,"*")
330                 resume_cmd = resume_cmd + libs_resume(i);
331                 if i<size(libs_resume,"*") then
332                         resume_cmd = resume_cmd + ",";
333                 else
334                         resume_cmd = resume_cmd + "] = resume(";
335                 end
336         end
337         
338         for i=1:size(libs_resume,"*")
339                 resume_cmd = resume_cmd + libs_resume(i);
340                 if i<size(libs_resume,"*") then
341                         resume_cmd = resume_cmd + ",";
342                 else
343                         resume_cmd = resume_cmd + ");";
344                 end
345         end
346         
347         // Exec the resume cmd
348         // =========================================================================
349         execstr(resume_cmd);
350         
351 endfunction