From 39895a6d38220d3a8ff959c6770acff956fbbcfd Mon Sep 17 00:00:00 2001 From: Aritra Sen <125266845+aretrosen@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:04:27 +0530 Subject: [PATCH] pnpm: version should not be latest when state is latest (#7339) * (fix) don't set version at latest at state: latest If version is forcefully set at latest when state is latest, the package will always be changed, as there is no version "latest" will ever be detected. It is better to keep it None. * (fix) fixed tests to reflect recent changes * Apply suggestions from code review Co-authored-by: Felix Fontein * (feat) added changelog fragment for pull #7339 * (fix) apply correct punctuation to changelog Co-authored-by: Felix Fontein --------- Co-authored-by: Felix Fontein --- ...pnpm-correct-version-when-state-latest.yml | 2 ++ plugins/modules/pnpm.py | 5 ++-- tests/integration/targets/pnpm/tasks/main.yml | 3 ++- tests/integration/targets/pnpm/tasks/run.yml | 23 ++++++++++++++----- 4 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 changelogs/fragments/7339-pnpm-correct-version-when-state-latest.yml diff --git a/changelogs/fragments/7339-pnpm-correct-version-when-state-latest.yml b/changelogs/fragments/7339-pnpm-correct-version-when-state-latest.yml new file mode 100644 index 0000000000..f522901070 --- /dev/null +++ b/changelogs/fragments/7339-pnpm-correct-version-when-state-latest.yml @@ -0,0 +1,2 @@ +minor_changes: + - pnpm - set correct version when state is latest or version is not mentioned. Resolves previous idempotency problem (https://github.com/ansible-collections/community.general/pull/7339). diff --git a/plugins/modules/pnpm.py b/plugins/modules/pnpm.py index 8889ffc15b..315b07ba8e 100644 --- a/plugins/modules/pnpm.py +++ b/plugins/modules/pnpm.py @@ -189,6 +189,8 @@ class Pnpm(object): self.alias_name_ver = (self.alias_name_ver or "") + self.name if self.version is not None: self.alias_name_ver = self.alias_name_ver + "@" + str(self.version) + else: + self.alias_name_ver = self.alias_name_ver + "@latest" def _exec(self, args, run_in_check_mode=False, check_rc=True): if not self.module.check_mode or (self.module.check_mode and run_in_check_mode): @@ -413,9 +415,6 @@ def main(): if state == "absent" and name is None: module.fail_json(msg="Package name is required for uninstalling") - if state == "latest": - version = "latest" - if globally: _rc, out, _err = module.run_command(executable + ["root", "-g"], check_rc=True) path, _tail = os.path.split(out.strip()) diff --git a/tests/integration/targets/pnpm/tasks/main.yml b/tests/integration/targets/pnpm/tasks/main.yml index ae48f994a2..10f42618f7 100644 --- a/tests/integration/targets/pnpm/tasks/main.yml +++ b/tests/integration/targets/pnpm/tasks/main.yml @@ -1,3 +1,4 @@ +--- #################################################################### # WARNING: These are designed specifically for Ansible tests # # and should not be used as examples of how to write Ansible roles # @@ -13,7 +14,7 @@ # Setup steps - name: Run tests on OSes - include_tasks: run.yml + ansible.builtin.include_tasks: run.yml vars: ansible_system_os: "{{ ansible_system | lower }}" nodejs_version: "{{ item.node_version }}" diff --git a/tests/integration/targets/pnpm/tasks/run.yml b/tests/integration/targets/pnpm/tasks/run.yml index 0b0f49e629..66f5eb622b 100644 --- a/tests/integration/targets/pnpm/tasks/run.yml +++ b/tests/integration/targets/pnpm/tasks/run.yml @@ -127,11 +127,6 @@ - pnpm_reinstall is success - not (pnpm_reinstall is changed) - - name: Manually delete package - ansible.builtin.file: - path: "{{ remote_tmp_dir }}/node_modules/{{ package }}" - state: absent - - name: Reinstall package pnpm: path: "{{ remote_tmp_dir }}" @@ -146,7 +141,7 @@ ansible.builtin.assert: that: - pnpm_fix_install is success - - pnpm_fix_install is changed + - pnpm_fix_install is not changed - name: Install package with version, without executable path pnpm: @@ -293,6 +288,22 @@ - pnpm_reinstall is success - not (pnpm_reinstall is changed) + - name: Updating package globally, without explicit executable path + pnpm: + name: "{{ package }}" + state: latest + global: true + environment: + PATH: "{{ pnpm_bin_path }}:{{ node_bin_path }}:{{ ansible_env.PATH }}" + PNPM_HOME: "{{ pnpm_bin_path }}" + register: pnpm_reinstall + + - name: Assert that there is no change + ansible.builtin.assert: + that: + - pnpm_reinstall is success + - pnpm_reinstall is not changed + - name: Remove package without dependency globally pnpm: name: "{{ package }}"