fixes saltstack/salt#65546 add show diff for new file in file.managed

This commit is contained in:
nicholasmhughes 2023-11-14 10:27:05 -05:00 committed by Daniel Wozniak
parent 590ebf7c80
commit e142205060
4 changed files with 73 additions and 3 deletions

1
changelog/65546.added.md Normal file
View file

@ -0,0 +1 @@
Add ability to show diff for new files in file.managed

View file

@ -5696,6 +5696,7 @@ def check_managed_changes(
ignore_ordering=False,
ignore_whitespace=False,
ignore_comment_characters=None,
new_file_diff=False,
**kwargs,
):
"""
@ -5750,6 +5751,12 @@ def check_managed_changes(
.. versionadded:: 3007.0
new_file_diff
If ``True``, creation of new files will still show a diff in the
changes return.
.. versionadded:: 3007.0
CLI Example:
.. code-block:: bash
@ -5822,6 +5829,7 @@ def check_managed_changes(
ignore_ordering=ignore_ordering,
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
new_file_diff=new_file_diff,
)
__clean_tmp(sfn)
return changes
@ -5847,6 +5855,7 @@ def check_file_meta(
ignore_ordering=False,
ignore_whitespace=False,
ignore_comment_characters=None,
new_file_diff=False,
):
"""
Check for the changes in the file metadata.
@ -5961,6 +5970,12 @@ def check_file_meta(
without disrupting production applications with a service restart.
Implies ``ignore_ordering=True``
.. versionadded:: 3007.0
new_file_diff
If ``True``, creation of new files will still show a diff in the
changes return.
.. versionadded:: 3007.0
"""
changes = {}
@ -5977,7 +5992,7 @@ def check_file_meta(
except CommandExecutionError:
lstats = {}
if not lstats:
if not lstats and not new_file_diff:
changes["newfile"] = name
if any([ignore_ordering, ignore_whitespace, ignore_comment_characters]):
return True, changes
@ -6006,10 +6021,16 @@ def check_file_meta(
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
)
else:
elif lstats:
changes["diff"] = get_diff(
name, sfn, template=True, show_filenames=False
)
else:
with tempfile.NamedTemporaryFile() as _mt:
_mt.write(b"")
changes["diff"] = get_diff(
_mt.name, sfn, template=True, show_filenames=False
)
except CommandExecutionError as exc:
changes["diff"] = exc.strerror
else:
@ -6044,8 +6065,12 @@ def check_file_meta(
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
)
else:
elif lstats:
differences = get_diff(name, tmp, show_filenames=False)
else:
with tempfile.NamedTemporaryFile() as _mt:
_mt.write(b"")
differences = get_diff(_mt.name, tmp, show_filenames=False)
except CommandExecutionError as exc:
log.error("Failed to diff files: %s", exc)
differences = exc.strerror
@ -6056,6 +6081,9 @@ def check_file_meta(
else:
changes["diff"] = differences
if not lstats:
return changes
if not salt.utils.platform.is_windows():
# Check owner
if user is not None and user != lstats["user"] and user != lstats["uid"]:
@ -6321,6 +6349,7 @@ def manage_file(
ignore_ordering=False,
ignore_whitespace=False,
ignore_comment_characters=None,
new_file_diff=False,
**kwargs,
):
"""
@ -6545,6 +6574,12 @@ def manage_file(
.. versionadded:: 3007.0
new_file_diff
If ``True``, creation of new files will still show a diff in the
changes return.
.. versionadded:: 3007.0
CLI Example:
.. code-block:: bash
@ -6916,6 +6951,13 @@ def manage_file(
# It is a new file, set the diff accordingly
ret["changes"]["diff"] = "New file"
if new_file_diff:
with tempfile.NamedTemporaryFile() as _mt:
_mt.write(b"")
ret["changes"]["diff"] = get_diff(
_mt.name, sfn, show_filenames=False
)
if not os.path.isdir(contain_dir):
if makedirs:
_set_mode_and_make_dirs(name, dir_mode, mode, user, group)
@ -6970,6 +7012,13 @@ def manage_file(
else:
tmp_.write(salt.utils.stringutils.to_bytes(contents))
if new_file_diff and ret["changes"]["diff"] == "New file":
with tempfile.NamedTemporaryFile() as _mt:
_mt.write(b"")
ret["changes"]["diff"] = get_diff(
_mt.name, tmp, show_filenames=False
)
# Copy into place
salt.utils.files.copyfile(
tmp, name, __salt__["config.backup_mode"](backup), __opts__["cachedir"]

View file

@ -2324,6 +2324,7 @@ def managed(
ignore_ordering=False,
ignore_whitespace=False,
ignore_comment_characters=None,
new_file_diff=False,
**kwargs,
):
r"""
@ -3014,6 +3015,12 @@ def managed(
without disrupting production applications with a service restart.
Implies ``ignore_ordering=True``
.. versionadded:: 3007.0
new_file_diff
If ``True``, creation of new files will still show a diff in the
changes return.
.. versionadded:: 3007.0
"""
if "env" in kwargs:
@ -3343,6 +3350,7 @@ def managed(
ignore_ordering=ignore_ordering,
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
new_file_diff=new_file_diff,
**kwargs,
)
if any([ignore_ordering, ignore_whitespace, ignore_comment_characters]):
@ -3485,6 +3493,7 @@ def managed(
ignore_ordering=ignore_ordering,
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
new_file_diff=new_file_diff,
**kwargs,
)
except Exception as exc: # pylint: disable=broad-except
@ -3577,6 +3586,7 @@ def managed(
ignore_ordering=ignore_ordering,
ignore_whitespace=ignore_whitespace,
ignore_comment_characters=ignore_comment_characters,
new_file_diff=new_file_diff,
**kwargs,
)
except Exception as exc: # pylint: disable=broad-except

View file

@ -1043,3 +1043,13 @@ def test_issue_60203(
assert "Unable to manage file" in ret.comment
assert "/files/test.tar.gz.sha256" in ret.comment
assert "dontshowme" not in ret.comment
def test_file_managed_new_file_diff(file, tmp_path):
name = tmp_path / "new_file_diff.txt"
ret = file.managed(str(name), contents="EITR", new_file_diff=True, test=True)
assert ret.changes == {"diff": "--- \n+++ \n@@ -0,0 +1 @@\n+EITR\n"}
assert not name.exists()
ret = file.managed(str(name), contents="EITR", new_file_diff=True)
assert ret.changes == {"diff": "--- \n+++ \n@@ -0,0 +1 @@\n+EITR\n"}
assert name.exists()