brew/Library/Homebrew/cask/exceptions.rb

247 lines
5.5 KiB
Ruby
Raw Normal View History

2020-10-10 14:16:11 +02:00
# typed: true
# frozen_string_literal: true
2018-09-06 08:29:14 +02:00
module Cask
2020-08-24 23:31:55 +02:00
# General cask error.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskError < RuntimeError; end
2016-08-18 22:11:42 +03:00
2020-08-24 23:31:55 +02:00
# Cask error containing multiple other errors.
#
# @api private
class MultipleCaskErrors < CaskError
def initialize(errors)
super()
2020-08-19 17:12:32 +01:00
@errors = errors
end
2020-10-20 12:03:48 +02:00
sig { returns(String) }
def to_s
<<~EOS
Problems with multiple casks:
#{@errors.map(&:to_s).join("\n")}
EOS
end
end
2020-08-24 23:31:55 +02:00
# Abstract cask error containing a cask token.
#
# @api private
2016-09-24 13:52:43 +02:00
class AbstractCaskErrorWithToken < CaskError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
attr_reader :token
sig { returns(String) }
attr_reader :reason
2016-08-18 22:11:42 +03:00
2017-06-11 02:00:59 +02:00
def initialize(token, reason = nil)
2020-08-19 17:12:32 +01:00
super()
2020-10-20 12:03:48 +02:00
@token = token.to_s
2017-06-11 02:00:59 +02:00
@reason = reason.to_s
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when a cask is not installed.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskNotInstalledError < AbstractCaskErrorWithToken
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
2017-06-11 02:00:59 +02:00
"Cask '#{token}' is not installed."
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when a cask conflicts with another cask.
#
# @api private
2017-08-05 15:56:34 +02:00
class CaskConflictError < AbstractCaskErrorWithToken
attr_reader :conflicting_cask
def initialize(token, conflicting_cask)
super(token)
@conflicting_cask = conflicting_cask
end
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2017-08-05 15:56:34 +02:00
def to_s
"Cask '#{token}' conflicts with '#{conflicting_cask}'."
end
end
2020-08-24 23:31:55 +02:00
# Error when a cask is not available.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskUnavailableError < AbstractCaskErrorWithToken
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
"Cask '#{token}' is unavailable#{reason.empty? ? "." : ": #{reason}"}"
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when a cask is unreadable.
#
# @api private
class CaskUnreadableError < CaskUnavailableError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
def to_s
"Cask '#{token}' is unreadable#{reason.empty? ? "." : ": #{reason}"}"
end
end
# Error when a cask in a specific tap is not available.
#
# @api private
class TapCaskUnavailableError < CaskUnavailableError
attr_reader :tap
def initialize(tap, token)
super("#{tap}/#{token}")
@tap = tap
end
sig { returns(String) }
def to_s
s = super
s += "\nPlease tap it and then try again: brew tap #{tap}" unless tap.installed?
s
end
end
2022-06-17 15:22:41 -04:00
# Error when a cask with the same name is found in multiple taps.
#
# @api private
class TapCaskAmbiguityError < CaskError
def initialize(ref, loaders)
super <<~EOS
Cask #{ref} exists in multiple taps:
#{loaders.map { |loader| " #{loader.tap}/#{loader.token}" }.join("\n")}
EOS
end
end
2020-08-24 23:31:55 +02:00
# Error when a cask already exists.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskAlreadyCreatedError < AbstractCaskErrorWithToken
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
2020-11-18 08:10:21 +01:00
%Q(Cask '#{token}' already exists. Run #{Formatter.identifier("brew edit --cask #{token}")} to edit it.)
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when there is a cyclic cask dependency.
#
# @api private
2017-06-28 17:53:59 +02:00
class CaskCyclicDependencyError < AbstractCaskErrorWithToken
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
"Cask '#{token}' includes cyclic dependencies on other Casks#{reason.empty? ? "." : ": #{reason}"}"
2017-06-28 17:53:59 +02:00
end
end
2020-08-24 23:31:55 +02:00
# Error when a cask depends on itself.
#
# @api private
2017-06-28 17:53:59 +02:00
class CaskSelfReferencingDependencyError < CaskCyclicDependencyError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2017-06-28 17:53:59 +02:00
def to_s
"Cask '#{token}' depends on itself."
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when no cask is specified.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskUnspecifiedError < CaskError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
2017-06-11 02:00:59 +02:00
"This command requires a Cask token."
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when a cask is invalid.
#
# @api private
2016-09-24 13:52:43 +02:00
class CaskInvalidError < AbstractCaskErrorWithToken
2020-10-20 12:03:48 +02:00
sig { returns(String) }
2016-09-24 13:52:43 +02:00
def to_s
"Cask '#{token}' definition is invalid#{reason.empty? ? "." : ": #{reason}"}"
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error when a cask token does not match the file name.
#
# @api private
2017-06-11 02:00:59 +02:00
class CaskTokenMismatchError < CaskInvalidError
2016-09-24 13:52:43 +02:00
def initialize(token, header_token)
2017-06-11 02:00:59 +02:00
super(token, "Token '#{header_token}' in header line does not match the file name.")
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
end
2020-08-24 23:31:55 +02:00
# Error during quarantining of a file.
#
# @api private
class CaskQuarantineError < CaskError
attr_reader :path, :reason
def initialize(path, reason)
super()
2020-08-19 17:12:32 +01:00
@path = path
@reason = reason
end
2020-10-20 12:03:48 +02:00
sig { returns(String) }
def to_s
2019-04-28 15:16:47 +02:00
s = +"Failed to quarantine #{path}."
unless reason.empty?
s << " Here's the reason:\n"
s << Formatter.error(reason)
s << "\n" unless reason.end_with?("\n")
end
s.freeze
end
end
2020-08-24 23:31:55 +02:00
# Error while propagating quarantine information to subdirectories.
#
# @api private
class CaskQuarantinePropagationError < CaskQuarantineError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
def to_s
2019-04-28 15:16:47 +02:00
s = +"Failed to quarantine one or more files within #{path}."
unless reason.empty?
s << " Here's the reason:\n"
s << Formatter.error(reason)
s << "\n" unless reason.end_with?("\n")
end
s.freeze
end
end
2020-08-24 23:31:55 +02:00
# Error while removing quarantine information.
#
# @api private
class CaskQuarantineReleaseError < CaskQuarantineError
2020-10-20 12:03:48 +02:00
sig { returns(String) }
def to_s
2019-04-28 15:16:47 +02:00
s = +"Failed to release #{path} from quarantine."
unless reason.empty?
s << " Here's the reason:\n"
s << Formatter.error(reason)
s << "\n" unless reason.end_with?("\n")
end
s.freeze
end
end
2016-08-18 22:11:42 +03:00
end