From f60612e6b27215a738ba1104fb25545933682be2 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Mon, 15 May 2023 13:58:33 +0200 Subject: [PATCH] Add `Formula#loaded_from_api?`. --- Library/Homebrew/formula.rb | 11 +++++++++-- Library/Homebrew/formula.rbi | 2 ++ Library/Homebrew/formula_installer.rb | 4 ++-- Library/Homebrew/formulary.rb | 7 ++++--- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 0666cd674b8cb..1d3e93ed00c38 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -427,6 +427,12 @@ def bottle_for_tag(tag = nil) # @see .version delegate version: :active_spec + # Whether this formula was loaded using the formulae.brew.sh API + # @!method loaded_from_api? + # @private + # @see .loaded_from_api? + delegate loaded_from_api?: :"self.class" + def update_head_version return unless head? return unless head.downloader.is_a?(VCSDownloadStrategy) @@ -2238,7 +2244,7 @@ def to_hash_with_variations hash = to_hash # Take from API, merging in local install status. - if self.class.loaded_from_api && !Homebrew::EnvConfig.no_install_from_api? + if loaded_from_api? && !Homebrew::EnvConfig.no_install_from_api? json_formula = Homebrew::API::Formula.all_formulae[name].dup return json_formula.merge( hash.slice("name", "installed", "linked_keg", "pinned", "outdated"), @@ -2758,6 +2764,7 @@ def inherited(child) @skip_clean_paths = Set.new @link_overwrite_paths = Set.new @allowed_missing_libraries = Set.new + @loaded_from_api = false end end @@ -2784,7 +2791,7 @@ def freeze # Whether this formula was loaded using the formulae.brew.sh API # @private - attr_accessor :loaded_from_api + attr_predicate :loaded_from_api? # Whether this formula contains OS/arch-specific blocks # (e.g. `on_macos`, `on_arm`, `on_monterey :or_older`, `on_system :linux, macos: :big_sur_or_newer`). diff --git a/Library/Homebrew/formula.rbi b/Library/Homebrew/formula.rbi index 5c23af84c9b29..0278a02daac63 100644 --- a/Library/Homebrew/formula.rbi +++ b/Library/Homebrew/formula.rbi @@ -3,6 +3,8 @@ # This file provides definitions for Forwardable#delegate, which is currently not supported by Sorbet. class Formula + sig { returns(T::Boolean) } + def loaded_from_api?; end def bottle_defined?; end def bottle_tag?(tag = nil); end def bottled?(tag = nil); end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 490be08d4ce55..03325f26b6a94 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -1191,7 +1191,7 @@ def fetch if pour_bottle?(output_warning: true) formula.fetch_bottle_tab else - @formula = Homebrew::API::Formula.source_download(formula) if formula.class.loaded_from_api + @formula = Homebrew::API::Formula.source_download(formula) if formula.loaded_from_api? formula.fetch_patches formula.resources.each(&:fetch) @@ -1227,7 +1227,7 @@ def pour tab.unused_options = [] tab.built_as_bottle = true tab.poured_from_bottle = true - tab.loaded_from_api = formula.class.loaded_from_api + tab.loaded_from_api = formula.loaded_from_api? tab.installed_as_dependency = installed_as_dependency? tab.installed_on_request = installed_on_request? tab.time = Time.now.to_i diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 8f8fb9d54a502..f4ebad35a49ed 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -136,7 +136,7 @@ def self.load_formula_from_api(name, flags:) mod.const_set(:BUILD_FLAGS, flags) - class_s = Formulary.class_s(name) + class_name = class_s(name) json_formula = Homebrew::API::Formula.all_formulae[name] json_formula = Homebrew::API.merge_variations(json_formula) @@ -147,6 +147,8 @@ def self.load_formula_from_api(name, flags:) end klass = Class.new(::Formula) do + @loaded_from_api = true + desc json_formula["desc"] homepage json_formula["homepage"] license SPDX.string_to_license_expression(json_formula["license"]) @@ -311,8 +313,7 @@ def ruby_source_checksum end end - T.cast(klass, T.class_of(Formula)).loaded_from_api = true - mod.const_set(class_s, klass) + mod.const_set(class_name, klass) cache[:api] ||= {} cache[:api][name] = klass