Skip to content

Commit ef1c55b

Browse files
committed
set_permissions: work natively with older matlab
set_permissions: functionalize
1 parent 709de6b commit ef1c55b

File tree

4 files changed

+83
-30
lines changed

4 files changed

+83
-30
lines changed

+stdlib/+native/set_permissions.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function ok = set_permissions(file, readable, writable, executable)
2+
3+
p = filePermissions(file);
4+
5+
if readable ~= 0
6+
setPermissions(p, "Readable", readable > 0);
7+
end
8+
if writable ~= 0
9+
setPermissions(p, "Writable", writable > 0);
10+
end
11+
if executable ~= 0
12+
setPermissions(p, "Executable", executable > 0);
13+
end
14+
15+
ok = true;
16+
17+
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
function ok = set_permissions_legacy(file, readable, writable, executable)
2+
3+
mode = '';
4+
% mode is space-delimited
5+
if ~ispc()
6+
if readable == 1
7+
mode = [mode ' +r'];
8+
elseif readable == -1
9+
mode = [mode ' -r'];
10+
end
11+
end
12+
13+
if writable == 1
14+
mode = [mode ' +w'];
15+
elseif writable == -1
16+
mode = [mode ' -w'];
17+
end
18+
19+
if executable == 1
20+
mode = [mode ' +x'];
21+
elseif executable == -1
22+
mode = [mode ' -x'];
23+
end
24+
25+
if isempty(mode)
26+
ok = true;
27+
return
28+
end
29+
30+
[s, msg, id] = fileattrib(file, mode);
31+
ok = s == 1;
32+
if ~ok
33+
warning(id, "Failed to set permissions for %s: %s", file, msg)
34+
end
35+
36+
end

+stdlib/set_permissions.m

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,30 @@
22
% optional: mex
33
%
44
%%% Inputs
5-
% * path {mustBeTextScalar}
6-
% * readable (1,1) int (-1 remove read permission, 0 no change, 1 add read permission)
7-
% * writable (1,1) int (-1 remove write permission, 0 no change, 1 add write permission)
8-
% * executable (1,1) int (-1 remove execute permission, 0 no change, 1 add execute permission)
5+
% * file
6+
% * readable (-1 remove read permission, 0 no change, 1 add read permission)
7+
% * writable (-1 remove write permission, 0 no change, 1 add write permission)
8+
% * executable (-1 remove execute permission, 0 no change, 1 add execute permission)
99
%%% Outputs
1010
% * ok (1,1) logical
1111

12-
function ok = set_permissions(path, readable, writable, executable)
12+
function ok = set_permissions(file, readable, writable, executable)
1313
arguments
14-
path {mustBeTextScalar,mustBeFile}
14+
file {mustBeTextScalar}
1515
readable (1,1) {mustBeInteger, mustBeInRange(readable, -1, 1)}
1616
writable (1,1) {mustBeInteger, mustBeInRange(writable, -1, 1)}
1717
executable (1,1) {mustBeInteger, mustBeInRange(executable, -1, 1)}
1818
end
1919

20+
ok = false;
2021

21-
if isMATLABReleaseOlderThan('R2025a')
22-
warning("stdlib:set_permissions:RequiresMex", "set_permissions requires 'buildtool mex'");
23-
ok = false;
24-
else
25-
p = filePermissions(path);
22+
if ~stdlib.exists(file), return, end
2623

27-
if readable ~= 0
28-
setPermissions(p, "Readable", readable > 0);
29-
end
30-
if writable ~= 0
31-
setPermissions(p, "Writable", writable > 0);
32-
end
33-
if executable ~= 0
34-
setPermissions(p, "Executable", executable > 0);
35-
end
3624

37-
ok = true;
25+
if isMATLABReleaseOlderThan('R2025a')
26+
ok = stdlib.native.set_permissions_legacy(file, readable, writable, executable);
27+
else
28+
ok = stdlib.native.set_permissions(file, readable, writable, executable);
3829
end
3930

4031
end

test/TestPermissions.m

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
properties (TestParameter)
44
Ps = {".", pwd(), "", tempname(), mfilename('fullpath') + ".m"}
5+
sp_fun = {@stdlib.native.set_permissions, @stdlib.native.set_permissions_legacy}
56
end
67

78
methods(TestClassSetup)
@@ -32,31 +33,39 @@ function test_get_permissions(tc, Ps)
3233
end
3334

3435

35-
function test_set_permissions(tc)
36+
function test_set_permissions_noread(tc, sp_fun)
3637
import matlab.unittest.constraints.StartsWithSubstring
3738

38-
tc.assumeTrue(~isMATLABReleaseOlderThan('R2025a') || stdlib.is_mex_fun('stdlib.set_permissions'))
39-
39+
tc.assumeFalse((ispc() && isMATLABReleaseOlderThan('R2025a')) || isMATLABReleaseOlderThan('R2022a'))
4040
td = tc.createTemporaryFolder();
4141

4242
nr = fullfile(td, "no-read");
4343

4444
tc.verifyTrue(stdlib.touch(nr))
45-
tc.verifyTrue(stdlib.set_permissions(nr, -1, 0, 0))
45+
tc.verifyTrue(sp_fun(nr, -1, 0, 0))
4646
p = stdlib.get_permissions(nr);
4747

48-
if ~ispc
49-
tc.verifyThat(p, StartsWithSubstring("-"), "no-read permission failed to set")
48+
if ~ispc() || ~endsWith(func2str(sp_fun), "legacy")
49+
tc.verifyThat(p, StartsWithSubstring("-"), "no-read permission failed to set")
50+
end
51+
5052
end
5153

54+
55+
function test_set_permissions_nowrite(tc, sp_fun)
56+
import matlab.unittest.constraints.StartsWithSubstring
57+
58+
tc.assumeFalse(isMATLABReleaseOlderThan('R2022a'))
59+
td = tc.createTemporaryFolder();
60+
5261
nw = fullfile(td, "no-write");
5362

5463
tc.verifyTrue(stdlib.touch(nw))
55-
tc.verifyTrue(stdlib.set_permissions(nw, 0, -1, 0))
64+
tc.verifyTrue(sp_fun(nw, 0, -1, 0))
5665
p = stdlib.get_permissions(nw);
5766

58-
if ~ispc
59-
tc.verifyThat(p, StartsWithSubstring("r-"), "no-write permission failed to set")
67+
if ~ispc() || ~endsWith(func2str(sp_fun), "legacy")
68+
tc.verifyThat(p, StartsWithSubstring("r-"), "no-write permission failed to set")
6069
end
6170

6271
end

0 commit comments

Comments
 (0)