2023-04-26 09:13:00 -07:00
|
|
|
# typed: strict
|
2022-09-13 23:23:48 -07:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Utils
|
|
|
|
# Helper function for finding autoremovable formulae.
|
|
|
|
#
|
|
|
|
# @private
|
|
|
|
module Autoremove
|
2023-04-26 09:10:30 -07:00
|
|
|
class << self
|
2023-04-26 09:11:21 -07:00
|
|
|
# An array of {Formula} without {Formula} or {Cask}
|
|
|
|
# dependents that weren't installed on request and without
|
|
|
|
# build dependencies for {Formula} installed from source.
|
|
|
|
# @private
|
2023-04-26 09:13:00 -07:00
|
|
|
sig { params(formulae: T::Array[Formula], casks: T::Array[Cask::Cask]).returns(T::Array[Formula]) }
|
2023-04-26 09:11:21 -07:00
|
|
|
def removable_formulae(formulae, casks)
|
|
|
|
unused_formulae = unused_formulae_with_no_formula_dependents(formulae)
|
|
|
|
unused_formulae - formulae_with_cask_dependents(casks)
|
|
|
|
end
|
|
|
|
|
2023-04-26 09:12:08 -07:00
|
|
|
private
|
|
|
|
|
2023-04-26 09:10:30 -07:00
|
|
|
# An array of all installed {Formula} with {Cask} dependents.
|
|
|
|
# @private
|
2023-04-26 09:13:00 -07:00
|
|
|
sig { params(casks: T::Array[Cask::Cask]).returns(T::Array[Formula]) }
|
2023-04-26 09:10:30 -07:00
|
|
|
def formulae_with_cask_dependents(casks)
|
|
|
|
casks.flat_map { |cask| cask.depends_on[:formula] }
|
|
|
|
.compact
|
|
|
|
.map { |f| Formula[f] }
|
|
|
|
.flat_map { |f| [f, *f.runtime_formula_dependencies].compact }
|
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
|
2024-06-14 17:26:28 +01:00
|
|
|
# An array of all installed bottled {Formula} without runtime {Formula}
|
2023-04-26 09:10:30 -07:00
|
|
|
# dependents for bottles and without build {Formula} dependents
|
|
|
|
# for those built from source.
|
|
|
|
# @private
|
2023-04-26 09:13:00 -07:00
|
|
|
sig { params(formulae: T::Array[Formula]).returns(T::Array[Formula]) }
|
2024-06-14 17:26:28 +01:00
|
|
|
def bottled_formulae_with_no_formula_dependents(formulae)
|
|
|
|
formulae_to_keep = T.let([], T::Array[Formula])
|
2023-04-26 09:10:30 -07:00
|
|
|
formulae.each do |formula|
|
2024-06-14 17:26:28 +01:00
|
|
|
formulae_to_keep += formula.runtime_formula_dependencies
|
2022-09-13 23:23:48 -07:00
|
|
|
|
2024-06-14 17:26:28 +01:00
|
|
|
if (tab = formula.any_installed_keg&.tab)
|
|
|
|
# Ignore build dependencies when the formula is a bottle
|
|
|
|
next if tab.poured_from_bottle
|
|
|
|
|
|
|
|
# Keep the formula if it was built from source
|
|
|
|
formulae_to_keep << formula
|
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
|
2023-04-26 09:10:30 -07:00
|
|
|
formula.deps.select(&:build?).each do |dep|
|
2024-06-14 17:26:28 +01:00
|
|
|
formulae_to_keep << dep.to_formula
|
2023-04-26 09:10:30 -07:00
|
|
|
rescue FormulaUnavailableError
|
|
|
|
# do nothing
|
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
end
|
2024-06-14 17:26:28 +01:00
|
|
|
formulae - formulae_to_keep
|
2022-09-13 23:23:48 -07:00
|
|
|
end
|
|
|
|
|
2023-04-26 09:10:30 -07:00
|
|
|
# Recursive function that returns an array of {Formula} without
|
|
|
|
# {Formula} dependents that weren't installed on request.
|
|
|
|
# @private
|
2023-04-26 09:13:00 -07:00
|
|
|
sig { params(formulae: T::Array[Formula]).returns(T::Array[Formula]) }
|
2023-04-26 09:10:30 -07:00
|
|
|
def unused_formulae_with_no_formula_dependents(formulae)
|
2024-06-14 17:26:28 +01:00
|
|
|
unused_formulae = bottled_formulae_with_no_formula_dependents(formulae).reject do |f|
|
2024-04-28 03:23:21 +02:00
|
|
|
f.any_installed_keg&.tab&.installed_on_request
|
2023-04-26 09:10:30 -07:00
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
|
2023-04-26 09:10:30 -07:00
|
|
|
unless unused_formulae.empty?
|
|
|
|
unused_formulae += unused_formulae_with_no_formula_dependents(formulae - unused_formulae)
|
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
|
2023-04-26 09:10:30 -07:00
|
|
|
unused_formulae
|
|
|
|
end
|
2022-09-13 23:23:48 -07:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|