diff --git a/changelogs/fragments/3703-force-install-homebrew-cask.yml b/changelogs/fragments/3703-force-install-homebrew-cask.yml new file mode 100644 index 0000000000..781735a5fe --- /dev/null +++ b/changelogs/fragments/3703-force-install-homebrew-cask.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew_cask - fix force install operation (https://github.com/ansible-collections/community.general/issues/3703). diff --git a/plugins/modules/packaging/os/homebrew_cask.py b/plugins/modules/packaging/os/homebrew_cask.py index 8fe54e3b04..df7a54558c 100644 --- a/plugins/modules/packaging/os/homebrew_cask.py +++ b/plugins/modules/packaging/os/homebrew_cask.py @@ -102,6 +102,12 @@ EXAMPLES = ''' state: present install_options: 'debug,appdir=/Applications' +- name: Install cask with force option + community.general.homebrew_cask: + name: alfred + state: present + install_options: force + - name: Allow external app community.general.homebrew_cask: name: alfred @@ -600,7 +606,7 @@ class HomebrewCask(object): self.message = 'Invalid cask: {0}.'.format(self.current_cask) raise HomebrewCaskException(self.message) - if self._current_cask_is_installed(): + if '--force' not in self.install_options and self._current_cask_is_installed(): self.unchanged_count += 1 self.message = 'Cask already installed: {0}'.format( self.current_cask, diff --git a/tests/integration/targets/homebrew_cask/aliases b/tests/integration/targets/homebrew_cask/aliases new file mode 100644 index 0000000000..7361196090 --- /dev/null +++ b/tests/integration/targets/homebrew_cask/aliases @@ -0,0 +1,6 @@ +shippable/posix/group1 +skip/aix +skip/freebsd +skip/rhel +skip/docker +skip/python2.6 diff --git a/tests/integration/targets/homebrew_cask/defaults/main.yml b/tests/integration/targets/homebrew_cask/defaults/main.yml new file mode 100644 index 0000000000..e9c23a3bc9 --- /dev/null +++ b/tests/integration/targets/homebrew_cask/defaults/main.yml @@ -0,0 +1 @@ +cask: brooklyn \ No newline at end of file diff --git a/tests/integration/targets/homebrew_cask/tasks/main.yml b/tests/integration/targets/homebrew_cask/tasks/main.yml new file mode 100644 index 0000000000..a582427c56 --- /dev/null +++ b/tests/integration/targets/homebrew_cask/tasks/main.yml @@ -0,0 +1,71 @@ +#################################################################### +# WARNING: These are designed specifically for Ansible tests # +# and should not be used as examples of how to write Ansible roles # +#################################################################### + +# Test code for the homebrew_cask module. +# Copyright: (c) 2022, Joseph Torcasso +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- + - name: Find brew binary + command: which brew + register: brew_which + when: ansible_distribution in ['MacOSX'] + + - name: Get owner of brew binary + stat: + path: "{{ brew_which.stdout }}" + register: brew_stat + when: ansible_distribution in ['MacOSX'] + + - block: + - name: Install cask + homebrew_cask: + name: "{{ cask }}" + state: present + become: yes + become_user: "{{ brew_stat.stat.pw_name }}" + register: cask_install_result + + - assert: + that: + - cask_install_result is changed + - "'Cask installed' in cask_install_result.msg" + + - name: Install cask (idempotence) + homebrew_cask: + name: "{{ cask }}" + state: present + become: yes + become_user: "{{ brew_stat.stat.pw_name }}" + register: cask_install_result + + - assert: + that: + - cask_install_result is not changed + - "'Cask installed' not in cask_install_result.msg" + - "'Cask already installed' in cask_install_result.msg" + + - name: Install cask with force install option + homebrew_cask: + name: "{{ cask }}" + state: present + install_options: force + become: yes + become_user: "{{ brew_stat.stat.pw_name }}" + register: cask_install_result + + - assert: + that: + - cask_install_result is changed + - "'Cask installed' in cask_install_result.msg" + + always: + - name: Delete cask + homebrew_cask: + name: "{{ cask }}" + state: absent + install_options: force + become: yes + become_user: "{{ brew_stat.stat.pw_name }}" + ignore_errors: yes