Better management of the dependencies
[scilab.git] / scilab / modules / atoms / macros / atomsRemove.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 // End user function
11
12 // Remove a toolbox
13
14 function result = atomsRemove(packages,allusers)
15         
16         result = [];
17         
18         // Save the current path
19         // =========================================================================
20         initialpath = pwd();
21         
22         // Get scilab version (needed for later)
23         // =========================================================================
24         sciversion = strcat(string(getversion('scilab')) + ".");
25         
26         // Check input parameters
27         // =========================================================================
28         
29         rhs = argn(2);
30         
31         if rhs < 1 | rhs > 2 then
32                 error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"atomsRemove",1,2))
33         end
34         
35         if type(packages) <> 10 then
36                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsRemove",1));
37         end
38         
39         packages = stripblanks(packages);
40         
41         // Operating system detection
42         // =========================================================================
43         
44         if ~MSDOS then
45                 OSNAME = unix_g('uname');
46                 MACOSX = (strcmpi(OSNAME,"darwin") == 0);
47                 LINUX  = (strcmpi(OSNAME,"linux") == 0);
48         else
49                 MACOSX = %F;
50                 LINUX  = %F;
51         end
52         
53         if MSDOS then
54                 OSNAME = "windows";
55         elseif LINUX then
56                 OSNAME = "linux";
57         elseif MACOSX then
58                 OSNAME = "macosx";
59         end
60         
61         // Verbose Mode ?
62         // =========================================================================
63         if strcmpi(atomsGetConfig("Verbose"),"True") == 0 then
64                 VERBOSE = %T;
65         else
66                 VERBOSE = %F;
67         end
68         
69         // Apply changes for all users or just for me ?
70         // =========================================================================
71         
72         if rhs == 1 then
73                 // By default, uninstall the package (if we have write access
74                 // of course !)
75                 if atomsAUWriteAccess() then
76                         allusers = %T; 
77                 else
78                         allusers = %F;
79                 end
80         
81         else
82                 // Just check if it's a boolean
83                 if type(allusers) <> 4 then
84                         chdir(initialpath);
85                         error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"),"atomsRemove",2));
86                 end
87                 
88                 // Check if we have the write access
89                 if allusers & ~ atomsAUWriteAccess() then
90                         chdir(initialpath);
91                         error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsRemove",2,pathconvert(SCI+"/.atoms")));
92                 end
93         end 
94         
95         // Build the list of package to Uninstall
96         // =========================================================================
97         remove_package_list = atomsRemoveList(packages,allusers);
98         
99         
100         // Loop on remList to print if a package has to be remove
101         // or not
102         // =========================================================================
103         if VERBOSE 
104                 for i=1:size(remove_package_list(:,1),"*")
105                         if remove_package_list(i,1) == "-" then
106                                 mprintf("\t%s (%s) will be removed\n",remove_package_list(i,3),remove_package_list(i,4));
107                         elseif (remove_package_list(i,1) == "~") & (remove_package_list(i,1) == "B") then
108                                 mprintf("\t%s (%s) cannot be removed and will be broken\n",remove_package_list(i,3),remove_package_list(i,4));
109                         end
110                 end
111         end
112         
113         // Now we have the list of package that have to be uninstalled
114         // =========================================================================
115         
116         for i=1:size(remove_package_list(:,1),"*")
117                 
118                 // If the package must be keeped, the job is done
119                 if remove_package_list(i,1) <> "-" then
120                         continue;
121                 end
122                 
123                 this_package_name      = remove_package_list(i,3);
124                 this_package_version   = remove_package_list(i,4);
125                 this_package_insdet    = atomsGetInstalledDetails(this_package_name,this_package_version);
126                 this_package_directory = this_package_insdet(4);
127                 
128                 if VERBOSE then
129                         mprintf( "\tRemoving %s (%s) ... " , this_package_name , this_package_version );
130                 end
131                 
132                 // Check if this_package_directory start with SCI or SCIHOME
133                 
134                 if (grep(this_package_directory,pathconvert(SCI)) == []) & ..
135                         (grep(this_package_directory,pathconvert(SCIHOME)) == []) then
136                         
137                         chdir(initialpath);
138                         error(msprintf(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"),"atomsRemove",this_package_name,this_package_version));
139                 end
140                 
141                 uninstall_status = rmdir(this_package_directory,"s");
142                 
143                 if uninstall_status<>1 then
144                         chdir(initialpath);
145                         error(msprintf( ..
146                                 gettext("%s: The directory of this package (%s-%s) cannot been deleted, please check if you have write access on this directory : %s.\n"),..
147                                 "atomsRemove", ..
148                                 this_package_name, ..
149                                 this_package_version, ..
150                                 this_package_directory));
151                 end
152                 
153                 // Check if the parent directory (directory name == toolbox name ) is empty 
154                 // If yes, detete it
155                 // =====================================================================
156                 this_package_root_dir = part(this_package_directory,1:length(pathconvert(this_package_directory)) - length(this_package_version) - 1 );
157                 
158                 if isdir(this_package_root_dir) & listfiles(this_package_root_dir)==[] then
159                         stat = rmdir(this_package_root_dir);
160                         if stat<>1 then
161                                 chdir(initialpath);
162                                 error(msprintf( ..
163                                         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"),..
164                                         "atomsRemove", ..
165                                         this_package_name, ..
166                                         this_package_version, ..
167                                         this_package_root_dir));
168                         end
169                 end
170                 
171                 // Remove this toolbox from the list of installed packages
172                 // =====================================================================
173                 atomsInstallUnregister(this_package_name,this_package_version,allusers);
174                 
175                 // Remove this toolbox from the list of autoloaded packages
176                 // =====================================================================
177                 atomsDelAutoload(this_package_name,this_package_version);
178                 
179                 // Fill the result matrix
180                 // =====================================================================
181                 result = [ result ; this_package_insdet ];
182                 
183                 // Sucess message if needed
184                 // =====================================================================
185                 if VERBOSE then
186                         mprintf(" success\n");
187                 end
188         end
189         
190         // Go to the initial location
191         chdir(initialpath);
192         
193 endfunction