Rename Utils::BottleAPI to BottleAPI
This commit is contained in:
parent
ca5f6026ed
commit
e316c4f013
104
Library/Homebrew/bottle_api.rb
Normal file
104
Library/Homebrew/bottle_api.rb
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# typed: true
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "github_packages"
|
||||||
|
|
||||||
|
# Helper functions for using the Bottle JSON API.
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
module BottleAPI
|
||||||
|
extend T::Sig
|
||||||
|
|
||||||
|
module_function
|
||||||
|
|
||||||
|
FORMULAE_BREW_SH_BOTTLE_API_DOMAIN = if OS.mac?
|
||||||
|
"https://formulae.brew.sh/api/bottle"
|
||||||
|
else
|
||||||
|
"https://formulae.brew.sh/api/bottle-linux"
|
||||||
|
end.freeze
|
||||||
|
|
||||||
|
FORMULAE_BREW_SH_VERSIONS_API_URL = if OS.mac?
|
||||||
|
"https://formulae.brew.sh/api/versions-formulae.json"
|
||||||
|
else
|
||||||
|
"https://formulae.brew.sh/api/versions-linux.json"
|
||||||
|
end.freeze
|
||||||
|
|
||||||
|
GITHUB_PACKAGES_SHA256_REGEX = %r{#{GitHubPackages::URL_REGEX}.*/blobs/sha256:(?<sha256>\h{64})$}.freeze
|
||||||
|
|
||||||
|
sig { params(name: String).returns(Hash) }
|
||||||
|
def fetch(name)
|
||||||
|
return @cache[name] if @cache.present? && @cache.key?(name)
|
||||||
|
|
||||||
|
api_url = "#{FORMULAE_BREW_SH_BOTTLE_API_DOMAIN}/#{name}.json"
|
||||||
|
output = Utils::Curl.curl_output("--fail", api_url)
|
||||||
|
raise ArgumentError, "No JSON file found at #{Tty.underline}#{api_url}#{Tty.reset}" unless output.success?
|
||||||
|
|
||||||
|
@cache ||= {}
|
||||||
|
@cache[name] = JSON.parse(output.stdout)
|
||||||
|
rescue JSON::ParserError
|
||||||
|
raise ArgumentError, "Invalid JSON file: #{Tty.underline}#{api_url}#{Tty.reset}"
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T.nilable(PkgVersion)) }
|
||||||
|
def latest_pkg_version(name)
|
||||||
|
@formula_versions ||= begin
|
||||||
|
output = Utils::Curl.curl_output("--fail", FORMULAE_BREW_SH_VERSIONS_API_URL)
|
||||||
|
JSON.parse(output.stdout)
|
||||||
|
end
|
||||||
|
|
||||||
|
return unless @formula_versions.key? name
|
||||||
|
|
||||||
|
PkgVersion.new(@formula_versions[name]["version"], @formula_versions[name]["revision"])
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T::Boolean) }
|
||||||
|
def bottle_available?(name)
|
||||||
|
fetch name
|
||||||
|
true
|
||||||
|
rescue ArgumentError
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(name: String).void }
|
||||||
|
def fetch_bottles(name)
|
||||||
|
hash = fetch(name)
|
||||||
|
bottle_tag = Utils::Bottles.tag.to_s
|
||||||
|
|
||||||
|
odie "No bottle available for current OS" unless hash["bottles"].key? bottle_tag
|
||||||
|
|
||||||
|
download_bottle(hash, bottle_tag)
|
||||||
|
|
||||||
|
hash["dependencies"].each do |dep_hash|
|
||||||
|
download_bottle(dep_hash, bottle_tag)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(url: String).returns(T.nilable(String)) }
|
||||||
|
def checksum_from_url(url)
|
||||||
|
match = url.match GITHUB_PACKAGES_SHA256_REGEX
|
||||||
|
return if match.blank?
|
||||||
|
|
||||||
|
match[:sha256]
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(hash: Hash, tag: Symbol).void }
|
||||||
|
def download_bottle(hash, tag)
|
||||||
|
bottle = hash["bottles"][tag]
|
||||||
|
return if bottle.blank?
|
||||||
|
|
||||||
|
sha256 = bottle["sha256"] || checksum_from_url(bottle["url"])
|
||||||
|
bottle_filename = Bottle::Filename.new(hash["name"], hash["pkg_version"], tag, hash["rebuild"])
|
||||||
|
|
||||||
|
resource = Resource.new hash["name"]
|
||||||
|
resource.url bottle["url"]
|
||||||
|
resource.sha256 sha256
|
||||||
|
resource.version hash["pkg_version"]
|
||||||
|
resource.downloader.resolved_basename = bottle_filename
|
||||||
|
|
||||||
|
resource.fetch
|
||||||
|
|
||||||
|
# Map the name of this formula to the local bottle path to allow the
|
||||||
|
# formula to be loaded by passing just the name to `Formulary::factory`.
|
||||||
|
Formulary.map_formula_name_to_local_bottle_path hash["name"], resource.downloader.cached_location
|
||||||
|
end
|
||||||
|
end
|
||||||
5
Library/Homebrew/bottle_api.rbi
Normal file
5
Library/Homebrew/bottle_api.rbi
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# typed: strict
|
||||||
|
|
||||||
|
module BottleAPI
|
||||||
|
include Kernel
|
||||||
|
end
|
||||||
@ -2,7 +2,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "delegate"
|
require "delegate"
|
||||||
|
require "bottle_api"
|
||||||
require "cli/args"
|
require "cli/args"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
@ -124,8 +124,8 @@ module Homebrew
|
|||||||
unreadable_error ||= e
|
unreadable_error ||= e
|
||||||
rescue NoSuchKegError, FormulaUnavailableError => e
|
rescue NoSuchKegError, FormulaUnavailableError => e
|
||||||
if load_from_json && ENV["HOMEBREW_JSON_CORE"].present? && !CoreTap.instance.installed? &&
|
if load_from_json && ENV["HOMEBREW_JSON_CORE"].present? && !CoreTap.instance.installed? &&
|
||||||
Utils::BottleAPI.bottle_available?(name)
|
BottleAPI.bottle_available?(name)
|
||||||
Utils::BottleAPI.fetch_bottles(name)
|
BottleAPI.fetch_bottles(name)
|
||||||
retry
|
retry
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ require "keg"
|
|||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
require "cask/cmd"
|
require "cask/cmd"
|
||||||
require "cask/caskroom"
|
require "cask/caskroom"
|
||||||
|
require "bottle_api"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
@ -100,7 +101,7 @@ module Homebrew
|
|||||||
elsif f.tap.present?
|
elsif f.tap.present?
|
||||||
f.pkg_version.to_s
|
f.pkg_version.to_s
|
||||||
else
|
else
|
||||||
Utils::BottleAPI.latest_pkg_version(f.name)&.to_s || f.pkg_version.to_s
|
BottleAPI.latest_pkg_version(f.name)&.to_s || f.pkg_version.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
outdated_versions = outdated_kegs.group_by { |keg| Formulary.from_keg(keg).full_name }
|
outdated_versions = outdated_kegs.group_by { |keg| Formulary.from_keg(keg).full_name }
|
||||||
|
|||||||
@ -12,6 +12,7 @@ require "cask/cmd"
|
|||||||
require "cask/utils"
|
require "cask/utils"
|
||||||
require "cask/macos"
|
require "cask/macos"
|
||||||
require "upgrade"
|
require "upgrade"
|
||||||
|
require "bottle_api"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
@ -89,9 +90,9 @@ module Homebrew
|
|||||||
formula = Formulary.factory(name)
|
formula = Formulary.factory(name)
|
||||||
next unless formula.any_version_installed?
|
next unless formula.any_version_installed?
|
||||||
next if formula.tap.present?
|
next if formula.tap.present?
|
||||||
next unless Utils::BottleAPI.bottle_available?(name)
|
next unless BottleAPI.bottle_available?(name)
|
||||||
|
|
||||||
Utils::BottleAPI.fetch_bottles(name)
|
BottleAPI.fetch_bottles(name)
|
||||||
rescue FormulaUnavailableError
|
rescue FormulaUnavailableError
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
|
|||||||
@ -8,6 +8,7 @@ require "upgrade"
|
|||||||
require "cask/cmd"
|
require "cask/cmd"
|
||||||
require "cask/utils"
|
require "cask/utils"
|
||||||
require "cask/macos"
|
require "cask/macos"
|
||||||
|
require "bottle_api"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
@ -162,9 +163,9 @@ module Homebrew
|
|||||||
if ENV["HOMEBREW_JSON_CORE"].present? && !CoreTap.instance.installed?
|
if ENV["HOMEBREW_JSON_CORE"].present? && !CoreTap.instance.installed?
|
||||||
formulae_to_install.map! do |formula|
|
formulae_to_install.map! do |formula|
|
||||||
next formula if formula.tap.present?
|
next formula if formula.tap.present?
|
||||||
next formula unless Utils::BottleAPI.bottle_available?(formula.name)
|
next formula unless BottleAPI.bottle_available?(formula.name)
|
||||||
|
|
||||||
Utils::BottleAPI.fetch_bottles(formula.name)
|
BottleAPI.fetch_bottles(formula.name)
|
||||||
Formulary.factory(formula.name)
|
Formulary.factory(formula.name)
|
||||||
rescue FormulaUnavailableError
|
rescue FormulaUnavailableError
|
||||||
formula
|
formula
|
||||||
|
|||||||
@ -29,6 +29,7 @@ require "mktemp"
|
|||||||
require "find"
|
require "find"
|
||||||
require "utils/spdx"
|
require "utils/spdx"
|
||||||
require "extend/on_os"
|
require "extend/on_os"
|
||||||
|
require "bottle_api"
|
||||||
|
|
||||||
# A formula provides instructions and metadata for Homebrew to install a piece
|
# A formula provides instructions and metadata for Homebrew to install a piece
|
||||||
# of software. Every Homebrew formula is a {Formula}.
|
# of software. Every Homebrew formula is a {Formula}.
|
||||||
@ -1328,7 +1329,7 @@ class Formula
|
|||||||
latest_version = if tap.present?
|
latest_version = if tap.present?
|
||||||
pkg_version
|
pkg_version
|
||||||
else
|
else
|
||||||
Utils::BottleAPI.latest_pkg_version(name) || pkg_version
|
BottleAPI.latest_pkg_version(name) || pkg_version
|
||||||
end
|
end
|
||||||
|
|
||||||
installed_kegs.each do |keg|
|
installed_kegs.each do |keg|
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
require "time"
|
require "time"
|
||||||
|
|
||||||
require "utils/analytics"
|
require "utils/analytics"
|
||||||
require "utils/bottle_api"
|
|
||||||
require "utils/curl"
|
require "utils/curl"
|
||||||
require "utils/fork"
|
require "utils/fork"
|
||||||
require "utils/formatter"
|
require "utils/formatter"
|
||||||
|
|||||||
@ -1,106 +0,0 @@
|
|||||||
# typed: true
|
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "github_packages"
|
|
||||||
|
|
||||||
module Utils
|
|
||||||
# Helper functions for using the Bottle JSON API.
|
|
||||||
#
|
|
||||||
# @api private
|
|
||||||
module BottleAPI
|
|
||||||
extend T::Sig
|
|
||||||
|
|
||||||
module_function
|
|
||||||
|
|
||||||
FORMULAE_BREW_SH_BOTTLE_API_DOMAIN = if OS.mac?
|
|
||||||
"https://formulae.brew.sh/api/bottle"
|
|
||||||
else
|
|
||||||
"https://formulae.brew.sh/api/bottle-linux"
|
|
||||||
end.freeze
|
|
||||||
|
|
||||||
FORMULAE_BREW_SH_VERSIONS_API_URL = if OS.mac?
|
|
||||||
"https://formulae.brew.sh/api/versions-formulae.json"
|
|
||||||
else
|
|
||||||
"https://formulae.brew.sh/api/versions-linux.json"
|
|
||||||
end.freeze
|
|
||||||
|
|
||||||
GITHUB_PACKAGES_SHA256_REGEX = %r{#{GitHubPackages::URL_REGEX}.*/blobs/sha256:(?<sha256>\h{64})$}.freeze
|
|
||||||
|
|
||||||
sig { params(name: String).returns(Hash) }
|
|
||||||
def fetch(name)
|
|
||||||
return @cache[name] if @cache.present? && @cache.key?(name)
|
|
||||||
|
|
||||||
api_url = "#{FORMULAE_BREW_SH_BOTTLE_API_DOMAIN}/#{name}.json"
|
|
||||||
output = Utils::Curl.curl_output("--fail", api_url)
|
|
||||||
raise ArgumentError, "No JSON file found at #{Tty.underline}#{api_url}#{Tty.reset}" unless output.success?
|
|
||||||
|
|
||||||
@cache ||= {}
|
|
||||||
@cache[name] = JSON.parse(output.stdout)
|
|
||||||
rescue JSON::ParserError
|
|
||||||
raise ArgumentError, "Invalid JSON file: #{Tty.underline}#{api_url}#{Tty.reset}"
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(name: String).returns(PkgVersion) }
|
|
||||||
def latest_pkg_version(name)
|
|
||||||
@formula_versions ||= begin
|
|
||||||
output = Utils::Curl.curl_output("--fail", FORMULAE_BREW_SH_VERSIONS_API_URL)
|
|
||||||
JSON.parse(output.stdout)
|
|
||||||
end
|
|
||||||
|
|
||||||
return unless @formula_versions.key? name
|
|
||||||
|
|
||||||
PkgVersion.new(@formula_versions[name]["version"], @formula_versions[name]["revision"])
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(name: String).returns(T::Boolean) }
|
|
||||||
def bottle_available?(name)
|
|
||||||
fetch name
|
|
||||||
true
|
|
||||||
rescue ArgumentError
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(name: String).void }
|
|
||||||
def fetch_bottles(name)
|
|
||||||
hash = fetch(name)
|
|
||||||
bottle_tag = Utils::Bottles.tag.to_s
|
|
||||||
|
|
||||||
odie "No bottle available for current OS" unless hash["bottles"].key? bottle_tag
|
|
||||||
|
|
||||||
download_bottle(hash, bottle_tag)
|
|
||||||
|
|
||||||
hash["dependencies"].each do |dep_hash|
|
|
||||||
download_bottle(dep_hash, bottle_tag)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(url: String).returns(T.nilable(String)) }
|
|
||||||
def checksum_from_url(url)
|
|
||||||
match = url.match GITHUB_PACKAGES_SHA256_REGEX
|
|
||||||
return if match.blank?
|
|
||||||
|
|
||||||
match[:sha256]
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(hash: Hash, tag: Symbol).void }
|
|
||||||
def download_bottle(hash, tag)
|
|
||||||
bottle = hash["bottles"][tag]
|
|
||||||
return if bottle.blank?
|
|
||||||
|
|
||||||
sha256 = bottle["sha256"] || checksum_from_url(bottle["url"])
|
|
||||||
bottle_filename = Bottle::Filename.new(hash["name"], hash["pkg_version"], tag, hash["rebuild"])
|
|
||||||
|
|
||||||
resource = Resource.new hash["name"]
|
|
||||||
resource.url bottle["url"]
|
|
||||||
resource.sha256 sha256
|
|
||||||
resource.version hash["pkg_version"]
|
|
||||||
resource.downloader.resolved_basename = bottle_filename
|
|
||||||
|
|
||||||
resource.fetch
|
|
||||||
|
|
||||||
# Map the name of this formula to the local bottle path to allow the
|
|
||||||
# formula to be loaded by passing just the name to `Formulary::factory`.
|
|
||||||
Formulary.map_formula_name_to_local_bottle_path hash["name"], resource.downloader.cached_location
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
# typed: strict
|
|
||||||
|
|
||||||
module Utils
|
|
||||||
module BottleAPI
|
|
||||||
include Kernel
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Loading…
x
Reference in New Issue
Block a user