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