From cc8151f209a2578f3ee934306445a7246502bd75 Mon Sep 17 00:00:00 2001
From: Evangelos Foutras <evangelos@foutrelis.com>
Date: Sun, 6 Mar 2022 22:38:33 +0200
Subject: [PATCH] pacman: don't always return changed w/ update_cache (#4318)

* pacman: don't always return changed w/ update_cache

This used to be the behavior before the recent refactoring. [1]

Allows the following to return changed only when packages were upgraded:

  - pacman:
    update_cache: yes
    upgrade: yes

And the following to return changed only when the foo package wasn't at
the latest version:

  - pacman:
    name: foo
    state: latest
    update_cache: yes

[1] https://github.com/ansible-collections/community.general/pull/3907

* Update changelogs/fragments/4318-pacman-restore-old-changed-behavior.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

Co-authored-by: Felix Fontein <felix@fontein.de>
---
 .../4318-pacman-restore-old-changed-behavior.yml     | 12 ++++++++++++
 plugins/modules/packaging/os/pacman.py               |  6 ++++++
 2 files changed, 18 insertions(+)
 create mode 100644 changelogs/fragments/4318-pacman-restore-old-changed-behavior.yml

diff --git a/changelogs/fragments/4318-pacman-restore-old-changed-behavior.yml b/changelogs/fragments/4318-pacman-restore-old-changed-behavior.yml
new file mode 100644
index 0000000000..3131d5fac4
--- /dev/null
+++ b/changelogs/fragments/4318-pacman-restore-old-changed-behavior.yml
@@ -0,0 +1,12 @@
+bugfixes:
+  - pacman - when the ``update_cache`` option is combined with another option
+    such as ``upgrade``, report ``changed`` based on the actions performed by
+    the latter option. This was the behavior in community.general 4.4.0 and before.
+    In community.general 4.5.0, a task combining these options would always
+    report ``changed``
+    (https://github.com/ansible-collections/community.general/pull/4318).
+
+known_issues:
+   - pacman - ``update_cache`` cannot differentiate between up to date and
+     outdated package lists and will report ``changed`` in both situations
+     (https://github.com/ansible-collections/community.general/pull/4318).
diff --git a/plugins/modules/packaging/os/pacman.py b/plugins/modules/packaging/os/pacman.py
index 324c9ebccc..356c3c664e 100644
--- a/plugins/modules/packaging/os/pacman.py
+++ b/plugins/modules/packaging/os/pacman.py
@@ -271,6 +271,12 @@ class Pacman(object):
             if not (self.m.params["name"] or self.m.params["upgrade"]):
                 self.success()
 
+        # Avoid shadowing lack of changes in the following stages
+        # so that update_cache: yes doesn't always return changed
+        # TODO: remove this when update_cache is tweaked to report its real
+        # changed status (i.e. no changed if package lists were up to date)
+        self.changed = False
+
         self.inventory = self._build_inventory()
         if self.m.params["upgrade"]:
             self.upgrade()