Skip to content

Commit d434ab3

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

File tree

2 files changed

+46
-15
lines changed

2 files changed

+46
-15
lines changed

+stdlib/set_permissions.m

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,53 @@
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;
21+
22+
if ~stdlib.exists(file), return, end
23+
2024

2125
if isMATLABReleaseOlderThan('R2025a')
22-
warning("stdlib:set_permissions:RequiresMex", "set_permissions requires 'buildtool mex'");
23-
ok = false;
26+
27+
mode = '';
28+
if readable == 1
29+
mode = [mode '+r'];
30+
elseif readable == -1
31+
mode = [mode '-r'];
32+
end
33+
if writable == 1
34+
mode = [mode '+w'];
35+
elseif writable == -1
36+
mode = [mode '-w'];
37+
end
38+
if executable == 1
39+
mode = [mode '+x'];
40+
elseif executable == -1
41+
mode = [mode '-x'];
42+
end
43+
44+
[s, msg, id] = fileattrib(file, mode);
45+
ok = s == 1;
46+
if ~ok
47+
warning(id, "Failed to set permissions for %s: %s", file, msg)
48+
end
49+
2450
else
25-
p = filePermissions(path);
51+
p = filePermissions(file);
2652

2753
if readable ~= 0
2854
setPermissions(p, "Readable", readable > 0);

test/TestPermissions.m

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ function test_get_permissions(tc, Ps)
3232
end
3333

3434

35-
function test_set_permissions(tc)
35+
function test_set_permissions_noread(tc)
3636
import matlab.unittest.constraints.StartsWithSubstring
3737

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

4241
nr = fullfile(td, "no-read");
@@ -45,18 +44,24 @@ function test_set_permissions(tc)
4544
tc.verifyTrue(stdlib.set_permissions(nr, -1, 0, 0))
4645
p = stdlib.get_permissions(nr);
4746

48-
if ~ispc
4947
tc.verifyThat(p, StartsWithSubstring("-"), "no-read permission failed to set")
5048
end
5149

50+
51+
function test_set_permissions_nowrite(tc)
52+
import matlab.unittest.constraints.StartsWithSubstring
53+
54+
tc.assumeFalse(isMATLABReleaseOlderThan('R2022a'))
55+
td = tc.createTemporaryFolder();
56+
5257
nw = fullfile(td, "no-write");
5358

5459
tc.verifyTrue(stdlib.touch(nw))
5560
tc.verifyTrue(stdlib.set_permissions(nw, 0, -1, 0))
5661
p = stdlib.get_permissions(nw);
5762

58-
if ~ispc
59-
tc.verifyThat(p, StartsWithSubstring("r-"), "no-write permission failed to set")
63+
if ~ispc() || ~isMATLABReleaseOlderThan('R2025a')
64+
tc.verifyThat(p, StartsWithSubstring("r-"), "no-write permission failed to set")
6065
end
6166

6267
end

0 commit comments

Comments
 (0)