Greatly speed up homebrew module when multiple packages are passed in the name key (#9181)

* Increase test coverage and assert output more strictly

* Remove unused `_current_package_is_installed_from_head`

* Remove `un/changed_count` and infer from un/changed_pkgs length

* Track `installed` & `outdated` package state once

* Validate package names beforehand

* Install packages in 1 brew call instead of N

This also has the side effect of fixing the check message so that it prints every packages that will be installed instead of only the first one.

* Uninstall packages in 1 brew call instead of N

* Link packages in 1 brew call instead of N

* Unlink packages in 1 brew call instead of N

* Upgrade packages in 1 brew call instead of N

* Remove dangling checks

* Remove `_status` method and directly return the tuple

* Add changelog fragment

* Fix invalid format string (nice catch pylint!)

* Update changelogs/fragments/9181-improve-homebrew-module-performance.yml

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

* Update brew info parsing for casks

* Update changelogs/fragments/9181-improve-homebrew-module-performance.yml

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
This commit is contained in:
Thibaut Decombe 2024-12-02 20:17:04 +01:00 committed by GitHub
commit fddccea940
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 409 additions and 191 deletions

View file

@ -56,6 +56,9 @@
- assert:
that:
- package_result.changed
- "package_result.msg == 'Package installed: gnu-tar'"
- "package_result.changed_pkgs == ['gnu-tar']"
- "package_result.unchanged_pkgs == []"
- name: Again install {{ package_name }} package using homebrew
homebrew:
@ -69,6 +72,41 @@
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Package already installed: gnu-tar'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs == ['gnu-tar']"
- name: Unlink {{ package_name }} package using homebrew
homebrew:
name: "{{ package_name }}"
state: unlinked
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Package unlinked: gnu-tar'"
- "package_result.changed_pkgs == ['gnu-tar']"
- "package_result.unchanged_pkgs == []"
- name: Link {{ package_name }} package using homebrew
homebrew:
name: "{{ package_name }}"
state: linked
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Package linked: gnu-tar'"
- "package_result.changed_pkgs == ['gnu-tar']"
- "package_result.unchanged_pkgs == []"
- name: Uninstall {{ package_name }} package using homebrew
homebrew:
@ -82,6 +120,9 @@
- assert:
that:
- package_result.changed
- "package_result.msg == 'Package uninstalled: gnu-tar'"
- "package_result.changed_pkgs == ['gnu-tar']"
- "package_result.unchanged_pkgs == []"
- name: Again uninstall {{ package_name }} package using homebrew
homebrew:
@ -95,3 +136,188 @@
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Package already uninstalled: gnu-tar'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs == ['gnu-tar']"
- name: Upgrade {{ package_name }} package using homebrew
homebrew:
name: "{{ package_name }}"
state: latest
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Package upgraded: gnu-tar'"
- "package_result.changed_pkgs == ['gnu-tar']"
- "package_result.unchanged_pkgs == []"
- name: Again upgrade {{ package_name }} package using homebrew
homebrew:
name: "{{ package_name }}"
state: latest
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Package already upgraded: gnu-tar'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs == ['gnu-tar']"
- vars:
package_names:
- gnu-tar
- gnu-time
block:
- name: Make sure {{ package_names }} packages are not installed
homebrew:
name: "{{ package_names }}"
state: absent
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
- name: Install only {{ package_names[0] }} package using homebrew
homebrew:
name: "{{ package_names[0] }}"
state: present
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
- name: Install {{ package_names }} packages using homebrew (one is already installed)
homebrew:
name: "{{ package_names }}"
state: present
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Changed: 1, Unchanged: 1'"
- "package_result.changed_pkgs == ['gnu-time']"
- "package_result.unchanged_pkgs == ['gnu-tar']"
- name: Again install {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: present
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Changed: 0, Unchanged: 2'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs | sort == ['gnu-tar', 'gnu-time']"
- name: Unlink {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: unlinked
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Changed: 2, Unchanged: 0'"
- "package_result.changed_pkgs | sort == ['gnu-tar', 'gnu-time']"
- "package_result.unchanged_pkgs == []"
- name: Link {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: linked
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Changed: 2, Unchanged: 0'"
- "package_result.changed_pkgs | sort == ['gnu-tar', 'gnu-time']"
- "package_result.unchanged_pkgs == []"
- name: Uninstall {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: absent
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Changed: 2, Unchanged: 0'"
- "package_result.changed_pkgs | sort == ['gnu-tar', 'gnu-time']"
- "package_result.unchanged_pkgs == []"
- name: Again uninstall {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: absent
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Changed: 0, Unchanged: 2'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs | sort == ['gnu-tar', 'gnu-time']"
- name: Upgrade {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: latest
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- package_result.changed
- "package_result.msg == 'Changed: 2, Unchanged: 0'"
- "package_result.changed_pkgs | sort == ['gnu-tar', 'gnu-time']"
- "package_result.unchanged_pkgs == []"
- name: Again upgrade {{ package_names }} packages using homebrew
homebrew:
name: "{{ package_names }}"
state: latest
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
register: package_result
- assert:
that:
- not package_result.changed
- "package_result.msg == 'Changed: 0, Unchanged: 2'"
- "package_result.changed_pkgs == []"
- "package_result.unchanged_pkgs | sort == ['gnu-tar', 'gnu-time']"