Better support source builds under API mode

This commit is contained in:
Bo Anderson 2023-02-06 13:06:11 +00:00
parent 33681f90e3
commit 2055792791
No known key found for this signature in database
GPG Key ID: 3DB94E204E137D65
4 changed files with 32 additions and 30 deletions

View File

@ -1954,6 +1954,11 @@ class Formula
ohai "#{verb} #{name} from #{tap}" ohai "#{verb} #{name} from #{tap}"
end end
# @private
def tap_git_head
tap&.git_head
end
# @private # @private
delegate env: :"self.class" delegate env: :"self.class"
@ -2125,7 +2130,7 @@ class Formula
"disabled" => disabled?, "disabled" => disabled?,
"disable_date" => disable_date, "disable_date" => disable_date,
"disable_reason" => disable_reason, "disable_reason" => disable_reason,
"tap_git_head" => tap&.git_head, "tap_git_head" => tap_git_head,
} }
if stable if stable

View File

@ -1181,14 +1181,12 @@ class FormulaInstaller
if pour_bottle?(output_warning: true) if pour_bottle?(output_warning: true)
formula.fetch_bottle_tab formula.fetch_bottle_tab
elsif formula.core_formula? && !formula.tap.installed? && Homebrew::EnvConfig.install_from_api? elsif formula.core_formula? && Homebrew::EnvConfig.install_from_api?
odie <<~EOS url = "https://raw.githubusercontent.com/#{formula.tap.full_name}/#{formula.tap_git_head}/Formula/#{formula.name}.rb"
Unable to build #{formula.name} from source while Homebrew/homebrew-core is @formula = Formulary.factory(url, formula.active_spec_sym,
untapped and HOMEBREW_NO_INSTALL_FROM_API is unset! To resolve please run: alias_path: formula.alias_path,
export HOMEBREW_NO_INSTALL_FROM_API=1 flags: formula.class.build_flags,
brew tap Homebrew/core from: :formula_installer)
and retry.
EOS
else else
formula.fetch_patches formula.fetch_patches
formula.resources.each(&:fetch) formula.resources.each(&:fetch)

View File

@ -220,6 +220,11 @@ module Formulary
def caveats def caveats
self.class.instance_variable_get(:@caveats_string) self.class.instance_variable_get(:@caveats_string)
end end
@tap_git_head_string = json_formula["tap_git_head"]
def tap_git_head
self.class.instance_variable_get(:@tap_git_head_string)
end
end end
klass.loaded_from_api = true klass.loaded_from_api = true
@ -395,24 +400,27 @@ module Formulary
attr_reader :url attr_reader :url
sig { params(url: T.any(URI::Generic, String)).void } sig { params(url: T.any(URI::Generic, String), from: T.nilable(Symbol)).void }
def initialize(url) def initialize(url, from: nil)
@url = url @url = url
@from = from
uri = URI(url) uri = URI(url)
formula = File.basename(uri.path, ".rb") formula = File.basename(uri.path, ".rb")
super formula, HOMEBREW_CACHE_FORMULA/File.basename(uri.path) super formula, HOMEBREW_CACHE_FORMULA/File.basename(uri.path)
end end
def load_file(flags:, ignore_errors:) def load_file(flags:, ignore_errors:)
if %r{githubusercontent.com/[\w-]+/[\w-]+/[a-f0-9]{40}(?:/Formula)?/(?<formula_name>[\w+-.@]+).rb} =~ url if @from != :formula_installer
raise UnsupportedInstallationMethod, if %r{githubusercontent.com/[\w-]+/[\w-]+/[a-f0-9]{40}(?:/Formula)?/(?<formula_name>[\w+-.@]+).rb} =~ url
"Installation of #{formula_name} from a GitHub commit URL is unsupported! " \ raise UnsupportedInstallationMethod,
"`brew extract #{formula_name}` to a stable tap on GitHub instead." "Installation of #{formula_name} from a GitHub commit URL is unsupported! " \
elsif url.match?(%r{^(https?|ftp)://}) "`brew extract #{formula_name}` to a stable tap on GitHub instead."
raise UnsupportedInstallationMethod, elsif url.match?(%r{^(https?|ftp)://})
"Non-checksummed download of #{name} formula file from an arbitrary URL is unsupported! " \ raise UnsupportedInstallationMethod,
"`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap " \ "Non-checksummed download of #{name} formula file from an arbitrary URL is unsupported! " \
"on GitHub instead." "`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap " \
"on GitHub instead."
end
end end
HOMEBREW_CACHE_FORMULA.mkpath HOMEBREW_CACHE_FORMULA.mkpath
FileUtils.rm_f(path) FileUtils.rm_f(path)
@ -664,7 +672,7 @@ module Formulary
when HOMEBREW_BOTTLES_EXTNAME_REGEX when HOMEBREW_BOTTLES_EXTNAME_REGEX
return BottleLoader.new(ref) return BottleLoader.new(ref)
when URL_START_REGEX when URL_START_REGEX
return FromUrlLoader.new(ref) return FromUrlLoader.new(ref, from: from)
when HOMEBREW_TAP_FORMULA_REGEX when HOMEBREW_TAP_FORMULA_REGEX
if ref.start_with?("homebrew/core/") && Homebrew::EnvConfig.install_from_api? if ref.start_with?("homebrew/core/") && Homebrew::EnvConfig.install_from_api?
name = ref.split("/", 3).last name = ref.split("/", 3).last

View File

@ -113,15 +113,6 @@ module Homebrew
EOS EOS
end end
if head && Homebrew::EnvConfig.install_from_api?
raise UsageError, <<~EOS
--HEAD is not supported with HOMEBREW_NO_INSTALL_FROM_API unset! To resolve please run:
export HOMEBREW_NO_INSTALL_FROM_API=1
brew tap Homebrew/core
and retry this command.
EOS
end
# --HEAD, fail with no head defined # --HEAD, fail with no head defined
odie "No head is defined for #{f.full_name}" if head && f.head.nil? odie "No head is defined for #{f.full_name}" if head && f.head.nil?