Bump version numbers to 6.2.0
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsInstallList.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 // Output arguments :
16
17 //   insList  : . List  of the changes caused by the installation of one or
18 //                more packages
19 //              . matrix ( n x 4 )
20 //              . mandatory
21 //              . example :
22 //                 !~  U  toolbox_4  1.0  !
23 //                 !                      !
24 //                 !~     toolbox_2  1.3  !
25 //                 !                      !
26 //                 !~     toolbox_1  1.9  !
27 //                 !                      !
28 //                 !~  U  toolbox_5  1.0  !
29
30 //   tree_out : . Dependency tree of the package (returned by atomsDepTreeFlat)
31 //              . struct
32 //              . mandatory
33 //              . Example :
34 //                   tree_out  =
35 //                   toolbox_5 - 1.0: [1x1 struct]
36 //                   toolbox_4 - 1.0: [1x1 struct]
37 //                   toolbox_2 - 1.3: [1x1 struct]
38 //                   toolbox_1 - 1.9: [1x1 struct]
39
40 function [insList,depTree] = atomsInstallList(packages,section)
41
42     insList = [];
43     depTree = struct();
44
45     // Get scilab version (needed for later)
46     // =========================================================================
47     sciversion = strcat(string(getversion("scilab")) + ".");
48
49     // Check input parameters
50     // =========================================================================
51
52     rhs = argn(2);
53
54     if rhs > 2 then
55         error(msprintf(gettext("%s: Wrong number of input arguments: at most %d expected.\n"),"atomsInstallList",2))
56     end
57
58     // 1st input argument
59
60     if type(packages) <> 10 then
61         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallList",1));
62     end
63
64     if size(packages(1,:),"*") > 2 then
65         error(msprintf(gettext("%s: Wrong size for input argument #%d: mx1 or mx2 string matrix expected.\n"),"atomsInstall",1));
66     end
67
68     packages = stripblanks(packages);
69
70     // 2nd input input argument, section management :
71     //   - 1st case: section is not specified or is equal to "all", module
72     //               is searched in both "user" and "allusers" section
73     //   - 2nd case: section is equal to "user", module is only searched in
74     //               the "user" section"
75     //   - 3rd case: section is equal to "allusers", module is only searched
76     //               in the "allusers" section"
77
78     if rhs < 2 then
79         section = "all";
80
81     else
82
83         if type(section) <> 10 then
84             error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsInstallList",2));
85         end
86
87         if and(section<>["user","allusers","all"]) then
88             error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' expected.\n"),"atomsInstallList",2));
89         end
90
91     end
92
93     // If mx1 matrix, add a 2nd column with empty versions
94     // =========================================================================
95     if size(packages(1,:),"*") == 1 then
96         packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
97     end
98
99     // Loop on packages and to build the dependency tree
100     // =========================================================================
101
102     for i=1:size(packages(:,1),"*")
103
104         this_package_name    = packages(i,1);
105         this_package_version = packages(i,2);
106
107         // Now check if it's a valid package
108         if ~ atomsIsPackage(packages(i,:)) then
109             if isempty(this_package_version) then
110                 module_full_name = this_package_name;
111             else
112                 module_full_name = this_package_name + " - " + this_package_version;
113             end
114             msg = gettext("%s: The package ""%s"" is not registered.\nPlease check on the ATOMS repository that it is available for Scilab %d.%d on %s.\nIf it is, run atomsSystemUpdate() before trying atomsInstall(..) again.\n\n");
115             Vers = getversion('scilab');
116             msg = msprintf(msg, "atomsInstallList", module_full_name, Vers(1:2), getos());
117             atomsError("error", msg);
118         end
119
120         // Fill the version if it doesn't contain the packaging version
121         this_package_version = atomsPackagingVersion(packages(i,:));
122         packages(i,2)        = this_package_version;
123
124         // Build the depencency tree
125         [tree,version_out]  = atomsDepTreeFlat(this_package_name,this_package_version);
126
127         if (type(tree) == 4) & (~ tree) then
128             atomsError("error", ..
129             msprintf(gettext("%s: The dependency tree cannot be resolved.\n"),"atomsInstallList"));
130         end
131
132         // Update the  package_versions(i) with the version returned by
133         // atomsDepTreeFlat
134         packages(i,2) = version_out;
135
136         // Concatenate the tree with the existing one
137         depTree = atomsCatTree( depTree , tree );
138     end
139
140     // Add a field to detect later if it's the toolbox is automatically installed
141     // or if it's a user choice
142     // =========================================================================
143
144     for i=1:size(packages(:,1),"*")
145         this_package_details                     = depTree(packages(i,1)+" - "+packages(i,2));
146         this_package_details("user_choice")      = %T;
147         depTree(packages(i,1)+" - "+packages(i,2)) = this_package_details;
148     end
149
150     // Now we have the list of package that have to be installed
151     // We have to check if
152     //  - each package is already installed
153     //  - If yes, Is it the most recent version
154     // =========================================================================
155
156     mandatory_packages      = getfield(1,depTree);
157     mandatory_packages(1:2) = [];
158
159     for i=1:size(mandatory_packages,"*")
160
161         this_package_details = depTree(mandatory_packages(i));
162
163         this_package_name    = this_package_details("Toolbox");
164         this_package_version = this_package_details("Version");
165
166         if isfield(this_package_details,"user_choice") & this_package_details("user_choice") then
167             this_package_user_choice = "U"; // stand for User Choice
168         else
169             this_package_user_choice = ""; // stand for User Choice
170         end
171
172         to_install = %F;
173
174         // Now, it's time to check if the module is installed or not :
175         //   - 1st case: section is not specified or is equal to "all", module
176         //               is searched in both "user" and "allusers" section
177         //   - 2nd case: section is equal to "user", module is only searched in
178         //               the "user" section"
179         //   - 3rd case: section is equal to "allusers", module is only searched
180         //               in the "allusers" section"
181
182         if atomsIsInstalled(this_package_name,section) then
183             vers = atomsGetInstalledVers(this_package_name,section);
184             if find( vers == this_package_version ) == [] then
185                 to_install = %T;
186             end
187         else
188             to_install = %T;
189         end
190
191         if to_install then
192             insList = [ insList ; "+" this_package_user_choice this_package_name this_package_version ];
193         else
194             insList = [ insList ; "~" this_package_user_choice this_package_name this_package_version ];
195         end
196
197     end
198
199 endfunction
200
201 // =============================================================================
202 // Return the version filled with the packaging version
203 // → The result is based on the packages struct returned by atomsDESCRIPTIONget(),
204 //   not on the installed packages.
205 // → If a package doesn't exist in the packages struct, an empty string is
206 //   returned
207 // =============================================================================
208
209 function result = atomsPackagingVersion(packages)
210
211     // Initialize
212     // =========================================================================
213     result = [];
214
215     // Check input parameters
216     // =========================================================================
217     rhs  = argn(2);
218
219     if rhs <> 1 then
220         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsPackagingVersion",1));
221     end
222
223     if type(packages) <> 10 then
224         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsPackagingVersion",1));
225     end
226
227     if size(packages(1,:),"*") <> 2 then
228         error(msprintf(gettext("%s: Wrong size for input argument #%d: mx2 string matrix expected.\n"),"atomsPackagingVersion",1));
229     end
230
231     // Get all package description
232     // =========================================================================
233     allpackages = atomsDESCRIPTIONget();
234
235     // Loop on packages
236     // =========================================================================
237
238     for i=1:size(packages(:,1),"*")
239
240         result(i) = "",
241         name      = packages(i,1);
242         version   = packages(i,2);
243
244         // Check if the name exists in the packages struct
245         if ~ isfield(allpackages,name) then
246             result(i) = "";
247             break;
248         end
249
250         // 1st case : no version is mentioned
251         if isempty(version) then
252             result(i) = "";
253
254             // 2nd case : the packaging version is already mentioned
255         elseif ~ isempty(strindex(version,"-")) then
256             result(i) = version;
257
258             // 3rd case : the packaging version is not mentioned
259         else
260
261             // Loop on this packages versions
262             package_versions          = allpackages(name);
263             package_versions_tab      = getfield(1,package_versions);
264             package_versions_tab(1:2) = [];
265
266             for j=1:size(package_versions_tab,"*")
267
268                 if isempty( strindex(package_versions_tab(j),"-") ) then
269                     if package_versions_tab(j) == version then
270                         result(i) = version;
271                         break;
272                     end
273
274                 else
275                     if part(package_versions_tab(j), 1:strindex(package_versions_tab(j),"-")-1)==version then
276                         result(i) = package_versions_tab(j);
277                         break;
278                     end
279
280                 end
281
282             end
283         end
284
285     end
286
287 endfunction