From e1422050603ef5d3f13719b4ee412da270e19ce3 Mon Sep 17 00:00:00 2001 From: nicholasmhughes Date: Tue, 14 Nov 2023 10:27:05 -0500 Subject: [PATCH] fixes saltstack/salt#65546 add show diff for new file in file.managed --- changelog/65546.added.md | 1 + salt/modules/file.py | 55 ++++++++++++++++++- salt/states/file.py | 10 ++++ .../functional/states/file/test_managed.py | 10 ++++ 4 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 changelog/65546.added.md diff --git a/changelog/65546.added.md b/changelog/65546.added.md new file mode 100644 index 00000000000..b63c84506ae --- /dev/null +++ b/changelog/65546.added.md @@ -0,0 +1 @@ +Add ability to show diff for new files in file.managed diff --git a/salt/modules/file.py b/salt/modules/file.py index 5c5cbc773d7..4c75fa67605 100644 --- a/salt/modules/file.py +++ b/salt/modules/file.py @@ -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"] diff --git a/salt/states/file.py b/salt/states/file.py index d9b68038eda..bab0ee376a5 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -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 diff --git a/tests/pytests/functional/states/file/test_managed.py b/tests/pytests/functional/states/file/test_managed.py index 013935d3a70..1600f51dc0a 100644 --- a/tests/pytests/functional/states/file/test_managed.py +++ b/tests/pytests/functional/states/file/test_managed.py @@ -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()