ATOMS: homogenize function's profile
[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 // 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 // Internal function
11
12 // Output arguments :
13
14 //   insList  : . List  of the changes caused by the installation of one or
15 //                more packages
16 //              . matrix ( n x 4 ) 
17 //              . mandatory
18 //              . example :
19 //                 !~  U  toolbox_4  1.0  !
20 //                 !                      !
21 //                 !~     toolbox_2  1.3  !
22 //                 !                      !
23 //                 !~     toolbox_1  1.9  !
24 //                 !                      !
25 //                 !~  U  toolbox_5  1.0  !
26
27 //   tree_out : . Dependency tree of the package (returned by atomsDepTreeFlat)
28 //              . struct
29 //              . mandatory
30 //              . Example :
31 //                   tree_out  = 
32 //                   toolbox_5 - 1.0: [1x1 struct]
33 //                   toolbox_4 - 1.0: [1x1 struct]
34 //                   toolbox_2 - 1.3: [1x1 struct]
35 //                   toolbox_1 - 1.9: [1x1 struct]
36
37 function [insList,depTree] = atomsInstallList(packages,section)
38         
39         insList = [];
40         depTree = struct();
41         
42         // Save the initial path
43         // =========================================================================
44         initialpath = pwd();
45         
46         // Get scilab version (needed for later)
47         // =========================================================================
48         sciversion = strcat(string(getversion("scilab")) + ".");
49         
50         // Check input parameters
51         // =========================================================================
52         
53         rhs = argn(2);
54         
55         if rhs > 2 then
56                 error(msprintf(gettext("%s: Wrong number of input arguments: at most %d expected.\n"),"atomsInstallList",2))
57         end
58         
59         // 1st input argument
60         
61         if type(packages) <> 10 then
62                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallList",1));
63         end
64         
65         if size(packages(1,:),"*") > 2 then
66                 error(msprintf(gettext("%s: Wrong size for input argument #%d: mx1 or mx2 string matrix expected.\n"),"atomsInstall",1));
67         end
68         
69         packages = stripblanks(packages);
70         
71         // 2nd input input argument, section management :
72         //   - 1st case: section is not specified or is equal to "all", module 
73         //               is searched in both "user" and "allusers" section
74         //   - 2nd case: section is equal to "user", module is only searched in
75         //               the "user" section"
76         //   - 3rd case: section is equal to "allusers", module is only searched
77         //               in the "allusers" section"
78         
79         if rhs < 2 then
80                 section = "all";
81         
82         else
83                 
84                 if type(section) <> 10 then
85                         chdir(initialpath);
86                         error(msprintf(gettext("%s: Wrong type for input argument #%d: A single-string expected.\n"),"atomsInstallList",2));
87                 end
88                 
89                 if and(section<>["user","allusers","all"]) then
90                         chdir(initialpath);
91                         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' expected.\n"),"atomsInstallList",2));
92                 end
93                 
94         end
95         
96         // If mx1 matrix, add a 2nd column with empty versions
97         // =========================================================================
98         if size(packages(1,:),"*") == 1 then
99                 packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
100         end
101         
102         // Loop on packages and to build the dependency tree
103         // =========================================================================
104         
105         for i=1:size(packages(:,1),"*")
106                 
107                 this_package_name    = packages(i,1);
108                 this_package_version = packages(i,2);
109                 
110                 // Now check if it's a valid package
111                 if ~ atomsIsPackage(packages(i,:)) then
112                         if isempty(this_package_version) then
113                                 module_full_name = this_package_name;
114                         else
115                                 module_full_name = this_package_name+" - "+this_package_version;
116                         end
117                         chdir(initialpath);
118                         error(msprintf(gettext("%s: The package %s is not available.\n"),"atomsInstallList",module_full_name));
119                 end
120                 
121                 // Build the depencency tree
122                 [tree,version_out]  = atomsDepTreeFlat(this_package_name,this_package_version);
123                 
124                 if (type(tree) == 4) & (~ tree) then
125                         chdir(initialpath);
126                         error(msprintf(gettext("%s: The dependency tree cannot be resolved.\n"),"atomsInstallList",1));
127                 end
128                 
129                 // Update the  package_versions(i) with the version returned by
130                 // atomsDepTreeFlat
131                 packages(i,2) = version_out;
132                 
133                 // Concatenate the tree with the existing one
134                 depTree = atomsCatTree( depTree , tree );
135         end
136         
137         // Add a field to detect later if it's the toolbox is automaticaly installed
138         // or if it's a user choice
139         // =========================================================================
140         
141         for i=1:size(packages(:,1),"*")
142                 this_package_details                     = depTree(packages(i,1)+" - "+packages(i,2));
143                 this_package_details("user_choice")      = %T;
144                 depTree(packages(i,1)+" - "+packages(i,2)) = this_package_details;
145         end
146         
147         // Now we have the list of package that have to be installed
148         // We have to check if
149         //  - each package is already installed
150         //  - If yes, Is it the most recent version
151         // =========================================================================
152         
153         mandatory_packages      = getfield(1,depTree);
154         mandatory_packages(1:2) = [];
155         
156         for i=1:size(mandatory_packages,"*")
157                 
158                 this_package_details = depTree(mandatory_packages(i));
159                 
160                 this_package_name    = this_package_details("Toolbox");
161                 this_package_version = this_package_details("Version");
162                 
163                 if isfield(this_package_details,"user_choice") & this_package_details("user_choice") then
164                         this_package_user_choice = "U"; // stand for User Choice
165                 else
166                         this_package_user_choice = ""; // stand for User Choice
167                 end
168                 
169                 to_install = %F;
170                 
171                 // Now, it's time to check if the module is installed or not :
172                 //   - 1st case: section is not specified or is equal to "all", module 
173                 //               is searched in both "user" and "allusers" section
174                 //   - 2nd case: section is equal to "user", module is only searched in
175                 //               the "user" section"
176                 //   - 3rd case: section is equal to "allusers", module is only searched
177                 //               in the "allusers" section"
178                 
179                 if atomsIsInstalled(this_package_name,section) then
180                         vers = atomsGetInstalledVers(this_package_name,section);
181                         if find( vers == this_package_version ) == [] then
182                                 to_install = %T;
183                         end
184                 else
185                         to_install = %T;
186                 end
187                 
188                 if to_install then
189                         insList = [ insList ; "+" this_package_user_choice this_package_name this_package_version ];
190                 else
191                         insList = [ insList ; "~" this_package_user_choice this_package_name this_package_version ];
192                 end
193                 
194         end
195         
196         // Go to the initial location
197         // =========================================================================
198         chdir(initialpath);
199         
200 endfunction