Atoms 0.2
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsInstallRegister.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 // Add toolboxes to the list of installed packages
11 // This function has an impact on the following files :
12 //  -> ATOMSDIR/installed
13 //  -> ATOMSDIR/installed_deps
14
15 function nbAdd = atomsInstallRegister(name,version,status,allusers)
16         
17         rhs            = argn(2);
18         nbAdd          = 0;
19         installed      = []; // Column vector that contain installed packages
20         installed_deps = []; // Column vector that contain installed dependencies
21         
22         // Check number of input arguments
23         // =========================================================================
24         
25         if rhs < 3 | rhs > 4 then
26                 error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsInstallRegister",3,4));
27         end
28         
29         // Check input parameters type
30         // =========================================================================
31         
32         if type(name) <> 10 then
33                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallRegister",1));
34         end
35         
36         if type(version) <> 10 then
37                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallRegister",2));
38         end
39         
40         if type(status) <> 10 then
41                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallRegister",3));
42         end
43         
44         // status is a letter
45         // =========================================================================
46         
47         if ~ and((status == "A") | (status == "I"))  then
48                 error(msprintf(gettext("%s: Wrong value for input argument #%d: Letters ''A'' or ''I'' expected.\n"),"atomsInstallRegister",3));
49         end
50         
51         // name,version and status must have the same size
52         // =========================================================================
53         
54         if or( size(name) <> size(version) ) then
55                 error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsInstallRegister",1,2));
56         end
57         
58         if or( size(name) <> size(status) ) then
59                 error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsInstallRegister",1,3));
60         end
61         
62         // Apply changes for all users or just for me ?
63         // =========================================================================
64         
65         if rhs == 3 then
66                 // By default, The toolbox is installed for all users (if we have write access of course !)
67                 if atomsAUWriteAccess() then
68                         allusers = %T; 
69                 else
70                         allusers = %F;
71                 end
72         
73         else
74                 // Just check if it's a boolean
75                 if type(allusers) <> 4 then
76                         error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"),"atomsInstallRegister",2));
77                 end
78                 
79                 // Check if we have the write access
80                 if allusers & ~ atomsAUWriteAccess() then
81                         error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsInstallRegister",2,pathconvert(SCI+"/.atoms")));
82                 end
83         end
84         
85         // Define the path of the file that will record the change according to
86         // the "allusers" value
87         // =========================================================================
88         
89         if allusers then
90                 atoms_directory = pathconvert(SCI+"/.atoms");
91         else
92                 atoms_directory = pathconvert(SCIHOME+"/atoms");
93         end
94         
95         // Does the atoms_directory exist, if not create it
96         // =========================================================================
97         
98         if ~ isdir(atoms_directory) then
99                 mkdir(atoms_directory);
100         end
101         
102         // Does the SCIHOME/atoms/installed exist, if yes load it
103         // =========================================================================
104         
105         if fileinfo(atoms_directory+"installed") <> [] then
106                 installed = mgetl(atoms_directory+"installed");
107         end
108         
109         // Does the SCIHOME/atoms/installed_deps exist, if yes load it
110         // =========================================================================
111         
112         if fileinfo(atoms_directory+"installed_deps") <> [] then
113                 installed_deps = mgetl(atoms_directory+"installed_deps");
114         end
115         
116         // Loop on each URL specified as input argument
117         // =========================================================================
118         
119         for i=1:size(name,"*")
120                 
121                 // Add the URL only if it doesn't already exist
122                 if grep( installed ,"/^[AI]\s-\s"+name(i)+"\s-\s"+version(i)+"$/","r") == [] then
123                         
124                         nbAdd = nbAdd + 1;
125                         
126                         // installed file
127                         // =================================================================
128                         installed = [ installed ; status(i)+" - "+name(i)+" - "+version(i) ];
129                         
130                         // installed_deps file
131                         // =================================================================
132                         
133                         // Parent package
134                         // --------------
135                         this_package_str = ["["+name(i)+" - "+version(i)+"]"];
136                         
137                         // Get the depencency tree & and child package
138                         // -------------------------------------------
139                         tree              = atomsDependencyTree(name(i),version(i));
140                         dep_packages      = getfield(1,tree);
141                         dep_packages(1:2) = [];
142                         dep_packages(find(dep_packages == name(i))) = [];
143                         
144                         // loop on childs
145                         // -------------------------------------------
146                         for j=1:size(dep_packages,"*")
147                                 this_dep_package_details = tree(dep_packages(j));
148                                 this_package_str = [this_package_str;"    "+this_dep_package_details("Toolbox")+" - "+this_dep_package_details("Version")];
149                         end
150                         
151                         // Finalize the current packages string
152                         // ------------------------------------
153                         this_package_str  = [this_package_str;""];
154                         
155                         // Cat the current packages deps with all others
156                         // ---------------------------------------------
157                         installed_deps    = [installed_deps;this_package_str];
158                         
159                 end
160                 
161         end
162         
163         // Apply changes
164         // =========================================================================
165         
166         if nbAdd > 0 then
167                 
168                 mputl(installed     , atoms_directory+"installed");
169                 mputl(installed_deps, atoms_directory+"installed_deps");
170                 
171         end
172         
173 endfunction