Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port #49310 to master #57222

Merged
merged 4 commits into from
Nov 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/49310.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Issue #49310: Allow users to touch a file with Unix date of birth
18 changes: 11 additions & 7 deletions salt/modules/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -3525,9 +3525,13 @@ def touch(name, atime=None, mtime=None):
simply update the atime and mtime if it already does.

atime:
Access time in Unix epoch time
Access time in Unix epoch time. Set it to 0 to set atime of the
file with Unix date of birth. If this parameter isn't set, atime
will be set with current time.
mtime:
Last modification in Unix epoch time
Last modification in Unix epoch time. Set it to 0 to set mtime of
the file with Unix date of birth. If this parameter isn't set,
mtime will be set with current time.

CLI Example:

Expand All @@ -3537,20 +3541,20 @@ def touch(name, atime=None, mtime=None):
"""
name = os.path.expanduser(name)

if atime and atime.isdigit():
if atime and str(atime).isdigit():
atime = int(atime)
if mtime and mtime.isdigit():
if mtime and str(mtime).isdigit():
mtime = int(mtime)
try:
if not os.path.exists(name):
with salt.utils.files.fopen(name, "a"):
pass

if not atime and not mtime:
if atime is None and mtime is None:
times = None
elif not mtime and atime:
elif mtime is None and atime is not None:
times = (atime, time.time())
elif not atime and mtime:
elif atime is None and mtime is not None:
times = (time.time(), mtime)
else:
times = (atime, mtime)
Expand Down
93 changes: 93 additions & 0 deletions tests/pytests/functional/modules/file/test_touch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"""
Tests for file.touch function
"""

import os

import pytest

from salt.exceptions import SaltInvocationError

pytestmark = [
pytest.mark.windows_whitelisted,
]


@pytest.fixture(scope="module")
def file(modules):
return modules.file


def test_touch(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target))
assert os.path.exists(target)


def test_touch_error_atime(file, tmp_path):
"""
Test touch with non int input
"""
target = tmp_path / "test.file"
with pytest.raises(SaltInvocationError) as exc:
file.touch(str(target), atime="string")
assert "atime and mtime must be integers" in exc.value.message


def test_touch_error_mtime(file, tmp_path):
"""
Test touch with non int input
"""
target = tmp_path / "test.file"
with pytest.raises(SaltInvocationError) as exc:
file.touch(str(target), mtime="string")
assert "atime and mtime must be integers" in exc.value.message


def test_touch_atime(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target), atime=123)
assert os.stat(str(target)).st_atime == 123


def test_touch_atime_zero(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target), atime=0)
assert os.stat(str(target)).st_atime == 0


def test_touch_mtime(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target), mtime=234)
assert os.stat(str(target)).st_mtime == 234


def test_touch_mtime_zero(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target), mtime=0)
assert os.stat(str(target)).st_mtime == 0


def test_touch_atime_mtime(file, tmp_path):
"""
Test touch with defaults
"""
target = tmp_path / "test.file"
file.touch(str(target), atime=456, mtime=789)
assert os.stat(str(target)).st_atime == 456
assert os.stat(str(target)).st_mtime == 789