atoms modules tests fixed
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsRemoveList.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.1-en.txt
9
10 // Internal function
11
12 // Return a matrix that list the changes caused by the uninstallation of one or
13 // more packages
14
15 // -->A = atomsRemoveList('toolbox_2',%F)
16 //  A  =
17 //
18 // !-  U  toolbox_2  1.5  !
19 // !                      !
20 // !-  U  toolbox_2  1.3  !
21 // !                      !
22 // !-  B  toolbox_3  1.6  !
23 // !                      !
24 // !-  B  toolbox_5  1.0  !
25 // !                      !
26 // !-  B  toolbox_4  1.0  !
27
28 // -  : The package will be removed
29 // ~  : The package will be keeped
30
31 // U  : The package is intentionnaly removed
32 // P  : The package is a parent of one package
33 // C  : The package is a child of one package
34 // B  : The package will be broken (It's a parent but cannot be uninstall)
35
36 function remList = atomsRemoveList(packages,section)
37
38     remList = [];
39
40     // Check input parameters
41     // =========================================================================
42     rhs = argn(2);
43
44     // Input argument number
45     // =========================================================================
46
47     if rhs <> 2 then
48         error(msprintf(gettext("%s: Wrong number of input arguments: %d expected.\n"),"atomsRemoveList",2))
49     end
50
51     // 1st input argument
52     // =========================================================================
53
54     if type(packages) <> 10 then
55         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsRemoveList",1));
56     end
57
58     if size(packages(1,:),"*") > 2 then
59         error(msprintf(gettext("%s: Wrong size for input argument #%d: mx1 or mx2 string matrix expected.\n"),"atomsRemoveList",1));
60     end
61
62     // 2nd input argument
63     // =========================================================================
64
65     if type(section) <> 10 then
66         error(msprintf(gettext("%s: Wrong type for input argument #%d: Boolean or single string expected.\n"),"atomsRemoveList",2));
67     end
68
69     if and(section<>["user","allusers","all"]) then
70         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'',''allusers'' or ''all'' expected.\n"),"atomsRemoveList",2));
71     end
72
73     if section == "all" then
74         sections = ["allusers","user"];
75     else
76         sections = section;
77     end
78
79     // Remove leading and trailing whitespace
80     // =========================================================================
81     packages = stripblanks(packages);
82
83     // If mx1 matrix, add a 2nd column with empty versions
84     // =========================================================================
85     if size(packages(1,:),"*") == 1 then
86         packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
87     end
88
89     // Loop on packages and to build the list of package to remove
90     // =========================================================================
91
92     // First step : List the packages wanted by the user
93
94     for i=1:size(packages(:,1),"*")
95
96         package_names(i)    = packages(i,1);
97         package_versions(i) = packages(i,2);
98
99         // get the list of the versions of this package to uninstall
100
101         if isempty(package_versions(i)) then
102
103             // No version is mentioned :
104             // → uninstall all version of this toolbox (if we have the right, of
105             // course)
106             this_package_versions = atomsGetInstalledVers(package_names(i),section);
107
108         else
109             // A version is mentioned
110
111             if isempty( strindex(package_versions(i),"-") ) then
112
113                 // The packaging version is not mentioned :
114                 // → Remove all packaging version that fit with the mentioned version
115
116                 candidates            = atomsGetInstalledVers(package_names(i),section);
117                 this_package_versions = [];
118
119                 for j=1:size(candidates,"*")
120
121                     if isempty( strindex(candidates(j),"-") ) then
122                         if candidates(j) == package_versions(i) then
123                             this_package_versions = [ this_package_versions ; candidates(j) ];
124                         end
125
126                     else
127                         if part(candidates(j), 1:strindex(candidates(j),"-")-1)  == package_versions(i) then
128                             this_package_versions = [ this_package_versions ; candidates(j) ];
129                         end
130                     end
131
132                 end
133             else
134
135                 // The packaging version is mentioned :
136                 // → Just uninstall the specified version
137                 this_package_versions = package_versions(i);
138
139             end
140         end
141
142         for j=1:size(this_package_versions,"*")
143             for k=1:size(sections,"*")
144                 if atomsIsInstalled([package_names(i) this_package_versions(j)],sections(k)) ..
145                     & (remList == [] || isempty(find(remList(:,3)+" - "+remList(:,4)+" - "+remList(:,5) == package_names(i)+" - "+this_package_versions(j)+" - "+sections(k)))) then
146                     remList = [ remList ; "-" "U" package_names(i) this_package_versions(j) sections(k) ];
147                 end
148             end
149         end
150     end
151
152     // Second Step : List the packages that depends of the uninstalled packages
153     // =========================================================================
154     packages = remList;
155     for i=1:size(packages(:,1),"*")
156         this_package_name    = packages(i,3);
157         this_package_version = packages(i,4);
158         this_package_section = packages(i,5);
159
160         // Get the parents of this toolbox
161         // (inevitably removed, unless we have not the right)
162         // ----------------------------------------------------
163         this_package_parents = atomsGetDepParents([this_package_name this_package_version],section);
164
165         for j=1:size(this_package_parents(:,1),"*")
166
167             this_parent_name    = this_package_parents(j,1);
168             this_parent_version = this_package_parents(j,2);
169             this_parent_section = this_package_parents(j,3);
170
171             // Check if we have the right to remove this package
172             // If not, tag it as Broken (for later)
173             if section=="user" then
174                 details = atomsGetInstalledDetails([this_package_parents(j,1) this_package_parents(j,2)],section);
175                 if details(1,3) == "allusers" then
176                     remList = [ remList ; "~" "B" this_parent_name this_parent_version this_package_section ]; // B stands for "Broken"
177                     continue
178                 end
179             end
180
181             // Add this parent to the list
182             if find(remList(:,3)+" - "+remList(:,4)+" - "+remList(:,5) == this_parent_name+" - "+this_parent_version+" - "+this_parent_section ) == [] then
183                 remList = [ remList ; "-" "P" this_parent_name this_parent_version this_package_section ];  // P stands for "Parent"
184             end
185
186         end
187
188         // Get the childs of this toolbox
189         // ----------------------------------------------
190
191         this_package_childs = atomsGetDepChilds([this_package_name this_package_version],section);
192
193         for j=1:size(this_package_childs(:,1),"*")
194
195             this_child_name    = this_package_childs(j,1);
196             this_child_version = this_package_childs(j,2);
197
198             // Check if we have the right to remove this package
199             // If not, Do not add it to the list
200             if section=="user" then
201                 details = atomsGetInstalledDetails(this_package_childs(j,:),section);
202                 if details(3) == "allusers" then
203                     continue
204                 end
205             end
206             if find(remList(:,3)+" - "+remList(:,4)+" - "+remList(:,5) == this_child_name+" - "+this_child_version+" - "+this_package_section) == [] then
207                 remList = [ remList ; "-" "C" this_child_name this_child_version this_package_section ]; // C stands for "Child"
208             end
209
210         end
211
212     end
213
214     // Third Step : Loop on childs check if we can remove it or not
215     // =========================================================================
216     packages = remList(find(remList(:,2)=="C"),:);
217     for i=1:size(remList(:,1),"*")
218
219         // This is not a Child package :
220         // => continue
221         // ----------------------------------------------
222
223         if remList(i,2) <> "C" then
224             continue;
225         end
226
227         this_package_name    = remList(i,3);
228         this_package_version = remList(i,4);
229
230         // The package (A child) has been intentionnaly installed :
231         // => Do not remove it (it and it's childs)
232         // ----------------------------------------------
233
234         if atomsGetInstalledStatus([this_package_name this_package_version],section) == "I" then
235
236             // It
237             remList(i,1) = "~";
238
239             // It's Childs
240             this_package_childs     = atomsGetDepChilds([this_package_name this_package_version],section);
241             remList_mod             = remList(:,3) + " - " +  remList(:,4);
242
243             for j=1:size(this_package_childs(:,1),"*")
244                 remList( find(remList_mod == this_package_childs(j,1) + " - " + this_package_childs(j,2) , 1 )) = "~";
245             end
246
247         end
248
249         // Get the parents of this toolbox
250         // ----------------------------------------------
251
252         this_package_parents = atomsGetDepParents([this_package_name this_package_version],section);
253
254         for j=1:size(this_package_parents(:,1),"*")
255
256             if find(remList(:,3)+" - "+remList(:,4) == this_package_parents(j,1)+" - "+this_package_parents(j,2)) == [] then
257                 // One of the parent is not the remove list
258                 // => do not install it
259                 remList(i,1) = "~";
260                 continue;
261             end
262         end
263     end
264
265 endfunction