mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
[PR #7870/be3bfd6f backport][stable-8] Detection of already installed homebrew cask (#7904)
Detection of already installed homebrew cask (#7870)
* fix: detect already installed cask
Use json output v2 to check if formulae and casks are installed
chore: add changelog fragment
* test: add homebrew cask specific tests
* refactor: change cask used in tests
* chore: apply suggestions to changelog fragment
(cherry picked from commit be3bfd6fa5
)
Co-authored-by: João Victor Silva <160127815@aluno.unb.br>
This commit is contained in:
parent
0a904d60cd
commit
f30fcec398
5 changed files with 213 additions and 94 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- homebrew - detect already installed formulae and casks using JSON output from ``brew info`` (https://github.com/ansible-collections/community.general/issues/864).
|
|
@ -165,6 +165,7 @@ changed_pkgs:
|
||||||
version_added: '0.2.0'
|
version_added: '0.2.0'
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import json
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
@ -184,6 +185,10 @@ def _create_regex_group_complement(s):
|
||||||
chars = filter(None, (line.split('#')[0].strip() for line in lines))
|
chars = filter(None, (line.split('#')[0].strip() for line in lines))
|
||||||
group = r'[^' + r''.join(chars) + r']'
|
group = r'[^' + r''.join(chars) + r']'
|
||||||
return re.compile(group)
|
return re.compile(group)
|
||||||
|
|
||||||
|
|
||||||
|
def _check_package_in_json(json_output, package_type):
|
||||||
|
return bool(json_output.get(package_type, []) and json_output[package_type][0].get("installed"))
|
||||||
# /utils ------------------------------------------------------------------ }}}
|
# /utils ------------------------------------------------------------------ }}}
|
||||||
|
|
||||||
|
|
||||||
|
@ -479,17 +484,13 @@ class Homebrew(object):
|
||||||
cmd = [
|
cmd = [
|
||||||
"{brew_path}".format(brew_path=self.brew_path),
|
"{brew_path}".format(brew_path=self.brew_path),
|
||||||
"info",
|
"info",
|
||||||
|
"--json=v2",
|
||||||
self.current_package,
|
self.current_package,
|
||||||
]
|
]
|
||||||
rc, out, err = self.module.run_command(cmd)
|
rc, out, err = self.module.run_command(cmd)
|
||||||
for line in out.split('\n'):
|
data = json.loads(out)
|
||||||
if (
|
|
||||||
re.search(r'Built from source', line)
|
|
||||||
or re.search(r'Poured from bottle', line)
|
|
||||||
):
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
return _check_package_in_json(data, "formulae") or _check_package_in_json(data, "casks")
|
||||||
|
|
||||||
def _current_package_is_outdated(self):
|
def _current_package_is_outdated(self):
|
||||||
if not self.valid_package(self.current_package):
|
if not self.valid_package(self.current_package):
|
||||||
|
|
99
tests/integration/targets/homebrew/tasks/casks.yml
Normal file
99
tests/integration/targets/homebrew/tasks/casks.yml
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
---
|
||||||
|
####################################################################
|
||||||
|
# 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 module.
|
||||||
|
# Copyright (c) 2020, Abhijeet Kasurde <akasurde@redhat.com>
|
||||||
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
- 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']
|
||||||
|
|
||||||
|
#- name: Use ignored-pinned option while upgrading all
|
||||||
|
# homebrew:
|
||||||
|
# upgrade_all: true
|
||||||
|
# upgrade_options: ignore-pinned
|
||||||
|
# become: true
|
||||||
|
# become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
# register: upgrade_option_result
|
||||||
|
# environment:
|
||||||
|
# HOMEBREW_NO_AUTO_UPDATE: True
|
||||||
|
|
||||||
|
#- assert:
|
||||||
|
# that:
|
||||||
|
# - upgrade_option_result.changed
|
||||||
|
|
||||||
|
- vars:
|
||||||
|
package_name: kitty
|
||||||
|
|
||||||
|
block:
|
||||||
|
- name: Make sure {{ package_name }} package is not installed
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
|
||||||
|
- name: Install {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: present
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- package_result.changed
|
||||||
|
|
||||||
|
- name: Again install {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: present
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- not package_result.changed
|
||||||
|
|
||||||
|
- name: Uninstall {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- package_result.changed
|
||||||
|
|
||||||
|
- name: Again uninstall {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- not package_result.changed
|
99
tests/integration/targets/homebrew/tasks/formulae.yml
Normal file
99
tests/integration/targets/homebrew/tasks/formulae.yml
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
---
|
||||||
|
####################################################################
|
||||||
|
# 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 module.
|
||||||
|
# Copyright (c) 2020, Abhijeet Kasurde <akasurde@redhat.com>
|
||||||
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
- 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']
|
||||||
|
|
||||||
|
#- name: Use ignored-pinned option while upgrading all
|
||||||
|
# homebrew:
|
||||||
|
# upgrade_all: true
|
||||||
|
# upgrade_options: ignore-pinned
|
||||||
|
# become: true
|
||||||
|
# become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
# register: upgrade_option_result
|
||||||
|
# environment:
|
||||||
|
# HOMEBREW_NO_AUTO_UPDATE: True
|
||||||
|
|
||||||
|
#- assert:
|
||||||
|
# that:
|
||||||
|
# - upgrade_option_result.changed
|
||||||
|
|
||||||
|
- vars:
|
||||||
|
package_name: gnu-tar
|
||||||
|
|
||||||
|
block:
|
||||||
|
- name: Make sure {{ package_name }} package is not installed
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
|
||||||
|
- name: Install {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: present
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- package_result.changed
|
||||||
|
|
||||||
|
- name: Again install {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: present
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- not package_result.changed
|
||||||
|
|
||||||
|
- name: Uninstall {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- package_result.changed
|
||||||
|
|
||||||
|
- name: Again uninstall {{ package_name }} package using homebrew
|
||||||
|
homebrew:
|
||||||
|
name: "{{ package_name }}"
|
||||||
|
state: absent
|
||||||
|
update_homebrew: false
|
||||||
|
become: true
|
||||||
|
become_user: "{{ brew_stat.stat.pw_name }}"
|
||||||
|
register: package_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- not package_result.changed
|
|
@ -9,91 +9,9 @@
|
||||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
- name: Find brew binary
|
- block:
|
||||||
command: which brew
|
- include_tasks: 'formulae.yml'
|
||||||
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']
|
|
||||||
|
|
||||||
#- name: Use ignored-pinned option while upgrading all
|
|
||||||
# homebrew:
|
|
||||||
# upgrade_all: true
|
|
||||||
# upgrade_options: ignore-pinned
|
|
||||||
# become: true
|
|
||||||
# become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
# register: upgrade_option_result
|
|
||||||
# environment:
|
|
||||||
# HOMEBREW_NO_AUTO_UPDATE: True
|
|
||||||
|
|
||||||
#- assert:
|
|
||||||
# that:
|
|
||||||
# - upgrade_option_result.changed
|
|
||||||
|
|
||||||
- vars:
|
|
||||||
package_name: gnu-tar
|
|
||||||
|
|
||||||
|
- when: ansible_distribution in ['MacOSX']
|
||||||
block:
|
block:
|
||||||
- name: Make sure {{ package_name }} package is not installed
|
- include_tasks: 'casks.yml'
|
||||||
homebrew:
|
|
||||||
name: "{{ package_name }}"
|
|
||||||
state: absent
|
|
||||||
update_homebrew: false
|
|
||||||
become: true
|
|
||||||
become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
|
|
||||||
- name: Install {{ package_name }} package using homebrew
|
|
||||||
homebrew:
|
|
||||||
name: "{{ package_name }}"
|
|
||||||
state: present
|
|
||||||
update_homebrew: false
|
|
||||||
become: true
|
|
||||||
become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
register: package_result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- package_result.changed
|
|
||||||
|
|
||||||
- name: Again install {{ package_name }} package using homebrew
|
|
||||||
homebrew:
|
|
||||||
name: "{{ package_name }}"
|
|
||||||
state: present
|
|
||||||
update_homebrew: false
|
|
||||||
become: true
|
|
||||||
become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
register: package_result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- not package_result.changed
|
|
||||||
|
|
||||||
- name: Uninstall {{ package_name }} package using homebrew
|
|
||||||
homebrew:
|
|
||||||
name: "{{ package_name }}"
|
|
||||||
state: absent
|
|
||||||
update_homebrew: false
|
|
||||||
become: true
|
|
||||||
become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
register: package_result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- package_result.changed
|
|
||||||
|
|
||||||
- name: Again uninstall {{ package_name }} package using homebrew
|
|
||||||
homebrew:
|
|
||||||
name: "{{ package_name }}"
|
|
||||||
state: absent
|
|
||||||
update_homebrew: false
|
|
||||||
become: true
|
|
||||||
become_user: "{{ brew_stat.stat.pw_name }}"
|
|
||||||
register: package_result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- not package_result.changed
|
|
||||||
|
|
Loading…
Reference in a new issue