f7be5acca6270be0de0bf60998fb82b87f3ee034
[scilab.git] / scilab / modules / atoms / macros / atomsRemove.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009-2010 - 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 // End user function
11
12 // Remove a toolbox
13
14 function result = atomsRemove(packages,section)
15
16     result = [];
17
18     // Load Atoms Internals lib if it's not already loaded
19     // =========================================================================
20     if ~ exists("atomsinternalslib") then
21         load("SCI/modules/atoms/macros/atoms_internals/lib");
22     end
23
24     // Check write access on allusers zone
25     // =========================================================================
26     ATOMSALLUSERSWRITEACCESS = atomsAUWriteAccess();
27
28     // Save the initial path
29     // =========================================================================
30     ATOMSINITIALPATH = pwd();
31
32     // Get scilab version (needed for later)
33     // =========================================================================
34     sciversion = strcat(string(getversion('scilab')) + ".");
35
36     // Check input parameters
37     // =========================================================================
38
39     rhs = argn(2);
40
41     if rhs < 1 | rhs > 2 then
42         error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"atomsRemove",1,2))
43     end
44
45     if type(packages) <> 10 then
46         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsRemove",1));
47     end
48
49     if size(packages(1,:),"*") > 2 then
50         error(msprintf(gettext("%s: Wrong size for input argument #%d: mx1 or mx2 string matrix expected.\n"),"atomsInstall",1));
51     end
52
53     packages = stripblanks(packages);
54
55     // If mx1 matrix, add a 2nd column with empty versions
56     // =========================================================================
57     if size(packages(1,:),"*") == 1 then
58         packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
59     end
60
61     // Operating system detection + Architecture detection
62     // =========================================================================
63     [OSNAME,ARCH,LINUX,MACOSX,SOLARIS,BSD] = atomsGetPlatform();
64
65     // Verbose Mode ?
66     // =========================================================================
67     if strcmpi(atomsGetConfig("Verbose"),"True") == 0 then
68         ATOMSVERBOSE = %T;
69     else
70         ATOMSVERBOSE = %F;
71     end
72
73     // Allusers/user management
74     //   - If section is equal to "all" or to True, packages located in both
75     //     "allusers" and "user" sections will removed.
76     //   - If section is equal to "allusers", only packages located in the
77     //     "allusers" section will be removed.
78     //   - If section is equal to "user" or to False, only packages located in
79     //     the "user" will be removed
80     // =========================================================================
81
82     if rhs <= 1 then
83
84         // By default:
85         //  → Remove packages located in both "allusers" and "user" sections if
86         //    we have the write access to SCI directory
87         //  → Remove only package located in the "user" sections otherwise
88
89         if ATOMSALLUSERSWRITEACCESS then
90             section = "all";
91         else
92             section = "user";
93         end
94
95     else
96
97         // Process the 2nd input argument : section
98         // Allusers can be a boolean or equal to "user" or "allusers"
99
100         if type(section) <> 10 then
101             error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"atomsRemove",2));
102         end
103
104         if and(section<>["user","allusers","all"]) then
105             error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' or ''all'' expected.\n"),"atomsRemove",1));
106         end
107
108         // Check if we have the write access
109         if or(section==["all","allusers"]) & ~ ATOMSALLUSERSWRITEACCESS then
110             error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsRemove",2,atomsPath("system","user")));
111         end
112     end
113
114     // Some checking on packages variable
115     // =========================================================================
116
117     for i=1:size(packages(:,1),"*")
118
119         package_names(i)    = packages(i,1);
120         package_versions(i) = packages(i,2);
121
122         // Check if this package is installed
123         if ~ atomsIsInstalled([package_names(i) package_versions(i)],section) then
124
125             // Print a warning if the package isn't installed
126
127             if isempty(package_versions(i)) then
128                 atomsDisp(msprintf("\t%s isn''t installed",package_names(i)));
129             else
130                 atomsDisp(msprintf("\t%s (%s) isn''t installed",package_names(i),package_versions(i)));
131             end
132
133         elseif (section=="user") & (~ isempty(package_versions(i)) ) then
134
135             // The package is installed, now check if we have the right to
136             // uninstall it
137
138             installed_details = atomsGetInstalledDetails(packages(i,:),section);
139
140             if installed_details(3) == "allusers" then
141                 error(msprintf(gettext("%s: You have not enough rights to remove the package %s (%s).\n"),"atomsRemove",package_names(i),package_versions(i)));
142             end
143
144         elseif (section=="user") & isempty(package_versions(i)) then
145
146             // Check if we have the right to remove at least one of the version
147             // of the package
148             if isempty(atomsGetInstalledVers(package_names(i),section)) then
149                 error(msprintf(gettext("%s: You have not enough rights to remove any version of the package %s.\n"),"atomsRemove",package_names(i)));
150             end
151
152         end
153
154     end
155
156     // Build the list of package to Uninstall
157     // =========================================================================
158     remove_package_list = atomsRemoveList(packages,section);
159
160     // Loop on remList to print if a package has to be remove
161     // or not
162     // =========================================================================
163     if ATOMSVERBOSE
164         for i=1:size(remove_package_list(:,1),"*")
165             if remove_package_list(i,1) == "-" then
166                 atomsDisp(msprintf("\t%s (%s) will be removed from the ''%s'' section",remove_package_list(i,3),remove_package_list(i,4),remove_package_list(i,5)));
167             elseif (remove_package_list(i,1) == "~") & (remove_package_list(i,1) == "B") then
168                 atomsDisp(msprintf("\t%s (%s) cannot be removed from the ''%s'' section and will be broken",remove_package_list(i,3),remove_package_list(i,4),remove_package_list(i,5)));
169             end
170         end
171     end
172
173     // Now we have the list of package that have to be uninstalled
174     // =========================================================================
175
176     for i=1:size(remove_package_list(:,1),"*")
177
178         // If the package must be keeped, the job is done
179         if remove_package_list(i,1) <> "-" then
180             continue;
181         end
182
183         this_package_name      = remove_package_list(i,3);
184         this_package_version   = remove_package_list(i,4);
185         this_package_section   = remove_package_list(i,5);
186
187         this_package_details   = atomsToolboxDetails([this_package_name this_package_version]);
188         this_package_insdet    = atomsGetInstalledDetails([this_package_name this_package_version],section);
189         this_package_directory = this_package_insdet(4);
190
191         // Add the package to list of package to remove
192         atomsToremoveRegister(this_package_name,this_package_version,this_package_section);
193
194         // Check if the package is loaded or not
195         if atomsIsLoaded([this_package_name this_package_version]) then
196             mprintf( "\tthe package %s (%s) is currently loaded, It will be removed at next Scilab start\n" , this_package_name , this_package_version );
197             continue;
198         end
199
200         atomsDisp(msprintf( "\tRemoving %s (%s)(%s) ... " , this_package_name , this_package_version , this_package_section));
201
202         // Check if this_package_directory start with SCI or SCIHOME
203
204         if  (grep(this_package_directory,pathconvert(SCI)) == []) & ..
205             (grep(this_package_directory,pathconvert(SCIHOME)) == []) &..
206             (grep(this_package_directory,"/^(SCI|SCIHOME)\"+filesep()+"/","r") == []) then
207
208             atomsError("error", ..
209                 msprintf( ..
210                     gettext("%s: The directory of this package (%s-%s) is located neither in SCI nor in SCIHOME. For security reason, ATOMS refuses to delete this directory.\n"), ..
211                         "atomsRemove", ..
212                         this_package_name, ..
213                         this_package_version));
214         end
215
216         if isdir(this_package_directory) then
217
218             uninstall_status = rmdir(this_package_directory,"s");
219
220             if uninstall_status<>1 then
221                 atomsError("error", ..
222                     msprintf( ..
223                         gettext("%s: The directory of this package (%s-%s) cannot been deleted, please check if you have write access on this directory : %s.\n"), ..
224                         "atomsRemove", ..
225                         this_package_name, ..
226                         this_package_version, ..
227                         strsubst(this_package_directory,"\","\\") ));
228             end
229
230         end
231
232         // Check if the parent directory (directory name == toolbox name ) is empty
233         // If yes, delete it
234         // =====================================================================
235         this_package_root_dir = part(this_package_directory,1:length(pathconvert(this_package_directory,%t,%f)) - length(this_package_version) - 1 );
236
237         if isdir(this_package_root_dir) & listfiles(this_package_root_dir)==[] then
238             stat = rmdir(this_package_root_dir);
239             if stat<>1 then
240                 atomsError("error", ..
241                     msprintf( ..
242                         gettext("%s: The root directory of this package (%s-%s) cannot been deleted, please check if you have write access on this directory : %s.\n"), ..
243                         "atomsRemove", ..
244                         this_package_name, ..
245                         this_package_version, ..
246                         strsubst(this_package_root_dir,"\","\\") ));
247             end
248         end
249
250         // Remove this toolbox from the list of installed packages
251         // =====================================================================
252         atomsInstallUnregister(this_package_name,this_package_version,this_package_section);
253
254         // Remove this toolbox from the list of autoloaded packages
255         // =====================================================================
256         atomsAutoloadDel([this_package_name this_package_version this_package_section]);
257
258         // Remove it from the DESCRIPTION_installed file
259         // =====================================================================
260
261         DESCRIPTION_file = atomsPath("system",this_package_insdet(3)) + "DESCRIPTION_installed";
262
263         if ~ isempty(fileinfo(DESCRIPTION_file)) then
264             DESCRIPTION = atomsDESCRIPTIONread(DESCRIPTION_file);
265             DESCRIPTION = atomsDESCRIPTIONrm(DESCRIPTION,this_package_name,this_package_version);
266             atomsDESCRIPTIONwrite(DESCRIPTION,DESCRIPTION_file);
267         end
268
269         // Del the package from the list of package to remove
270         // =====================================================================
271         atomsToremoveUnregister(this_package_name,this_package_version,this_package_section);
272
273         // Fill the result matrix
274         // =====================================================================
275         result = [ result ; this_package_insdet ];
276
277         // Sucess message if needed
278         // =====================================================================
279         atomsDisp(msprintf(" success"));
280     end
281
282     // Go to the initial location
283     chdir(ATOMSINITIALPATH);
284
285 endfunction