4dd35a40f479872f31f7e4f048a3e9c38d1b6a2f
[scilab.git] / scilab / modules / atoms / macros / atomsLoad.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009-2010 - 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.1-en.txt
9
10 // End user function
11
12 // Load one or several toolboxes
13
14 function result = atomsLoad(packages)
15
16     // Load Atoms Internals lib if it's not already loaded
17     // =========================================================================
18     if ~ exists("atomsinternalslib") then
19         load("SCI/modules/atoms/macros/atoms_internals/lib");
20     end
21
22     // Init the output argument
23     // =========================================================================
24     result = [];
25
26     // Check ATOMSAUTOLOAD variable
27     // =========================================================================
28     if ~isdef("ATOMSAUTOLOAD") | (ATOMSAUTOLOAD<>%T) then
29         ATOMSAUTOLOAD = %F;
30     end
31
32     // Check input parameters
33     // =========================================================================
34
35     rhs = argn(2);
36
37     if rhs <> 1 then
38         error(msprintf(gettext("%s: Wrong number of input arguments: %d expected.\n"),"atomsLoad",1,2))
39     end
40
41     if type(packages) <> 10 then
42         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsLoad",1));
43     end
44
45     if size(packages(1,:),"*") > 3 then
46         error(msprintf(gettext("%s: Wrong size for input argument #%d: mx1,mx2 or mx3 string matrix expected.\n"),"atomsLoad",1));
47     end
48
49     packages = stripblanks(packages);
50
51     // Complete packages matrix with empty columns
52     // =========================================================================
53
54     if size(packages(1,:),"*") == 1 then
55         packages = [ packages emptystr(size(packages(:,1),"*"),1) emptystr(size(packages(:,1),"*"),1) ];
56
57     elseif size(packages(1,:),"*") == 2 then
58         packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
59
60     end
61
62     // Plan the path → 4th column
63     // =========================================================================
64     packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
65
66     // Verbose Mode ?
67     // =========================================================================
68     if strcmpi(atomsGetConfig("Verbose"),"True") == 0 then
69         ATOMSVERBOSE = %T;
70     else
71         ATOMSVERBOSE = %F;
72     end
73
74     // Already loaded modules :
75     // =========================================================================
76     loaded = atomsLoadLoad();
77     nbAdd  = 0;
78
79     // Remove duplicate packages (name - version)
80     // =========================================================================
81
82     [matout,index] = unique([packages(:,1) packages(:,2)],"r");
83     packages       = packages(gsort(index,"g","i"),:);
84
85     // Loop on input parameter
86     // =========================================================================
87
88     for i=1:size(packages(:,1),"*")
89
90         // The module's installed version hasn't been specified or is empty
91         // → Set the MRV available
92         // =====================================================================
93
94         if isempty(packages(i,2)) then
95
96             if ~ isempty(packages(i,3)) then
97                 section = packages(i,3);
98
99             else
100                 section = "all";
101
102             end
103
104             this_module_versions = atomsGetInstalledVers(packages(i,1),section);
105
106             if isempty(this_module_versions) then
107                 if section == "all" then
108                     error(msprintf(gettext("%s: Module ''%s'' is not installed.\n"),"atomsLoad",packages(i,1)));
109                 else
110                     error(msprintf(gettext("%s: Module ''%s'' is not installed (''%s'' section).\n"),"atomsLoad",packages(i,1),section));
111                 end
112             else
113                 packages(i,2) = this_module_versions(1);
114             end
115
116         else
117
118             if ~atomsIsInstalled([packages(i,1) packages(i,2)]) then
119                 error(msprintf(gettext("%s: Module ''%s - %s'' is not installed.\n"),"atomsLoad",packages(i,1),packages(i,2)));
120             end
121
122             // If the packaging version is not mentioned, define it
123             if isempty(strindex(packages(i,2),"-")) then
124                 this_package_details = atomsGetInstalledDetails([packages(i,1) packages(i,2) packages(i,3)]);
125                 packages(i,2)        = this_package_details(2);
126             end
127
128         end
129
130         // The module's installed section hasn't been specified or is empty
131         // → If the module (same name/same version) is installed in both sections,
132         //   module installed in the "user" section is taken
133         // =====================================================================
134
135         if isempty(packages(i,3)) then
136
137             sections = ["user","allusers"];
138
139             for j=1:size(sections,"*")
140                 if atomsIsInstalled([packages(i,1) packages(i,2)],sections(j)) then
141                     packages(i,3) = sections(j);
142                     break
143                 end
144             end
145
146         else
147
148             // Check if modules are installed
149             if ~ atomsIsInstalled([packages(i,1) packages(i,2)],packages(i,3)) then
150                 mprintf(gettext("%s: The following modules are not installed:\n"),"atomsAutoloadAdd");
151                 mprintf("\t - ''%s - %s'' (''%s'' section)\n",packages(i,1),packages(i,2),packages(i,3));
152                 error("");
153             end
154
155         end
156
157         // Get the installed path
158         // =====================================================================
159         packages(i,4) = atomsGetInstalledPath([packages(i,1) packages(i,2) packages(i,3)]);
160
161     end
162
163     // Loop on packages gived by the user
164     // =========================================================================
165
166     mandatory_packages      = struct();
167     mandatory_packages_name = struct();
168     mandatory_packages_mat  = [];
169
170     for i=1:size(packages(:,1),"*")
171
172         this_package_name    = packages(i,1);
173         this_package_version = packages(i,2);
174         this_package_section = packages(i,3);
175         this_package_path    = packages(i,4);
176
177         // Check if the user try to load 2 versions of the same toolbox at the
178         // same time
179         // =====================================================================
180         if size( find( this_package_name == packages(:,1) ) > 1 ) then
181             this_versions = packages( find( this_package_name == packages(:,1) ) , 2 );
182             for j=2:size(this_versions,"*")
183                 if this_versions(j) <> this_versions(1) then
184                     mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",this_package_name);
185                     mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),this_package_name,this_versions(1));
186                     mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),this_package_name,this_versions(j));
187                     mprintf("\n");
188
189                     if ATOMSAUTOLOAD then
190                         return;
191                     else
192                         error("");
193                     end
194                 end
195             end
196         end
197
198         // Check if this toolbox is already loaded
199         // =====================================================================
200         if atomsIsLoaded([this_package_name this_package_version]) then
201             atomsDisp(msprintf("\tThe package %s (%s) is already loaded",this_package_name,this_package_version));
202             continue;
203         end
204
205         // Check if another version of this toolbox is already loaded
206         // =====================================================================
207         [is_loaded,loaded_version] =  atomsIsLoaded(this_package_name);
208         if is_loaded then
209             if ATOMSAUTOLOAD then
210                 mprintf(gettext("%s: Another version of the package %s is already loaded : %s\n"),"atomsLoad",this_package_name,loaded_version);
211             else
212                 error(msprintf(gettext("%s: Another version of the package %s is already loaded : %s\n"),"atomsLoad",this_package_name,loaded_version));
213             end
214             continue;
215         end
216
217         mandatory_packages(this_package_name+" - "+this_package_version) = "asked_by_user";
218         mandatory_packages_name(this_package_name) = this_package_version;
219         mandatory_packages_mat = [ mandatory_packages_mat ; this_package_name this_package_version this_package_section this_package_path ];
220
221     end
222
223     // Fill the list of package to load
224     // =========================================================================
225
226     for i=1:size(packages(:,1),"*")
227
228         this_package_name    = packages(i,1);
229         this_package_version = packages(i,2);
230         this_package_section = packages(i,3);
231         this_package_path    = packages(i,4);
232
233         childs = atomsGetDepChilds([this_package_name this_package_version]);
234
235         for j=1:size( childs(:,1) , "*")
236
237             // Check if it is already loaded
238             // -------------------------------------------------------
239             if atomsIsLoaded(childs(j,:)) then
240                 continue;
241             end
242
243             // Check if another version of this package is already loaded
244             // -------------------------------------------------------
245             [is_loaded,loaded_version] =  atomsIsLoaded(childs(j,1));
246             if is_loaded then
247                 mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",childs(j,1));
248                 mprintf(gettext("\t - ''%s - %s'' is already loaded\n"),childs(j,1),loaded_version);
249                 mprintf(gettext("\t - ''%s - %s'' is needed by ''%s - %s''\n"),childs(j,1),childs(j,2),this_package_name,this_package_version);
250                 mprintf("\n");
251
252                 if ATOMSAUTOLOAD then
253                     return;
254                 else
255                     error("");
256                 end
257             end
258
259             // Check if it is already in the list
260             // -------------------------------------------------------
261             if isfield( mandatory_packages , childs(j,1)+" - "+childs(j,2) ) then
262                 continue;
263             end
264
265             // Check if another version is already in the list
266             // -------------------------------------------------------
267             if isfield( mandatory_packages_name , childs(j,1) ) then
268
269                 // if it's not the name version => error
270                 if mandatory_packages_name(childs(j,1)) <> childs(j,2) then
271
272                     mprintf(gettext("%s: Several versions of a package (%s) cannot be loaded at the same scilab session :\n"),"atomsLoad",childs(j,1));
273                     mprintf(gettext("\t - ''%s - %s'' is needed by ''%s - %s''\n"),childs(j,1),childs(j,2),packages(i,1),packages(i,2));
274
275                     // The other version of the package is asked by the user
276                     if mandatory_packages(childs(j,1)+" - "+mandatory_packages_name(childs(j,1))) == "asked_by_user" then
277                         mprintf(gettext("\t - You''ve asked ''%s - %s''\n"),childs(j,1),mandatory_packages_name(childs(j,1)));
278
279                         // The other version of the package is a need by another package
280                     else
281                         mprintf(gettext("\t - ''%s - %s'' is needed by ''%s''\n"), ..
282                         childs(j,1), .. // name
283                         mandatory_packages_name(childs(j,1)), .. // version
284                         mandatory_packages(childs(j,1)+" - "+mandatory_packages_name(childs(j,1))) .. // name - version
285                         );
286                     end
287
288                     mprintf("\n");
289                     if ATOMSAUTOLOAD then
290                         return;
291                     else
292                         error("");
293                     end
294                 end
295             end
296
297             // The child has passed the test, add it to the mandatory
298             // packages to load
299             // -------------------------------------------------------
300
301             mandatory_packages(childs(j,1)+" - "+childs(j,2)) = packages(i,1)+" - "+packages(i,2);
302             mandatory_packages_name(childs(j,1)) = childs(j,2);
303             mandatory_packages_mat = [ childs(j,1) childs(j,2) this_package_section atomsGetInstalledPath(childs(j,:),this_package_section) ; mandatory_packages_mat ];
304         end
305     end
306
307     // Libraries to resume
308     // =========================================================================
309     libs_resume = [];
310
311     if ~ isempty(mandatory_packages_mat) then
312         mprintf("\n");
313     end
314
315     for i=1:size(mandatory_packages_mat(:,1),"*")
316
317         this_package_name    = mandatory_packages_mat(i,1);
318         this_package_version = mandatory_packages_mat(i,2);
319         this_package_section = mandatory_packages_mat(i,3);
320         this_package_path    = mandatory_packages_mat(i,4);
321
322         // Get the list of lib
323         // =====================================================================
324         libs_before = librarieslist();
325
326         // Exec the loader
327         // =====================================================================
328
329         loader_file = pathconvert(this_package_path) + "loader.sce";
330
331         if fileinfo(loader_file)==[] then
332             msg = _("%s: The file ''%s'' from (%s - %s) doesn''t exist or is not read accessible.\n")
333             mprintf(msg, "atomsLoad", loader_file, this_package_name, this_package_version);
334             if ATOMSAUTOLOAD then
335                 return;
336             end
337         end
338
339         ierr = execstr("exec(loader_file,-1)","errcatch");
340
341         if ierr > 0 then
342             mprintf(gettext("%s: An error occurred while loading ''%s-%s'':\n"),"atomsLoad",this_package_name,this_package_version);
343             errormsg = lasterror(%T);
344             mprintf("\t%s\n",errormsg);
345             if ATOMSAUTOLOAD then
346                 continue;
347             else
348                 error("");
349             end
350         end
351
352         mprintf("\n");
353
354         // Get the list of libraries (macros)
355         // =====================================================================
356         libs_after = librarieslist();
357
358         // Loop on libs_after
359         // =====================================================================
360         for j=1:size(libs_after,"*")
361
362             if find(libs_after(j) == libs_before) == [] then
363                 libs_resume = [ libs_resume ; libs_after(j) ];
364             end
365         end
366
367         // Fill the output argument
368         // =====================================================================
369         result = [ result ; mandatory_packages_mat(i,:) ];
370
371         // fill the loaded matrix
372         // =====================================================================
373
374         if and(loaded(:,1) <> this_package_name) then
375             nbAdd  = nbAdd + 1;
376             loaded = [ loaded ; this_package_name this_package_version this_package_section ];
377         end
378
379     end
380
381     // Apply changes
382     // =========================================================================
383     if nbAdd > 0 then
384         atomsLoadSave(loaded);
385     end
386
387     // If libs_resume is empty, the job is done
388     // =========================================================================
389     if isempty(libs_resume) then
390         return;
391     end
392
393     // Build the resume cmd
394     // =========================================================================
395
396     resume_cmd = "[";
397
398     for i=1:size(libs_resume,"*")
399         resume_cmd = resume_cmd + libs_resume(i);
400         if i<size(libs_resume,"*") then
401             resume_cmd = resume_cmd + ",";
402         else
403             resume_cmd = resume_cmd + "] = resume(";
404         end
405     end
406
407     for i=1:size(libs_resume,"*")
408         resume_cmd = resume_cmd + libs_resume(i);
409         if i<size(libs_resume,"*") then
410             resume_cmd = resume_cmd + ",";
411         else
412             resume_cmd = resume_cmd + ");";
413         end
414     end
415
416     // Exec the resume cmd
417     // =========================================================================
418     execstr(resume_cmd);
419
420 endfunction