From dc84653427ac80977c0a2b5ca036f3bb363b0b7a Mon Sep 17 00:00:00 2001 From: Will Toohey Date: Tue, 8 Apr 2025 10:34:08 +1000 Subject: [PATCH] Allow floating point times for smbclient.utime --- src/smbclient/_os.py | 4 ++-- tests/test_smbclient_os.py | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/smbclient/_os.py b/src/smbclient/_os.py index d6c1032..44c9676 100644 --- a/src/smbclient/_os.py +++ b/src/smbclient/_os.py @@ -945,8 +945,8 @@ def utime(path, times=None, ns=None, follow_symlinks=True, **kwargs): if times: time_tuple = times - # seconds in 100s of nanoseonds - op = operator.mul + # seconds in 100s of nanoseonds, may be float + op = lambda a, b: int(a * b) op_amt = 10000000 else: time_tuple = ns diff --git a/tests/test_smbclient_os.py b/tests/test_smbclient_os.py index 2fc04b8..5ffcdfb 100644 --- a/tests/test_smbclient_os.py +++ b/tests/test_smbclient_os.py @@ -1706,6 +1706,27 @@ def test_set_utime_file(smb_share): assert actual.st_mtime_ns == 1000000000 +@pytest.mark.skipif( + os.name != "nt" and not os.environ.get("SMB_FORCE", False), reason="Samba does not update timestamps" +) +def test_set_utime_float(smb_share): + filename = "%s\\file.txt" % smb_share + + with smbclient.open_file(filename, mode="w") as fd: + fd.write("abc") + + before_stat = smbclient.stat(filename) + smbclient.utime(filename, times=(1.0, 1.0)) + actual = smbclient.stat(filename) + + assert actual.st_atime == 1.0 + assert actual.st_atime_ns == 1000000000 + assert actual.st_ctime == before_stat.st_ctime + assert actual.st_ctime_ns == before_stat.st_ctime_ns + assert actual.st_mtime == 1.0 + assert actual.st_mtime_ns == 1000000000 + + @pytest.mark.skipif( os.name != "nt" and not os.environ.get("SMB_FORCE", False), reason="Samba does not update timestamps" )