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