Load cask from API with fullname

This allows homebrew/cask/caskname
to work with the FromAPILoader.

Also, creates new constant to hold the
regex to validate main tap casks.
This commit is contained in:
apainintheneck 2023-01-31 00:09:57 -08:00
parent 4917a35413
commit e0ad960025
3 changed files with 12 additions and 13 deletions

View File

@ -10,8 +10,6 @@ module Homebrew
class << self class << self
extend T::Sig extend T::Sig
CASK_TOKEN_REGEX = %r{^(homebrew/cask/)?[a-z0-9\-_]+$}.freeze
sig { params(token: String).returns(Hash) } sig { params(token: String).returns(Hash) }
def fetch(token) def fetch(token)
token = token.delete_prefix("homebrew/cask/") token = token.delete_prefix("homebrew/cask/")
@ -21,7 +19,7 @@ module Homebrew
sig { params(token: String).returns(T::Boolean) } sig { params(token: String).returns(T::Boolean) }
def available?(token) def available?(token)
# Sanity check before hitting the API # Sanity check before hitting the API
return false unless token.match?(CASK_TOKEN_REGEX) return false unless token.match?(HOMEBREW_MAIN_TAP_CASK_REGEX)
begin begin
fetch token fetch token

View File

@ -193,11 +193,16 @@ module Cask
FLIGHT_STANZAS = [:preflight, :postflight, :uninstall_preflight, :uninstall_postflight].freeze FLIGHT_STANZAS = [:preflight, :postflight, :uninstall_preflight, :uninstall_postflight].freeze
def self.can_load?(ref) def self.can_load?(ref)
Homebrew::API::Cask.all_casks.key? ref return false unless Homebrew::EnvConfig.install_from_api?
return false unless ref.is_a?(String)
return false unless ref.match?(HOMEBREW_MAIN_TAP_CASK_REGEX)
token = ref.delete_prefix("homebrew/cask/")
Homebrew::API::Cask.all_casks.key?(token)
end end
def initialize(token) def initialize(token)
@token = token @token = token.delete_prefix("homebrew/cask/")
@path = CaskLoader.default_path(token) @path = CaskLoader.default_path(token)
end end
@ -356,18 +361,12 @@ module Cask
FromInstanceLoader, FromInstanceLoader,
FromContentLoader, FromContentLoader,
FromURILoader, FromURILoader,
FromAPILoader,
FromTapLoader, FromTapLoader,
FromTapPathLoader, FromTapPathLoader,
FromPathLoader, FromPathLoader,
].each do |loader_class| ].each do |loader_class|
next unless loader_class.can_load?(ref) return loader_class.new(ref) if loader_class.can_load?(ref)
if loader_class == FromTapLoader && Homebrew::EnvConfig.install_from_api? &&
ref.start_with?("homebrew/cask/") && FromAPILoader.can_load?(ref)
return FromAPILoader.new(ref)
end
return loader_class.new(ref)
end end
if Homebrew::EnvConfig.install_from_api? && !need_path && Homebrew::API::CaskSource.available?(ref) if Homebrew::EnvConfig.install_from_api? && !need_path && Homebrew::API::CaskSource.available?(ref)

View File

@ -5,6 +5,8 @@
HOMEBREW_TAP_FORMULA_REGEX = %r{^([\w-]+)/([\w-]+)/([\w+-.@]+)$}.freeze HOMEBREW_TAP_FORMULA_REGEX = %r{^([\w-]+)/([\w-]+)/([\w+-.@]+)$}.freeze
# Match taps' casks, e.g. `someuser/sometap/somecask` # Match taps' casks, e.g. `someuser/sometap/somecask`
HOMEBREW_TAP_CASK_REGEX = %r{^([\w-]+)/([\w-]+)/([a-z0-9\-_]+)$}.freeze HOMEBREW_TAP_CASK_REGEX = %r{^([\w-]+)/([\w-]+)/([a-z0-9\-_]+)$}.freeze
# Match main cask taps' casks, e.g. `homebrew/cask/somecask` or `somecask`
HOMEBREW_MAIN_TAP_CASK_REGEX = %r{^(homebrew/cask/)?[a-z0-9\-_]+$}.freeze
# Match taps' directory paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap` # Match taps' directory paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap`
HOMEBREW_TAP_DIR_REGEX = %r{#{Regexp.escape(HOMEBREW_LIBRARY.to_s)}/Taps/(?<user>[\w-]+)/(?<repo>[\w-]+)}.freeze HOMEBREW_TAP_DIR_REGEX = %r{#{Regexp.escape(HOMEBREW_LIBRARY.to_s)}/Taps/(?<user>[\w-]+)/(?<repo>[\w-]+)}.freeze
# Match taps' formula paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap/someformula` # Match taps' formula paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap/someformula`