diff --git a/changelogs/fragments/4464-pacman-fix-local-remove.yaml b/changelogs/fragments/4464-pacman-fix-local-remove.yaml new file mode 100644 index 0000000000..50440491c9 --- /dev/null +++ b/changelogs/fragments/4464-pacman-fix-local-remove.yaml @@ -0,0 +1,2 @@ +bugfixes: + - pacman - fixed bug where ``absent`` state did not work for locally installed packages (https://github.com/ansible-collections/community.general/pull/4464). diff --git a/plugins/modules/packaging/os/pacman.py b/plugins/modules/packaging/os/pacman.py index 79fe159591..b7f3855533 100644 --- a/plugins/modules/packaging/os/pacman.py +++ b/plugins/modules/packaging/os/pacman.py @@ -610,8 +610,9 @@ class Pacman(object): # Expand group members for group_member in self.inventory["available_groups"][pkg]: pkg_list.append(Package(name=group_member, source=group_member)) - elif pkg in self.inventory["available_pkgs"]: - # just a regular pkg + elif pkg in self.inventory["available_pkgs"] or pkg in self.inventory["installed_pkgs"]: + # Just a regular pkg, either available in the repositories, + # or locally installed, which we need to know for absent state pkg_list.append(Package(name=pkg, source=pkg)) else: # Last resort, call out to pacman to extract the info, diff --git a/tests/integration/targets/pacman/aliases b/tests/integration/targets/pacman/aliases index 817614d6a7..4db7e45ee5 100644 --- a/tests/integration/targets/pacman/aliases +++ b/tests/integration/targets/pacman/aliases @@ -5,3 +5,4 @@ skip/freebsd skip/osx skip/macos skip/rhel +needs/root diff --git a/tests/integration/targets/pacman/tasks/locally_installed_package.yml b/tests/integration/targets/pacman/tasks/locally_installed_package.yml new file mode 100644 index 0000000000..308d39e442 --- /dev/null +++ b/tests/integration/targets/pacman/tasks/locally_installed_package.yml @@ -0,0 +1,81 @@ +--- +- vars: + package_name: ansible-test-foo + username: ansible-regular-user + block: + - name: Install fakeroot + pacman: + state: present + name: + - fakeroot + + - name: Create user + user: + name: '{{ username }}' + home: '/home/{{ username }}' + create_home: true + + - name: Create directory + file: + path: '/home/{{ username }}/{{ package_name }}' + state: directory + owner: '{{ username }}' + + - name: Create PKGBUILD + copy: + dest: '/home/{{ username }}/{{ package_name }}/PKGBUILD' + content: | + pkgname=('{{ package_name }}') + pkgver=1.0.0 + pkgrel=1 + pkgdesc="Test removing a local package not in the repositories" + arch=('any') + license=('GPL v3+') + owner: '{{ username }}' + + - name: Build package + command: + cmd: su {{ username }} -c "makepkg -srf" + chdir: '/home/{{ username }}/{{ package_name }}' + + - name: Install package + pacman: + state: present + name: + - '/home/{{ username }}/{{ package_name }}/{{ package_name }}-1.0.0-1-any.pkg.tar.zst' + + - name: Remove package (check mode) + pacman: + state: absent + name: + - '{{ package_name }}' + check_mode: true + register: remove_1 + + - name: Remove package + pacman: + state: absent + name: + - '{{ package_name }}' + register: remove_2 + + - name: Remove package (idempotent) + pacman: + state: absent + name: + - '{{ package_name }}' + register: remove_3 + + - name: Check conditions + assert: + that: + - remove_1 is changed + - remove_2 is changed + - remove_3 is not changed + + always: + - name: Remove directory + file: + path: '{{ remote_tmp_dir }}/{{ package_name }}' + state: absent + become: true diff --git a/tests/integration/targets/pacman/tasks/main.yml b/tests/integration/targets/pacman/tasks/main.yml index 7014651804..4a34307c48 100644 --- a/tests/integration/targets/pacman/tasks/main.yml +++ b/tests/integration/targets/pacman/tasks/main.yml @@ -11,3 +11,4 @@ - include: 'package_urls.yml' - include: 'remove_nosave.yml' - include: 'update_cache.yml' + - include: 'locally_installed_package.yml'