* Bug 15357 fixed: atomsGetInstalledPath() softer wrt name & version
[scilab.git] / scilab / modules / atoms / macros / atomsGetInstalledPath.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 // Copyright (C) 2012 - 2016 - Scilab Enterprises
4 // Copyright (C) 2019 - Samuel GOUGEON
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function res = atomsGetInstalledPath(packages,section)
14
15     rhs           = argn(2);
16     res           = [];
17     installed     = []; // Column vector that contains user repositories
18
19     // Check number of input arguments
20     // =========================================================================
21
22     if rhs < 1 | rhs > 2 then
23         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsGetInstalledPath",1,2));
24     end
25
26     // Check input parameters type
27     // =========================================================================
28
29     if type(packages) <> 10 then
30         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsGetInstalledPath",1));
31     end
32
33     if and(size(packages, 2) <> [1 2 3]) then
34         error(msprintf(gettext("%s: Argument #%d: Matrix with %s columns expected.\n"),"atomsGetInstalledPath",1, _("1 to 3")));
35     end
36
37     packages = stripblanks(packages);
38
39     if size(packages,2)==1 then
40         packages = [packages emptystr(packages)]
41     end
42
43     // Allusers/user management
44     // =========================================================================
45     if size(packages, 2) < 3 then
46         if rhs < 2 then
47             section = "all";
48         else
49             // Process the 2nd input argument : section
50             // Allusers can be equal to "user" or "allusers"
51             if type(section) <> 10 then
52                 error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsGetInstalledPath",2));
53             end
54             section = section(1)
55             if and(section <> ["user","allusers","all"]) then
56                 error(msprintf(gettext("%s: Wrong value for input argument #%d: ''user'' or ''allusers'' or ''all'' expected.\n"),"atomsGetInstalledPath",2));
57             end
58         end
59         packages = [packages emptystr(packages(:,1)) + section]
60     else
61         tmp = convstr(packages(:,3))
62         if or(tmp<>"user" & tmp<>"allusers" & tmp<>"all")
63             error(msprintf(gettext("%s: Argument #%d (:,3): ''user'' or ''allusers'' or ''all'' expected.\n"),"atomsGetInstalledPath",1));
64         end
65         packages(:,3) = tmp
66         section = "all"
67     end
68
69     // Get the list of installed packages
70     // =========================================================================
71     installedpackages = atomsGetInstalled(section);
72     names = convstr(installedpackages(:,1));    // for case-insensitive detection
73
74     // Loop on name
75     // =========================================================================
76
77     for i = 1:size(packages,1)
78
79         // Filter on names
80         found = find(installedpackages(:,1) == packages(i,1))
81         if found == []
82             // Try in a case-insensitive way
83             found = find(names == convstr(packages(i,1)))
84         end
85         if found == []
86             // Try with input as a case-insensitive fragment
87             found = grep(names, convstr(packages(i,1)))
88         end
89         if found == []
90             res(i) = "";
91             continue;
92         end
93         packages_filtered = installedpackages(found, : );
94
95         // Filter on section
96         if packages(i,3) <> "all" then
97             packages_filtered = packages_filtered( find(packages_filtered(:,3) == packages(i,3)) , : );
98         end
99
100         // Filter on versions
101         //  + The packaging version is mentioned
102         if packages_filtered <> [] & packages(i,2) <> ""
103             if ~ isempty(strindex(packages(i,2),"-")) then
104                 packages_filtered = packages_filtered( find(packages_filtered(:,2) == packages(i,2)) , : );
105             else
106                 //  + The packaging version is not mentioned
107                 candidates        = packages_filtered;
108                 packages_filtered = [];
109     
110                 // Loop on installed versions
111                 for j=1:size(candidates(:,2),"*")
112     
113                     candidate_version = candidates(j,2);
114     
115                     if ~ isempty(strindex(candidate_version,"-")) then
116                         candidate_version = part(candidate_version,1:strindex(candidate_version,"-")-1);
117                     end
118     
119                     if packages(i,2) == candidate_version then
120                         packages_filtered = [ packages_filtered ; candidates(j,:) ];
121                     end
122                 end
123             end
124         end
125
126         if packages_filtered == [] then
127             res(i) = "";
128             continue;
129         end
130
131         if ~isempty(packages_filtered) then
132             res(i) = packages_filtered(1,4);
133         else
134             res(i) = "";
135         end
136     end
137 endfunction