Skip to content

Commit 650c451

Browse files
committed
set_modtime shell fallback
1 parent 0276c49 commit 650c451

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

+stdlib/+sys/set_modtime.m

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function ok = set_modtime(p, t)
2+
3+
if ispc()
4+
cmd = sprintf('pwsh -Command "(Get-Item ''%s'').LastWriteTime = ''%s''"', p, string(t, "yyyy-MM-dd HH:mm:ss"));
5+
elseif ismac()
6+
cmd = sprintf("touch -mt %s %s", string(t, "yyyyMMddHHmm"), p);
7+
else
8+
% https://man7.org/linux/man-pages/man1/touch.1.html
9+
cmd = sprintf("touch -t %s %s", string(t, "yyyyMMddHHmm"), p);
10+
end
11+
12+
[s, m] = system(cmd);
13+
ok = s == 0;
14+
15+
if ~ok
16+
warning("stdlib:set_modtime:ValueError", "%s set modification time of %s: %s", cmd, p, m);
17+
end
18+
19+
end

+stdlib/set_modtime.m

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
function ok = set_modtime(p, t)
55
arguments
6-
p {mustBeTextScalar}
6+
p {mustBeTextScalar, mustBeFile}
77
t (1,1) datetime
88
end
99

@@ -24,6 +24,10 @@
2424
ok = stdlib.python.set_modtime(p, utc);
2525
end
2626

27+
if ~ok
28+
ok = stdlib.sys.set_modtime(p, t);
29+
end
30+
2731
end
2832

2933
%!test

+stdlib/touch.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
t (1,1) datetime = datetime("now")
77
end
88

9-
if ~stdlib.exists(p)
9+
ok = stdlib.exists(p);
10+
11+
if ~ok
1012
fid = fopen(p, "w");
1113
ok = fid > 0 && fclose(fid) == 0;
1214
end

test/TestTime.m

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ function test_get_modtime(tc)
3232

3333

3434
function test_touch_modtime(tc)
35-
tc.assumeTrue(stdlib.has_java() || stdlib.has_python())
36-
37-
fn = fullfile(tc.td, "modtime.txt");
35+
fn = tc.td + "/modtime.txt";
3836

3937
tc.verifyTrue(stdlib.touch(fn, datetime("yesterday")))
4038
t0 = stdlib.get_modtime(fn);
@@ -45,14 +43,23 @@ function test_touch_modtime(tc)
4543
tc.verifyGreaterThanOrEqual(t1, t0)
4644
end
4745

48-
49-
function test_set_modtime(tc)
50-
tc.assumeTrue(stdlib.has_java() || stdlib.has_python())
51-
52-
tc.verifyEqual(stdlib.set_modtime("", datetime("now")), false)
5346
end
5447

5548

49+
methods(Test, TestTags="shell")
50+
51+
function test_set_modtime_sys(tc)
52+
fn = tc.td + "/modtime.txt";
53+
54+
tc.verifyTrue(stdlib.touch(fn, datetime("yesterday")))
55+
t0 = stdlib.get_modtime(fn);
56+
57+
tc.verifyTrue(stdlib.set_modtime(fn, datetime("now")))
58+
t1 = stdlib.get_modtime(fn);
59+
60+
tc.verifyGreaterThanOrEqual(t1, t0);
61+
end
62+
5663
end
5764

5865
end

0 commit comments

Comments
 (0)