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 00000000000..f5229010702 --- /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 8889ffc15b8..315b07ba8e1 100644 --- a/plugins/modules/pnpm.py +++ b/plugins/modules/pnpm.py @@ -189,6 +189,8 @@ def __init__(self, module, **kwargs): 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 ae48f994a2e..10f42618f75 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 0b0f49e6292..66f5eb622b3 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 }}"