Merge pull request #18290 from Homebrew/strict-formula-installer
Enable strict typing in FormulaInstaller
This commit is contained in:
commit
5b0a84bc7a
@ -1,4 +1,4 @@
|
|||||||
# typed: true # rubocop:todo Sorbet/StrictSigil
|
# typed: strict
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "formula"
|
require "formula"
|
||||||
@ -31,9 +31,19 @@ class FormulaInstaller
|
|||||||
include FormulaCellarChecks
|
include FormulaCellarChecks
|
||||||
extend Attrable
|
extend Attrable
|
||||||
|
|
||||||
attr_reader :formula, :bottle_tab_runtime_dependencies
|
ETC_VAR_DIRS = T.let([HOMEBREW_PREFIX/"etc", HOMEBREW_PREFIX/"var"].freeze, T::Array[Pathname])
|
||||||
|
|
||||||
attr_accessor :options, :link_keg
|
sig { override.returns(Formula) }
|
||||||
|
attr_reader :formula
|
||||||
|
|
||||||
|
sig { returns(T::Hash[String, T::Hash[String, String]]) }
|
||||||
|
attr_reader :bottle_tab_runtime_dependencies
|
||||||
|
|
||||||
|
sig { returns(Options) }
|
||||||
|
attr_accessor :options
|
||||||
|
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
|
attr_accessor :link_keg
|
||||||
|
|
||||||
attr_predicate :installed_as_dependency?, :installed_on_request?
|
attr_predicate :installed_as_dependency?, :installed_on_request?
|
||||||
attr_predicate :show_summary_heading?, :show_header?
|
attr_predicate :show_summary_heading?, :show_header?
|
||||||
@ -41,6 +51,35 @@ class FormulaInstaller
|
|||||||
attr_predicate :debug_symbols?
|
attr_predicate :debug_symbols?
|
||||||
attr_predicate :verbose?, :debug?, :quiet?
|
attr_predicate :verbose?, :debug?, :quiet?
|
||||||
|
|
||||||
|
sig {
|
||||||
|
params(
|
||||||
|
formula: Formula,
|
||||||
|
link_keg: T::Boolean,
|
||||||
|
installed_as_dependency: T::Boolean,
|
||||||
|
installed_on_request: T::Boolean,
|
||||||
|
show_header: T::Boolean,
|
||||||
|
build_bottle: T::Boolean,
|
||||||
|
skip_post_install: T::Boolean,
|
||||||
|
force_bottle: T::Boolean,
|
||||||
|
bottle_arch: T.nilable(String),
|
||||||
|
ignore_deps: T::Boolean,
|
||||||
|
only_deps: T::Boolean,
|
||||||
|
include_test_formulae: T::Array[Formula],
|
||||||
|
build_from_source_formulae: T::Array[Formula],
|
||||||
|
env: T.nilable(String),
|
||||||
|
git: T::Boolean,
|
||||||
|
interactive: T::Boolean,
|
||||||
|
keep_tmp: T::Boolean,
|
||||||
|
debug_symbols: T::Boolean,
|
||||||
|
cc: T.nilable(String),
|
||||||
|
options: Options,
|
||||||
|
force: T::Boolean,
|
||||||
|
overwrite: T::Boolean,
|
||||||
|
debug: T::Boolean,
|
||||||
|
quiet: T::Boolean,
|
||||||
|
verbose: T::Boolean,
|
||||||
|
).void
|
||||||
|
}
|
||||||
def initialize(
|
def initialize(
|
||||||
formula,
|
formula,
|
||||||
link_keg: false,
|
link_keg: false,
|
||||||
@ -74,7 +113,7 @@ class FormulaInstaller
|
|||||||
@overwrite = overwrite
|
@overwrite = overwrite
|
||||||
@keep_tmp = keep_tmp
|
@keep_tmp = keep_tmp
|
||||||
@debug_symbols = debug_symbols
|
@debug_symbols = debug_symbols
|
||||||
@link_keg = !formula.keg_only? || link_keg
|
@link_keg = T.let(!formula.keg_only? || link_keg, T::Boolean)
|
||||||
@show_header = show_header
|
@show_header = show_header
|
||||||
@ignore_deps = ignore_deps
|
@ignore_deps = ignore_deps
|
||||||
@only_deps = only_deps
|
@only_deps = only_deps
|
||||||
@ -83,7 +122,7 @@ class FormulaInstaller
|
|||||||
@skip_post_install = skip_post_install
|
@skip_post_install = skip_post_install
|
||||||
@bottle_arch = bottle_arch
|
@bottle_arch = bottle_arch
|
||||||
@formula.force_bottle ||= force_bottle
|
@formula.force_bottle ||= force_bottle
|
||||||
@force_bottle = @formula.force_bottle
|
@force_bottle = T.let(@formula.force_bottle, T::Boolean)
|
||||||
@include_test_formulae = include_test_formulae
|
@include_test_formulae = include_test_formulae
|
||||||
@interactive = interactive
|
@interactive = interactive
|
||||||
@git = git
|
@git = git
|
||||||
@ -94,40 +133,46 @@ class FormulaInstaller
|
|||||||
@installed_as_dependency = installed_as_dependency
|
@installed_as_dependency = installed_as_dependency
|
||||||
@installed_on_request = installed_on_request
|
@installed_on_request = installed_on_request
|
||||||
@options = options
|
@options = options
|
||||||
@requirement_messages = []
|
@requirement_messages = T.let([], T::Array[String])
|
||||||
@poured_bottle = false
|
@poured_bottle = T.let(false, T::Boolean)
|
||||||
@start_time = nil
|
@start_time = T.let(nil, T.nilable(Time))
|
||||||
@bottle_tab_runtime_dependencies = {}.freeze
|
@bottle_tab_runtime_dependencies = T.let({}.freeze, T::Hash[String, T::Hash[String, String]])
|
||||||
|
@hold_locks = T.let(false, T::Boolean)
|
||||||
|
@show_summary_heading = T.let(false, T::Boolean)
|
||||||
|
@etc_var_preinstall = T.let([], T::Array[Pathname])
|
||||||
|
|
||||||
# Take the original formula instance, which might have been swapped from an API instance to a source instance
|
# Take the original formula instance, which might have been swapped from an API instance to a source instance
|
||||||
@formula = previously_fetched_formula if previously_fetched_formula
|
@formula = T.let(T.must(previously_fetched_formula), Formula) if previously_fetched_formula
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Set[Formula]) }
|
||||||
def self.attempted
|
def self.attempted
|
||||||
@attempted ||= Set.new
|
@attempted ||= T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def self.clear_attempted
|
def self.clear_attempted
|
||||||
@attempted = Set.new
|
@attempted = T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Set[Formula]) }
|
||||||
def self.installed
|
def self.installed
|
||||||
@installed ||= Set.new
|
@installed ||= T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def self.clear_installed
|
def self.clear_installed
|
||||||
@installed = Set.new
|
@installed = T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Set[Formula]) }
|
||||||
def self.fetched
|
def self.fetched
|
||||||
@fetched ||= Set.new
|
@fetched ||= T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def self.clear_fetched
|
def self.clear_fetched
|
||||||
@fetched = Set.new
|
@fetched = T.let(Set.new, T.nilable(T::Set[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { returns(T::Boolean) }
|
sig { returns(T::Boolean) }
|
||||||
@ -241,10 +286,12 @@ class FormulaInstaller
|
|||||||
raise
|
raise
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def check_installation_already_attempted
|
def check_installation_already_attempted
|
||||||
raise FormulaInstallationAlreadyAttemptedError, formula if self.class.attempted.include?(formula)
|
raise FormulaInstallationAlreadyAttemptedError, formula if self.class.attempted.include?(formula)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def check_install_sanity
|
def check_install_sanity
|
||||||
check_installation_already_attempted
|
check_installation_already_attempted
|
||||||
|
|
||||||
@ -351,9 +398,7 @@ class FormulaInstaller
|
|||||||
end
|
end
|
||||||
|
|
||||||
sig { params(_formula: Formula).returns(T.nilable(T::Boolean)) }
|
sig { params(_formula: Formula).returns(T.nilable(T::Boolean)) }
|
||||||
def fresh_install?(_formula)
|
def fresh_install?(_formula) = false
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def install_fetch_deps
|
def install_fetch_deps
|
||||||
@ -368,14 +413,15 @@ class FormulaInstaller
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def build_bottle_preinstall
|
def build_bottle_preinstall
|
||||||
@etc_var_dirs ||= [HOMEBREW_PREFIX/"etc", HOMEBREW_PREFIX/"var"]
|
@etc_var_preinstall = Find.find(*ETC_VAR_DIRS.select(&:directory?)).to_a
|
||||||
@etc_var_preinstall = Find.find(*@etc_var_dirs.select(&:directory?)).to_a
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def build_bottle_postinstall
|
def build_bottle_postinstall
|
||||||
@etc_var_postinstall = Find.find(*@etc_var_dirs.select(&:directory?)).to_a
|
etc_var_postinstall = Find.find(*ETC_VAR_DIRS.select(&:directory?)).to_a
|
||||||
(@etc_var_postinstall - @etc_var_preinstall).each do |file|
|
(etc_var_postinstall - @etc_var_preinstall).each do |file|
|
||||||
Pathname.new(file).cp_path_sub(HOMEBREW_PREFIX, formula.bottle_prefix)
|
Pathname.new(file).cp_path_sub(HOMEBREW_PREFIX, formula.bottle_prefix)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -485,6 +531,7 @@ on_request: installed_on_request?, options:)
|
|||||||
Homebrew.messages.package_installed(formula.name, end_time - start_time)
|
Homebrew.messages.package_installed(formula.name, end_time - start_time)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def check_conflicts
|
def check_conflicts
|
||||||
return if force?
|
return if force?
|
||||||
|
|
||||||
@ -517,8 +564,9 @@ on_request: installed_on_request?, options:)
|
|||||||
|
|
||||||
# Compute and collect the dependencies needed by the formula currently
|
# Compute and collect the dependencies needed by the formula currently
|
||||||
# being installed.
|
# being installed.
|
||||||
|
sig { params(use_cache: T::Boolean).returns(T::Array[[Dependency, Options]]) }
|
||||||
def compute_dependencies(use_cache: true)
|
def compute_dependencies(use_cache: true)
|
||||||
@compute_dependencies = nil unless use_cache
|
@compute_dependencies = T.let(nil, T.nilable(T::Array[[Dependency, Options]])) unless use_cache
|
||||||
@compute_dependencies ||= begin
|
@compute_dependencies ||= begin
|
||||||
# Needs to be done before expand_dependencies
|
# Needs to be done before expand_dependencies
|
||||||
fetch_bottle_tab if pour_bottle?
|
fetch_bottle_tab if pour_bottle?
|
||||||
@ -528,6 +576,7 @@ on_request: installed_on_request?, options:)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(deps: T::Array[[Dependency, Options]]).returns(T::Array[Formula]) }
|
||||||
def unbottled_dependencies(deps)
|
def unbottled_dependencies(deps)
|
||||||
deps.map { |(dep, _options)| dep.to_formula }.reject do |dep_f|
|
deps.map { |(dep, _options)| dep.to_formula }.reject do |dep_f|
|
||||||
next false unless dep_f.pour_bottle?
|
next false unless dep_f.pour_bottle?
|
||||||
@ -536,18 +585,20 @@ on_request: installed_on_request?, options:)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def compute_and_install_dependencies
|
def compute_and_install_dependencies
|
||||||
deps = compute_dependencies
|
deps = compute_dependencies
|
||||||
install_dependencies(deps)
|
install_dependencies(deps)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(req_map: T::Hash[Formula, T::Array[Requirement]]).void }
|
||||||
def check_requirements(req_map)
|
def check_requirements(req_map)
|
||||||
@requirement_messages = []
|
@requirement_messages = []
|
||||||
fatals = []
|
fatals = []
|
||||||
|
|
||||||
req_map.each_pair do |dependent, reqs|
|
req_map.each_pair do |dependent, reqs|
|
||||||
reqs.each do |req|
|
reqs.each do |req|
|
||||||
next if dependent.latest_version_installed? && req.name == "macos" && req.comparator == "<="
|
next if dependent.latest_version_installed? && req.is_a?(MacOSRequirement) && req.comparator == "<="
|
||||||
|
|
||||||
@requirement_messages << "#{dependent}: #{req.message}"
|
@requirement_messages << "#{dependent}: #{req.message}"
|
||||||
fatals << req if req.fatal?
|
fatals << req if req.fatal?
|
||||||
@ -560,6 +611,7 @@ on_request: installed_on_request?, options:)
|
|||||||
raise UnsatisfiedRequirements, fatals
|
raise UnsatisfiedRequirements, fatals
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(formula: Formula).returns(T::Array[Requirement]) }
|
||||||
def runtime_requirements(formula)
|
def runtime_requirements(formula)
|
||||||
runtime_deps = formula.runtime_formula_dependencies(undeclared: false)
|
runtime_deps = formula.runtime_formula_dependencies(undeclared: false)
|
||||||
recursive_requirements = formula.recursive_requirements do |dependent, _|
|
recursive_requirements = formula.recursive_requirements do |dependent, _|
|
||||||
@ -568,6 +620,7 @@ on_request: installed_on_request?, options:)
|
|||||||
(recursive_requirements.to_a + formula.requirements.to_a).reject(&:build?).uniq
|
(recursive_requirements.to_a + formula.requirements.to_a).reject(&:build?).uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Hash[Formula, T::Array[Requirement]]) }
|
||||||
def expand_requirements
|
def expand_requirements
|
||||||
unsatisfied_reqs = Hash.new { |h, k| h[k] = [] }
|
unsatisfied_reqs = Hash.new { |h, k| h[k] = [] }
|
||||||
formulae = [formula]
|
formulae = [formula]
|
||||||
@ -600,6 +653,7 @@ on_request: installed_on_request?, options:)
|
|||||||
unsatisfied_reqs
|
unsatisfied_reqs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(formula: Formula, inherited_options: T::Hash[String, Options]).returns(T::Array[Dependency]) }
|
||||||
def expand_dependencies_for_formula(formula, inherited_options)
|
def expand_dependencies_for_formula(formula, inherited_options)
|
||||||
# Cache for this expansion only. FormulaInstaller has a lot of inputs which can alter expansion.
|
# Cache for this expansion only. FormulaInstaller has a lot of inputs which can alter expansion.
|
||||||
cache_key = "FormulaInstaller-#{formula.full_name}-#{Time.now.to_f}"
|
cache_key = "FormulaInstaller-#{formula.full_name}-#{Time.now.to_f}"
|
||||||
@ -607,7 +661,7 @@ on_request: installed_on_request?, options:)
|
|||||||
inherited_options[dep.name] |= inherited_options_for(dep)
|
inherited_options[dep.name] |= inherited_options_for(dep)
|
||||||
build = effective_build_options_for(
|
build = effective_build_options_for(
|
||||||
dependent,
|
dependent,
|
||||||
inherited_options.fetch(dependent.name, []),
|
inherited_options.fetch(dependent.name, Options.new),
|
||||||
)
|
)
|
||||||
|
|
||||||
keep_build_test = false
|
keep_build_test = false
|
||||||
@ -628,6 +682,7 @@ on_request: installed_on_request?, options:)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Array[[Dependency, Options]]) }
|
||||||
def expand_dependencies
|
def expand_dependencies
|
||||||
inherited_options = Hash.new { |hash, key| hash[key] = Options.new }
|
inherited_options = Hash.new { |hash, key| hash[key] = Options.new }
|
||||||
|
|
||||||
@ -636,7 +691,8 @@ on_request: installed_on_request?, options:)
|
|||||||
expanded_deps.map { |dep| [dep, inherited_options[dep.name]] }
|
expanded_deps.map { |dep| [dep, inherited_options[dep.name]] }
|
||||||
end
|
end
|
||||||
|
|
||||||
def effective_build_options_for(dependent, inherited_options = [])
|
sig { params(dependent: Formula, inherited_options: Options).returns(BuildOptions) }
|
||||||
|
def effective_build_options_for(dependent, inherited_options = Options.new)
|
||||||
args = dependent.build.used_options
|
args = dependent.build.used_options
|
||||||
args |= (dependent == formula) ? options : inherited_options
|
args |= (dependent == formula) ? options : inherited_options
|
||||||
args |= Tab.for_formula(dependent).used_options
|
args |= Tab.for_formula(dependent).used_options
|
||||||
@ -644,6 +700,7 @@ on_request: installed_on_request?, options:)
|
|||||||
BuildOptions.new(args, dependent.options)
|
BuildOptions.new(args, dependent.options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(formula: Formula).returns(T::Array[String]) }
|
||||||
def display_options(formula)
|
def display_options(formula)
|
||||||
options = if formula.head?
|
options = if formula.head?
|
||||||
["--HEAD"]
|
["--HEAD"]
|
||||||
@ -713,6 +770,8 @@ on_request: installed_on_request?, options:)
|
|||||||
keg_had_linked_keg = true
|
keg_had_linked_keg = true
|
||||||
keg_was_linked = linked_keg.linked?
|
keg_was_linked = linked_keg.linked?
|
||||||
linked_keg.unlink
|
linked_keg.unlink
|
||||||
|
else
|
||||||
|
keg_had_linked_keg = false
|
||||||
end
|
end
|
||||||
|
|
||||||
if df.latest_version_installed?
|
if df.latest_version_installed?
|
||||||
@ -739,7 +798,7 @@ on_request: installed_on_request?, options:)
|
|||||||
fi = FormulaInstaller.new(
|
fi = FormulaInstaller.new(
|
||||||
df,
|
df,
|
||||||
options:,
|
options:,
|
||||||
link_keg: keg_had_linked_keg ? keg_was_linked : nil,
|
link_keg: keg_had_linked_keg && keg_was_linked,
|
||||||
installed_as_dependency: true,
|
installed_as_dependency: true,
|
||||||
installed_on_request: df.any_version_installed? && tab.present? && tab.installed_on_request,
|
installed_on_request: df.any_version_installed? && tab.present? && tab.installed_on_request,
|
||||||
force_bottle: false,
|
force_bottle: false,
|
||||||
@ -842,14 +901,14 @@ on_request: installed_on_request?, options:)
|
|||||||
# use installed ca-certificates when it's needed and available
|
# use installed ca-certificates when it's needed and available
|
||||||
if formula.name == "ca-certificates" &&
|
if formula.name == "ca-certificates" &&
|
||||||
!DevelopmentTools.ca_file_handles_most_https_certificates?
|
!DevelopmentTools.ca_file_handles_most_https_certificates?
|
||||||
ENV["SSL_CERT_FILE"] = ENV["GIT_SSL_CAINFO"] = formula.pkgetc/"cert.pem"
|
ENV["SSL_CERT_FILE"] = ENV["GIT_SSL_CAINFO"] = (formula.pkgetc/"cert.pem").to_s
|
||||||
ENV["GIT_SSL_CAPATH"] = formula.pkgetc
|
ENV["GIT_SSL_CAPATH"] = formula.pkgetc.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
# use installed curl when it's needed and available
|
# use installed curl when it's needed and available
|
||||||
if formula.name == "curl" &&
|
if formula.name == "curl" &&
|
||||||
!DevelopmentTools.curl_handles_most_https_certificates?
|
!DevelopmentTools.curl_handles_most_https_certificates?
|
||||||
ENV["HOMEBREW_CURL"] = formula.opt_bin/"curl"
|
ENV["HOMEBREW_CURL"] = (formula.opt_bin/"curl").to_s
|
||||||
Utils::Curl.clear_path_cache
|
Utils::Curl.clear_path_cache
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -872,8 +931,9 @@ on_request: installed_on_request?, options:)
|
|||||||
s.freeze
|
s.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(Float)) }
|
||||||
def build_time
|
def build_time
|
||||||
@build_time ||= Time.now - @start_time if @start_time && !interactive?
|
@build_time ||= T.let(Time.now - @start_time, T.nilable(Float)) if @start_time && !interactive?
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { returns(T::Array[String]) }
|
sig { returns(T::Array[String]) }
|
||||||
@ -910,9 +970,7 @@ on_request: installed_on_request?, options:)
|
|||||||
end
|
end
|
||||||
|
|
||||||
sig { returns(T::Array[String]) }
|
sig { returns(T::Array[String]) }
|
||||||
def build_argv
|
def build_argv = sanitized_argv_options + options.as_flags
|
||||||
sanitized_argv_options + options.as_flags
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def build
|
def build
|
||||||
@ -1224,16 +1282,18 @@ on_request: installed_on_request?, options:)
|
|||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def fetch_bottle_tab
|
def fetch_bottle_tab
|
||||||
@fetch_bottle_tab ||= begin
|
return if @fetch_bottle_tab
|
||||||
|
|
||||||
|
begin
|
||||||
formula.fetch_bottle_tab
|
formula.fetch_bottle_tab
|
||||||
@bottle_tab_runtime_dependencies = formula.bottle_tab_attributes
|
@bottle_tab_runtime_dependencies = formula.bottle_tab_attributes
|
||||||
.fetch("runtime_dependencies", []).then { |deps| deps || [] }
|
.fetch("runtime_dependencies", []).then { |deps| deps || [] }
|
||||||
.each_with_object({}) { |dep, h| h[dep["full_name"]] = dep }
|
.each_with_object({}) { |dep, h| h[dep["full_name"]] = dep }
|
||||||
.freeze
|
.freeze
|
||||||
true
|
|
||||||
rescue DownloadError, ArgumentError
|
rescue DownloadError, ArgumentError
|
||||||
@fetch_bottle_tab = true
|
# do nothing
|
||||||
end
|
end
|
||||||
|
@fetch_bottle_tab = T.let(true, T.nilable(TrueClass))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
@ -1259,13 +1319,14 @@ on_request: installed_on_request?, options:)
|
|||||||
self.class.fetched << formula
|
self.class.fetched << formula
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(Downloadable) }
|
||||||
def downloadable
|
def downloadable
|
||||||
if (bottle_path = formula.local_bottle_path)
|
if (bottle_path = formula.local_bottle_path)
|
||||||
Resource::Local.new(bottle_path)
|
Resource::Local.new(bottle_path)
|
||||||
elsif pour_bottle?
|
elsif pour_bottle?
|
||||||
formula.bottle
|
T.must(formula.bottle)
|
||||||
else
|
else
|
||||||
formula.resource
|
T.must(formula.resource)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1281,7 +1342,7 @@ on_request: installed_on_request?, options:)
|
|||||||
formula.local_bottle_path.blank?
|
formula.local_bottle_path.blank?
|
||||||
ohai "Verifying attestation for #{formula.name}"
|
ohai "Verifying attestation for #{formula.name}"
|
||||||
begin
|
begin
|
||||||
Homebrew::Attestation.check_core_attestation formula.bottle
|
Homebrew::Attestation.check_core_attestation T.must(formula.bottle)
|
||||||
rescue Homebrew::Attestation::GhAuthInvalid
|
rescue Homebrew::Attestation::GhAuthInvalid
|
||||||
# Only raise an error if we explicitly opted-in to verification.
|
# Only raise an error if we explicitly opted-in to verification.
|
||||||
raise CannotInstallFormulaError, <<~EOS if Homebrew::EnvConfig.verify_attestations?
|
raise CannotInstallFormulaError, <<~EOS if Homebrew::EnvConfig.verify_attestations?
|
||||||
@ -1343,7 +1404,7 @@ on_request: installed_on_request?, options:)
|
|||||||
tab.time = Time.now.to_i
|
tab.time = Time.now.to_i
|
||||||
tab.aliases = formula.aliases
|
tab.aliases = formula.aliases
|
||||||
tab.arch = Hardware::CPU.arch
|
tab.arch = Hardware::CPU.arch
|
||||||
tab.source["versions"]["stable"] = formula.stable.version&.to_s
|
tab.source["versions"]["stable"] = T.must(formula.stable).version&.to_s
|
||||||
tab.source["versions"]["version_scheme"] = formula.version_scheme
|
tab.source["versions"]["version_scheme"] = formula.version_scheme
|
||||||
tab.source["path"] = formula.specified_path.to_s
|
tab.source["path"] = formula.specified_path.to_s
|
||||||
tab.source["tap_git_head"] = formula.tap&.installed? ? formula.tap&.git_head : nil
|
tab.source["tap_git_head"] = formula.tap&.installed? ? formula.tap&.git_head : nil
|
||||||
@ -1373,6 +1434,7 @@ on_request: installed_on_request?, options:)
|
|||||||
@show_summary_heading = true
|
@show_summary_heading = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def audit_installed
|
def audit_installed
|
||||||
unless formula.keg_only?
|
unless formula.keg_only?
|
||||||
problem_if_output(check_env_path(formula.bin))
|
problem_if_output(check_env_path(formula.bin))
|
||||||
@ -1381,8 +1443,9 @@ on_request: installed_on_request?, options:)
|
|||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Array[Formula]) }
|
||||||
def self.locked
|
def self.locked
|
||||||
@locked ||= []
|
@locked ||= T.let([], T.nilable(T::Array[Formula]))
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
@ -1513,8 +1576,6 @@ on_request: installed_on_request?, options:)
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
attr_predicate :hold_locks?
|
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def lock
|
def lock
|
||||||
return unless self.class.locked.empty?
|
return unless self.class.locked.empty?
|
||||||
@ -1532,15 +1593,15 @@ on_request: installed_on_request?, options:)
|
|||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
def unlock
|
def unlock
|
||||||
return unless hold_locks?
|
return unless @hold_locks
|
||||||
|
|
||||||
self.class.locked.each(&:unlock)
|
self.class.locked.each(&:unlock)
|
||||||
self.class.locked.clear
|
self.class.locked.clear
|
||||||
@hold_locks = false
|
@hold_locks = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def puts_requirement_messages
|
def puts_requirement_messages
|
||||||
return unless @requirement_messages
|
|
||||||
return if @requirement_messages.empty?
|
return if @requirement_messages.empty?
|
||||||
|
|
||||||
$stderr.puts @requirement_messages
|
$stderr.puts @requirement_messages
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user