68c7f69863462185048a75102a57ce9da76dd3e5
[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-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 mention :
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
134             else
135
136                 // The packaging version is mentioned :
137                 // → Just uninstall the specified version
138                 this_package_versions = package_versions(i);
139
140             end
141         end
142
143         for j=1:size(this_package_versions,"*")
144             for k=1:size(sections,"*")
145                 if atomsIsInstalled([package_names(i) this_package_versions(j)],sections(k)) ..
146                     & isempty(find(remList(:,3)+" - "+remList(:,4)+" - "+remList(:,5) == package_names(i)+" - "+this_package_versions(j)+" - "+sections(k))) then
147                         remList = [ remList ; "-" "U" package_names(i) this_package_versions(j) sections(k) ];
148                 end
149             end
150
151         end
152
153     end
154
155     // Second Step : List the packages that depends of the uninstalled packages
156     // =========================================================================
157
158     packages = remList;
159     for i=1:size(packages(:,1),"*")
160
161         this_package_name    = packages(i,3);
162         this_package_version = packages(i,4);
163         this_package_section = packages(i,5);
164
165         // Get the parents of this toolbox
166         // (inevitably removed, unless we have not the right)
167         // ----------------------------------------------------
168         this_package_parents = atomsGetDepParents([this_package_name this_package_version],section);
169
170         for j=1:size(this_package_parents(:,1),"*")
171
172             this_parent_name    = this_package_parents(j,1);
173             this_parent_version = this_package_parents(j,2);
174             this_parent_section = this_package_parents(j,3);
175
176             // Check if we have the right to remove this package
177             // If not, tag it as Broken (for later)
178             if section=="user" then
179                 details = atomsGetInstalledDetails([this_package_parents(j,1) this_package_parents(j,2)],section);
180                 if details(1,3) == "allusers" then
181                     remList = [ remList ; "~" "B" this_parent_name this_parent_version this_package_section ]; // B stands for "Broken"
182                     continue
183                 end
184             end
185
186             // Add this parent to the list
187             if find(remList(:,3)+" - "+remList(:,4)+" - "+remList(:,5) == this_parent_name+" - "+this_parent_version+" - "+this_parent_section ) == [] then
188                 remList = [ remList ; "-" "P" this_parent_name this_parent_version this_package_section ];  // P stands for "Parent"
189             end
190
191         end
192
193         // Get the childs of this toolbox
194         // ----------------------------------------------
195
196         this_package_childs = atomsGetDepChilds([this_package_name this_package_version],section);
197
198         for j=1:size(this_package_childs(:,1),"*")
199
200             this_child_name    = this_package_childs(j,1);
201             this_child_version = this_package_childs(j,2);
202
203             // Check if we have the right to remove this package
204             // If not, Do not add it to the list
205             if section=="user" then
206                 details = atomsGetInstalledDetails(this_package_childs(j,:),section);
207                 if details(3) == "allusers" then
208                     continue
209                 end
210             end
211
212             if find(remList(:,3)+" - "+remList(:,4) == this_child_name+" - "+this_child_version) == [] then
213                 remList = [ remList ; "-" "C" this_child_name this_child_version this_package_section ]; // C stands for "Child"
214             end
215
216         end
217
218     end
219
220     // Third Step : Loop on childs check if we can remove it or not
221     // =========================================================================
222
223     packages = remList(find(remList(:,2)=="C"),:);
224
225     for i=1:size(remList(:,1),"*")
226
227         // This is not a Child package :
228         // => continue
229         // ----------------------------------------------
230
231         if remList(i,2) <> "C" then
232             continue;
233         end
234
235         this_package_name    = remList(i,3);
236         this_package_version = remList(i,4);
237
238         // The package (A child) has been intentionnaly installed :
239         // => Do not remove it (it and it's childs)
240         // ----------------------------------------------
241
242         if atomsGetInstalledStatus([this_package_name this_package_version],section) == "I" then
243
244             // It
245             remList(i,1) = "~";
246
247             // It's Childs
248             this_package_childs     = atomsGetDepChilds([this_package_name this_package_version],section);
249             remList_mod             = remList(:,3) + " - " +  remList(:,4);
250
251             for j=1:size(this_package_childs(:,1),"*")
252                 remList( find(remList_mod == this_package_childs(j,1) + " - " + this_package_childs(j,2) , 1 )) = "~";
253             end
254
255         end
256
257         // Get the parents of this toolbox
258         // ----------------------------------------------
259
260         this_package_parents = atomsGetDepParents([this_package_name this_package_version],section);
261
262         for j=1:size(this_package_parents(:,1),"*")
263
264             if find(remList(:,3)+" - "+remList(:,4) == this_package_parents(j,1)+" - "+this_package_parents(j,2)) == [] then
265                 // One of the parent is not the remove list
266                 // => do not install it
267                 remList(i,1) = "~";
268                 continue;
269             end
270         end
271
272     end
273
274 endfunction