From 20557927913cf429df274eee761b4ad5d0d4434f Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Mon, 6 Feb 2023 13:06:11 +0000 Subject: [PATCH] Better support source builds under API mode --- Library/Homebrew/formula.rb | 7 +++++- Library/Homebrew/formula_installer.rb | 14 +++++------- Library/Homebrew/formulary.rb | 32 +++++++++++++++++---------- Library/Homebrew/install.rb | 9 -------- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 14ab1e31de..18e34c6cf3 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1954,6 +1954,11 @@ class Formula ohai "#{verb} #{name} from #{tap}" end + # @private + def tap_git_head + tap&.git_head + end + # @private delegate env: :"self.class" @@ -2125,7 +2130,7 @@ class Formula "disabled" => disabled?, "disable_date" => disable_date, "disable_reason" => disable_reason, - "tap_git_head" => tap&.git_head, + "tap_git_head" => tap_git_head, } if stable diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index a8a78cf868..b479a7e8e9 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -1181,14 +1181,12 @@ class FormulaInstaller if pour_bottle?(output_warning: true) formula.fetch_bottle_tab - elsif formula.core_formula? && !formula.tap.installed? && Homebrew::EnvConfig.install_from_api? - odie <<~EOS - Unable to build #{formula.name} from source while Homebrew/homebrew-core is - untapped and HOMEBREW_NO_INSTALL_FROM_API is unset! To resolve please run: - export HOMEBREW_NO_INSTALL_FROM_API=1 - brew tap Homebrew/core - and retry. - EOS + elsif formula.core_formula? && Homebrew::EnvConfig.install_from_api? + url = "https://raw.githubusercontent.com/#{formula.tap.full_name}/#{formula.tap_git_head}/Formula/#{formula.name}.rb" + @formula = Formulary.factory(url, formula.active_spec_sym, + alias_path: formula.alias_path, + flags: formula.class.build_flags, + from: :formula_installer) else formula.fetch_patches formula.resources.each(&:fetch) diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 2d7d103e3c..b0b7605617 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -220,6 +220,11 @@ module Formulary def caveats self.class.instance_variable_get(:@caveats_string) 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 klass.loaded_from_api = true @@ -395,24 +400,27 @@ module Formulary attr_reader :url - sig { params(url: T.any(URI::Generic, String)).void } - def initialize(url) + sig { params(url: T.any(URI::Generic, String), from: T.nilable(Symbol)).void } + def initialize(url, from: nil) @url = url + @from = from uri = URI(url) formula = File.basename(uri.path, ".rb") super formula, HOMEBREW_CACHE_FORMULA/File.basename(uri.path) end def load_file(flags:, ignore_errors:) - if %r{githubusercontent.com/[\w-]+/[\w-]+/[a-f0-9]{40}(?:/Formula)?/(?[\w+-.@]+).rb} =~ url - raise UnsupportedInstallationMethod, - "Installation of #{formula_name} from a GitHub commit URL is unsupported! " \ - "`brew extract #{formula_name}` to a stable tap on GitHub instead." - elsif url.match?(%r{^(https?|ftp)://}) - raise UnsupportedInstallationMethod, - "Non-checksummed download of #{name} formula file from an arbitrary URL is unsupported! " \ - "`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap " \ - "on GitHub instead." + if @from != :formula_installer + if %r{githubusercontent.com/[\w-]+/[\w-]+/[a-f0-9]{40}(?:/Formula)?/(?[\w+-.@]+).rb} =~ url + raise UnsupportedInstallationMethod, + "Installation of #{formula_name} from a GitHub commit URL is unsupported! " \ + "`brew extract #{formula_name}` to a stable tap on GitHub instead." + elsif url.match?(%r{^(https?|ftp)://}) + raise UnsupportedInstallationMethod, + "Non-checksummed download of #{name} formula file from an arbitrary URL is unsupported! " \ + "`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap " \ + "on GitHub instead." + end end HOMEBREW_CACHE_FORMULA.mkpath FileUtils.rm_f(path) @@ -664,7 +672,7 @@ module Formulary when HOMEBREW_BOTTLES_EXTNAME_REGEX return BottleLoader.new(ref) when URL_START_REGEX - return FromUrlLoader.new(ref) + return FromUrlLoader.new(ref, from: from) when HOMEBREW_TAP_FORMULA_REGEX if ref.start_with?("homebrew/core/") && Homebrew::EnvConfig.install_from_api? name = ref.split("/", 3).last diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 62d1a594f7..86e0f7c5b6 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -113,15 +113,6 @@ module Homebrew EOS 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 odie "No head is defined for #{f.full_name}" if head && f.head.nil?