ce696548e48f795d610268bf4fa3b79effd2bf2a
[scilab.git] / scilab / modules / atoms / macros / atomsDependencyTree.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 function tree_out = atomsDependencyTree(name,version,tree_in)
13         
14         rhs = argn(2);
15         
16         // Check number of input arguments
17         // =========================================================================
18         
19         if (rhs < 2) | (rhs > 3) then
20                 error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsDependencyTree",2,3));
21         end
22         
23         // Check input parameters type
24         // =========================================================================
25         
26         if type(name) <> 10 then
27                 error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsDependencyTree",1));
28         end
29         
30         if type(version) <> 10 then
31                 error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsDependencyTree",2));
32         end
33         
34         if (rhs==3) & (type(tree_in) <> 17) then
35                 error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"atomsDependencyTree",3));
36         end
37         
38         // Check input parameters dimensions
39         // =========================================================================
40         
41         if size(name) <> 1 then
42                 error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsDependencyTree",1));
43         end
44         
45         if size(version) <> 1 then
46                 error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsDependencyTree",2));
47         end
48         
49         // Define tree_in if not defined as input argument
50         // =========================================================================
51         
52         if rhs<3 then
53                 tree_in = struct();
54         end
55         
56         // Get dependencies of this toolbox
57         // =========================================================================
58         
59         this_package_details = atomsToolboxDetails(name,version);
60         
61         // Check if the wanted version is compatible with the current scilab version.
62         // =========================================================================
63         
64         this_package_details = atomsToolboxDetails(name,version);
65         
66         if ~ atomsIsCompatible(this_package_details("ScilabVersion")) then
67                 tree_out = %F;
68                 return tree_out;
69         end
70         
71         tree_out(name) = version;
72         
73         // Now, loop on dependencies
74         // =========================================================================
75         
76         if isfield(this_package_details,"Depends") & (this_package_details("Depends") ~= "") then
77                 dependencies = this_package_details("Depends");
78         else
79                 dependencies = [];
80         end
81         
82         for i=1:size(dependencies,"*")
83                 
84                 this_dependency_success = %F;
85                 
86                 // Split dependencies to get 
87                 //  - direction ("=", ">=", "<=", "~")
88                 //  - dependence name
89                 //  - dependence version (optional)
90                 
91                 this_dependency_tab     = stripblanks(strsplit(dependencies(i),regexp(stripblanks(dependencies(i)),"/\s/")));
92                 
93                 this_dependency_dir     = this_dependency_tab(1);
94                 this_dependency_name    = this_dependency_tab(2);
95                 this_dependency_version = this_dependency_tab(3);
96                 
97                 // List versions of the dependency we can test
98                 
99                 if this_dependency_dir     == "="  then
100                         this_dependency_list = this_dependency_version;
101                 
102                 elseif this_dependency_dir == "~"  then
103                         this_dependency_list = atomsGetVersions(this_dependency_name);
104                 
105                 elseif this_dependency_dir == ">=" then
106                         this_dependency_list = atomsGetVersions(this_dependency_name,this_dependency_version);
107                         
108                 elseif this_dependency_dir == "<=" then
109                         this_dependency_list = atomsGetVersions(this_dependency_name,"",this_dependency_version);
110                         
111                 end
112                 
113                 for j=1:size(this_dependency_list,"*")
114                         
115                         tree = atomsDependencyTree(this_dependency_name,this_dependency_list(j),tree_out);
116                         
117                         // Dependency Tree fails
118                         
119                         if (type(tree) == 4) & (~ tree) then
120                                 continue;
121                         end
122                         
123                         // Dependency Tree OK
124                         
125                         if type(tree) == 17 then
126                                 tree_out = atomsCatTree(tree_out,tree);
127                                 this_dependency_success = %T;
128                                 break;
129                         end
130                         
131                 end
132                 
133                 if ~  this_dependency_success then
134                         tree_out = %F;
135                         return;
136                 end
137                 
138         end
139         
140 endfunction
141
142 // =============================================================================
143 // tree_out = atomsCatTree( tree_in_1 , tree_in_2 )
144 //
145 // Date : 19/05/2009
146 // =============================================================================
147
148 function tree_out = atomsCatTree( tree_in_1 , tree_in_2 )
149         
150         rhs = argn(2);
151         
152         // Check number of input arguments
153         // =========================================================================
154         
155         if rhs <> 2 then
156                 error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsMergeTree",1));
157         end
158         
159         // Check input arguments type
160         // =========================================================================
161         
162         if type(tree_in_1) <> 17 then
163                 error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"atomsMergeTree",1));
164         end
165         
166         if type(tree_in_2) <> 17 then
167                 error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"atomsMergeTree",2));
168         end
169         
170         // tree_in_1 is the master tree :
171         // =========================================================================
172         
173         tree_out  = tree_in_1;
174         
175         // Loop on tree_in_2 fields
176         // =========================================================================
177         
178         fields = getfield(1,tree_in_2);
179         fields(1:2) = [];
180         
181         for i=1:size(fields,"*")
182                 if ~ isfield(tree_out,fields(i)) then
183                         tree_out(fields(i)) = tree_in_2(fields(i));
184                 end
185         end
186         
187 endfunction