Merge pull request #16629 from reitermarkus/simplify-cask-loader
Simplify `CaskLoader` further.
This commit is contained in:
commit
a783aaf03f
@ -196,6 +196,9 @@ module Cask
|
||||
|
||||
# Loads a cask from a specific tap.
|
||||
class FromTapLoader < FromPathLoader
|
||||
sig { returns(Tap) }
|
||||
attr_reader :tap
|
||||
|
||||
sig {
|
||||
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
|
||||
.returns(T.nilable(T.attached_class))
|
||||
@ -224,37 +227,6 @@ module Cask
|
||||
end
|
||||
end
|
||||
|
||||
# Load a cask from the default tap, using either a full or short token.
|
||||
class FromDefaultTapLoader < FromTapLoader
|
||||
sig {
|
||||
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
|
||||
.returns(T.nilable(T.attached_class))
|
||||
}
|
||||
def self.try_new(ref, warn: false)
|
||||
ref = ref.to_s
|
||||
|
||||
return unless (match = ref.match(HOMEBREW_DEFAULT_TAP_CASK_REGEX))
|
||||
|
||||
token = match[:token]
|
||||
|
||||
ref = "#{CoreCaskTap.instance}/#{token}"
|
||||
|
||||
token, tap, = CaskLoader.tap_cask_token_type(ref, warn: warn)
|
||||
new("#{tap}/#{token}")
|
||||
end
|
||||
end
|
||||
|
||||
# Loads a cask from the default tap path.
|
||||
class FromDefaultTapPathLoader < FromPathLoader
|
||||
sig {
|
||||
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
|
||||
.returns(T.nilable(T.attached_class))
|
||||
}
|
||||
def self.try_new(ref, warn: false)
|
||||
super CaskLoader.default_path(ref)
|
||||
end
|
||||
end
|
||||
|
||||
# Loads a cask from an existing {Cask} instance.
|
||||
class FromInstanceLoader
|
||||
include ILoader
|
||||
@ -298,7 +270,10 @@ module Cask
|
||||
return if Homebrew::EnvConfig.no_install_from_api?
|
||||
return unless ref.is_a?(String)
|
||||
return unless (token = ref[HOMEBREW_DEFAULT_TAP_CASK_REGEX, :token])
|
||||
return if !Homebrew::API::Cask.all_casks.key?(token) && !Homebrew::API::Cask.all_renames.key?(token)
|
||||
if !Homebrew::API::Cask.all_casks.key?(token) &&
|
||||
!Homebrew::API::Cask.all_renames.key?(token)
|
||||
return
|
||||
end
|
||||
|
||||
ref = "#{CoreCaskTap.instance}/#{token}"
|
||||
|
||||
@ -464,21 +439,44 @@ module Cask
|
||||
|
||||
# Loader which tries loading casks from tap paths, failing
|
||||
# if the same token exists in multiple taps.
|
||||
class FromAmbiguousTapPathLoader < FromPathLoader
|
||||
class FromNameLoader < FromTapLoader
|
||||
sig {
|
||||
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
|
||||
.returns(T.nilable(T.attached_class))
|
||||
}
|
||||
def self.try_new(ref, warn: false)
|
||||
case (possible_tap_casks = CaskLoader.tap_paths(ref)).count
|
||||
return unless ref.is_a?(String)
|
||||
return if ref.include?("/")
|
||||
|
||||
token = ref
|
||||
|
||||
loaders = Tap.map { |tap| super("#{tap}/#{token}", warn: warn) }
|
||||
.compact
|
||||
.select { _1.path.exist? }
|
||||
|
||||
case loaders.count
|
||||
when 1
|
||||
new(possible_tap_casks.first)
|
||||
loaders.first
|
||||
when 2..Float::INFINITY
|
||||
loaders = possible_tap_casks.map(&FromPathLoader.method(:new))
|
||||
raise TapCaskAmbiguityError.new(ref, loaders)
|
||||
# Always prefer the default tap, i.e. behave the same as if loading from the API.
|
||||
if (default_tap_loader = loaders.find { _1.tap.core_cask_tap? })
|
||||
return default_tap_loader
|
||||
end
|
||||
|
||||
raise TapCaskAmbiguityError.new(token, loaders.map(&:tap))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Loader which loads a cask from the installed cask file.
|
||||
class FromInstalledPathLoader < FromPathLoader
|
||||
sig {
|
||||
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
|
||||
.returns(T.nilable(T.attached_class))
|
||||
}
|
||||
def self.try_new(ref, warn: false)
|
||||
return unless ref.is_a?(String)
|
||||
|
||||
possible_installed_cask = Cask.new(ref)
|
||||
return unless (installed_caskfile = possible_installed_cask.installed_caskfile)
|
||||
|
||||
@ -557,10 +555,8 @@ module Cask
|
||||
FromURILoader,
|
||||
FromAPILoader,
|
||||
FromTapLoader,
|
||||
FromNameLoader,
|
||||
FromPathLoader,
|
||||
FromDefaultTapPathLoader,
|
||||
FromAmbiguousTapPathLoader,
|
||||
FromDefaultTapLoader,
|
||||
FromInstalledPathLoader,
|
||||
NullLoader,
|
||||
].each do |loader_class|
|
||||
|
@ -131,10 +131,14 @@ module Cask
|
||||
#
|
||||
# @api private
|
||||
class TapCaskAmbiguityError < CaskError
|
||||
def initialize(ref, loaders)
|
||||
def initialize(token, taps)
|
||||
casks = taps.map { |tap| "#{tap}/#{token}" }
|
||||
cask_list = casks.sort.map { |f| "\n * #{f}" }.join
|
||||
|
||||
super <<~EOS
|
||||
Cask #{ref} exists in multiple taps:
|
||||
#{loaders.map { |loader| " #{loader.tap}/#{loader.token}" }.join("\n")}
|
||||
Cask #{token} exists in multiple taps:#{cask_list}
|
||||
|
||||
Please use the fully-qualified name (e.g. #{casks.first}) to refer to a specific Cask.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user