Atoms 0.2
[scilab.git] / scilab / modules / atoms / macros / atomsUpdate.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008 - INRIA - Delphine GASC <delphine.gasc@scilab.org>
3 // Copyright (C) 2009 - DIGITEO - Sylvestre LEDRU <sylvestre.ledru@scilab.org>
4 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
5 //
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11
12 // End user function
13
14 // update of a toolbox
15
16 function result = atomsUpdate(name,checkVersionScilab)
17         
18         rhs = argn(2)
19         
20         // Check input parameters
21         if (rhs < 1 | rhs > 2) then
22                 error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"atomsUpdate",1,2));
23         end
24         
25         // Default values
26         result = %f;    
27         if rhs < 2 then
28                 checkVersionScilab = %t;
29         end
30         
31         // We remove special characters
32         normalized_name = atomsNormalizeName(name)
33         
34         // if name = "all" we update all the Toolboxes
35         // =========================================================================
36         if name == "all"
37                 listLocal = ls()
38                 [n, m] = size(listLocal)
39                 for k=1:n
40                         if listLocal(i) <> ".svn"
41                                 if ~atomsUpdate(listLocal(k))
42                                         break
43                                 end
44                         end
45                 end
46         
47         // Update of a single toolbox
48         // =========================================================================
49         else
50                 
51                 // We check if the Toolbox locally exist and get the installation directory
52                 // =====================================================================
53                 
54                 atoms_directories      = atomsToolboxDirectory();
55                 this_toolbox_directory = "";
56                 
57                 for k=1:size(atoms_directories,"*")
58                         check_directory = atoms_directories(k)+"/"+normalized_name;
59                         if isdir(check_directory) then
60                                 this_toolbox_directory = check_directory;
61                                 break;
62                         end
63                 end
64                 
65                 if this_toolbox_directory == "" then
66                         atomsDisplayMessage(sprintf(gettext("The toolbox %s is not installed.\n")),name);
67                         return result;
68                 end
69                 
70                 // We get back the current version 
71                 // =====================================================================
72                 desc            = atomsReadDesc(normalized_name);
73                 versionActuelle = atomsExtractValue("Version", desc, 1)
74                 versionActuelle = atomsDecoupVersion(versionActuelle);
75                 
76                 // We get back the list of all the other available toolboxes 
77                 // =====================================================================
78                 listDesc = atomsReadDesc("");
79                 
80                 // We take the more recent version
81                 // =====================================================================
82                 position = atomsSelectPosition(listDesc, normalized_name, "", checkVersionScilab)
83                 
84                 // If the toolbox is not available online
85                 // =====================================================================
86                 if position == 0
87                         atomsDisplayMessage(sprintf(gettext("The toolbox %s is not available online.\n")),name);
88                         return result;
89                 end
90                 
91                 versionNew = atomsExtractValue("Version", listDesc, position);
92                 versionNew = atomsDecoupVersion(versionNew);
93                 
94                 // We check if it is an update of the local
95                 // =====================================================================
96                 
97                 if atomsCompareVersion(versionNew, versionActuelle) < 1
98                         atomsDisplayMessage(sprintf(gettext("The toolbox %s already up-to-date.\n")),name);
99                         result = %T;
100                         return result;
101                 end
102                 
103                 // We check if it was a max dependency for other toolboxes
104                 listLocal = ls();
105                 [n, m]    = size(listLocal);
106                 for i=1:n
107                         
108                         if listLocal(i) <> ".svn"
109                                 continue;
110                         end
111                         
112                         desc    = atomsReadDesc(listLocal(i))
113                         depends = atomsExtractValue("Depends", desc, 1)
114                         depends = atomsSplitValue(depends, ",");
115                         [n, m]  = size(depends);
116                         
117                         for j=1:n
118                                 [depend, version] = atomsSeparateVersionDep(depends(j))
119                                 
120                                 if version == "" then
121                                         continue;
122                                 end
123                                 
124                                 [signe, version] = atomsSeparateSignVersion(version)
125                                 if find(depend == normalized_name) <> [] & signe == "<="
126                                         version = atomsDecoupVersion(version)
127                                         // We check if the new version confirm this max dependency
128                                         if atomsCompareVersion(versionNew, version) == 1
129                                                 atomsDisplayMessage(_("Dependency issue.\n"))
130                                                 result = %f
131                                                 return result
132                                         end
133                                 end
134                         end
135                 end
136                 
137                 // We verify if it is necessary to update the dependencies
138                 dependsNew = atomsExtractValue("Depends", listDesc, position)
139                 dependsNew = atomsSplitValue(dependsNew, ",")
140                 [n, m] = size(dependsNew)
141                 for i=1:n
142                         [dependsNew, versionNew] = atomsSeparateVersionDep(dependsNew(i))
143                         listLocal = ls()
144                         if find(listLocal == dependsNew)
145                                 if versionNew == ""
146                                         continue;
147                                 end
148                                 
149                                 desc = atomsReadDesc(listLocal(i))
150                                 v1 = atomsExtractValue("Version", desc, 1)
151                                 v1 = atomsDecoupVersion(v1)
152                                 [signeNew, versionNew] = atomsSeparateSignVersion(versionNew)
153                                 versionNew = atomsDecoupVersion(versionNew)
154                                 if ( (versionNew == "<=" | versionNew == "=")  & atomsCompareVersion(v1, versionNew) == -1) | ((versionNew == ">=" | versionNew == "=") & atomsCompareVersion(v1, versionNew) == 1) 
155                                         atomsUpdate(dependsNew);
156                                 end
157                         end
158                 end
159
160                 // We warm it
161                 versionNew = atomsExtractValue("Version", listDesc, position)
162                 atomsDisplayMessage(sprintf(_("The toolbox %s is going to be updated to version %s.\n"),name,versionNew))
163                 // We install the new version
164                 rmdir(rep + normalized_name, "s")
165                 atomsInstall(normalized_name);
166         end
167         
168         result = %t
169         return result;
170
171 endfunction