ATOMS: atomsRepositoryXXX: Better management of "allusers"/"user" sections
[scilab.git] / scilab / modules / atoms / macros / atomsRepositoryAdd.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 an URL to the list of repositories, and returns
11
12 function nbAdd = atomsRepositoryAdd(url,section)
13         
14         // Load Atoms Internals lib if it's not already loaded
15         // =========================================================================
16         if ~ exists("atomsinternalslib") then
17                 load("SCI/modules/atoms/macros/atoms_internals/lib");
18         end
19         
20         rhs                    = argn(2);
21         nbAdd                = 0;
22         repositories         = []; // Column vector that contain user repositories
23         currentRepositories  = atomsRepositoryList();
24         currentRepositories  = currentRepositories(:,1);
25         valid_url_pattern    = "/^((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))\:\/\/)?(www.|[a-zA-Z0-9].)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]{1,5})*(\/($|[a-zA-Z0-9\.\,\;\?\''\\\+&amp;%\$#\=~_\-]+))*$/";
26         
27         // Check number of input arguments
28         // =========================================================================
29         
30         if rhs < 1 | rhs > 2 then
31                 error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsRepositoryAdd",1,2));
32         end
33         
34         // Check URLs specified as first input argument
35         // =========================================================================
36         
37         if type(url) <> 10 then
38                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsRepositoryAdd",1));
39         end
40         
41         for i=1:size(url,"*")
42                 if ~ regexp(url(i),valid_url_pattern,"o") == 1 then
43                         error(msprintf(gettext("%s: Wrong value for input argument #%d: This ("+url(i)+") is not a valid URL.\n"),"atomsRepositoryAdd",1));
44                 end
45         end
46         
47         // Allusers/user management
48         //   - If section is equal to "allusers", The repository will added for all users
49         //       → SCI/.atoms  : ATOMS system files
50         //   -  If section is equal to "user", The repository will added only for the current user
51         //       → SCIHOME/atoms : location of the modules & ATOMS system files
52         // =========================================================================
53         
54         if rhs <= 1 then
55                 if atomsAUWriteAccess() then
56                         section = "allusers"; 
57                 else
58                         section = "user";
59                 end
60                 
61         else
62                 
63                 // Process the 2nd input argument : section
64                 // Allusers can be equal to "user" or "allusers"
65                 
66                 if type(section) <> 10 then
67                         error(msprintf(gettext("%s: Wrong type for input argument #%d: A single-string expected.\n"),"atomsRepositoryAdd",2));
68                 end
69                 
70                 if and(section<>["user","allusers"]) then
71                         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' expected.\n"),"atomsRepositoryAdd",2));
72                 end
73                 
74                 // Check if we have the write access
75                 if (section=="allusers") & ~atomsAUWriteAccess() then
76                         error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsRepositoryAdd",2,pathconvert(SCI+"/.atoms")));
77                 end
78                 
79         end
80         
81         // Define the path of the file that will record the change according to
82         // the "section" value
83         // =========================================================================
84         
85         if section=="allusers" then
86                 atoms_directory = pathconvert(SCI+"/.atoms");
87         else
88                 atoms_directory = pathconvert(SCIHOME+"/atoms");
89         end
90         
91         // Does the atoms_directory exist, if not create it
92         // =========================================================================
93         
94         if ~ isdir(atoms_directory) then
95                 mkdir(atoms_directory);
96         end
97         
98         // Does the SCIHOME/atoms/repositories exist, if yes load it
99         // =========================================================================
100         
101         if fileinfo(atoms_directory+"repositories") <> [] then
102                 repositories = mgetl(atoms_directory+"repositories");
103         end
104         
105         // Loop on each URL specified as input argument
106         // =========================================================================
107         
108         for i=1:size(url,"*")
109                 // Add the URL only if it doesn't already exist
110                 if find( currentRepositories == url(i) ) == [] then
111                         repositories = [ repositories ; url(i) ];
112                         nbAdd = nbAdd + 1;
113                 end
114         end
115         
116         // Apply changes
117         // =========================================================================
118         
119         if nbAdd > 0 then
120                 
121                 mputl(repositories, atoms_directory+"repositories");
122                 
123                 // Force reload the different distant TOOLBOXES files
124                 atomsGetTOOLBOXES(%T);
125                 
126         end
127         
128 endfunction