Merge pull request #2771 from reitermarkus/cask-exceptions
🔨 Refactor Cask exceptions.
This commit is contained in:
commit
bfcb3928f8
@ -32,9 +32,9 @@ module Hbc
|
||||
end
|
||||
|
||||
def load
|
||||
raise CaskError, "'#{@path}' does not exist." unless @path.exist?
|
||||
raise CaskError, "'#{@path}' is not readable." unless @path.readable?
|
||||
raise CaskError, "'#{@path}' is not a file." unless @path.file?
|
||||
raise CaskUnavailableError.new(@token, "'#{@path}' does not exist.") unless @path.exist?
|
||||
raise CaskUnavailableError.new(@token, "'#{@path}' is not readable.") unless @path.readable?
|
||||
raise CaskUnavailableError.new(@token, "'#{@path}' is not a file.") unless @path.file?
|
||||
|
||||
@content = IO.read(@path)
|
||||
|
||||
@ -45,7 +45,7 @@ module Hbc
|
||||
|
||||
def cask(header_token, &block)
|
||||
if @token != header_token
|
||||
raise CaskTokenDoesNotMatchError.new(@token, header_token)
|
||||
raise CaskTokenMismatchError.new(@token, header_token)
|
||||
end
|
||||
|
||||
Cask.new(header_token, sourcefile_path: @path, &block)
|
||||
@ -57,10 +57,11 @@ module Hbc
|
||||
ref.to_s.match?(::URI.regexp)
|
||||
end
|
||||
|
||||
attr_reader :url
|
||||
|
||||
def initialize(url)
|
||||
@url = url
|
||||
uri = URI(url)
|
||||
super Hbc.cache/File.basename(uri.path)
|
||||
@url = URI(url)
|
||||
super Hbc.cache/File.basename(@url.path)
|
||||
end
|
||||
|
||||
def load
|
||||
@ -71,7 +72,7 @@ module Hbc
|
||||
ohai "Downloading #{@url}."
|
||||
curl @url, "-o", @path
|
||||
rescue ErrorDuringExecution
|
||||
raise CaskUnavailableError, @url
|
||||
raise CaskUnavailableError.new(@token, "Failed to download #{Formatter.url(@url)}.")
|
||||
end
|
||||
|
||||
super
|
||||
@ -108,7 +109,7 @@ module Hbc
|
||||
end
|
||||
|
||||
def load
|
||||
raise CaskUnavailableError, @token
|
||||
raise CaskUnavailableError.new(@token, "No Cask with this name exists.")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -166,7 +166,7 @@ module Hbc
|
||||
Hbc.default_tap.install unless Hbc.default_tap.installed?
|
||||
Hbc.init if self.class.should_init?(command)
|
||||
self.class.run_command(command, *args)
|
||||
rescue CaskError, CaskSha256MismatchError, ArgumentError, OptionParser::InvalidOption => e
|
||||
rescue CaskError, ArgumentError, OptionParser::InvalidOption => e
|
||||
msg = e.message
|
||||
msg << e.backtrace.join("\n").prepend("\n") if ARGV.debug?
|
||||
onoe msg
|
||||
|
||||
@ -41,6 +41,43 @@ module Hbc
|
||||
def initialize(*args)
|
||||
@args = process_arguments(*args)
|
||||
end
|
||||
|
||||
def self.warn_unavailable_with_suggestion(cask_token, e)
|
||||
exact_match, partial_matches = Search.search(cask_token)
|
||||
error_message = e.message
|
||||
if exact_match
|
||||
error_message.concat(" Did you mean:\n#{exact_match}")
|
||||
elsif !partial_matches.empty?
|
||||
error_message.concat(" Did you mean one of:\n")
|
||||
.concat(Formatter.columns(partial_matches.take(20)))
|
||||
end
|
||||
onoe error_message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def casks(alternative: -> { [] })
|
||||
return to_enum(:casks, alternative: alternative) unless block_given?
|
||||
|
||||
count = 0
|
||||
|
||||
casks = args.empty? ? alternative.call : args
|
||||
|
||||
casks.each do |cask_or_token|
|
||||
begin
|
||||
yield cask_or_token.respond_to?(:token) ? cask_or_token : CaskLoader.load(cask_or_token)
|
||||
count += 1
|
||||
rescue CaskUnavailableError => e
|
||||
cask_token = cask_or_token
|
||||
self.class.warn_unavailable_with_suggestion cask_token, e
|
||||
rescue CaskError => e
|
||||
onoe e.message
|
||||
end
|
||||
end
|
||||
|
||||
return :empty if casks.length.zero?
|
||||
(count == casks.length) ? :complete : :incomplete
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -9,11 +9,8 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
casks_to_audit = args.empty? ? Hbc.all : args.map(&CaskLoader.public_method(:load))
|
||||
|
||||
failed_casks = casks_to_audit.reject do |cask|
|
||||
audit(cask)
|
||||
end
|
||||
failed_casks = casks(alternative: -> { Hbc.all })
|
||||
.reject { |cask| audit(cask) }
|
||||
|
||||
return if failed_casks.empty?
|
||||
raise CaskError, "audit failed for casks: #{failed_casks.join(" ")}"
|
||||
|
||||
@ -7,10 +7,12 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
args.each do |cask_token|
|
||||
cask_path = CaskLoader.path(cask_token)
|
||||
raise CaskUnavailableError, cask_token.to_s unless cask_path.exist?
|
||||
puts File.open(cask_path, &:read)
|
||||
raise CaskError, "Cat incomplete." if cat_casks == :incomplete
|
||||
end
|
||||
|
||||
def cat_casks
|
||||
casks.each do |cask|
|
||||
puts File.open(cask.sourcefile_path, &:read)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
remove_cache_files(*@args)
|
||||
remove_cache_files(*args)
|
||||
end
|
||||
|
||||
def cache_files
|
||||
|
||||
@ -9,10 +9,12 @@ module Hbc
|
||||
|
||||
def run
|
||||
cask_token = args.first
|
||||
cask_path = CaskLoader.path(cask_token)
|
||||
|
||||
unless cask_path.exist?
|
||||
raise CaskUnavailableError, %Q(#{cask_token}, run "brew cask create #{cask_token}" to create a new Cask)
|
||||
cask_path = begin
|
||||
CaskLoader.load(cask_token).sourcefile_path
|
||||
rescue CaskUnavailableError => e
|
||||
reason = e.reason.empty? ? "" : "#{e.reason} "
|
||||
reason.concat("Run #{Formatter.identifier("brew cask create #{e.token}")} to create a new Cask.")
|
||||
raise e.class.new(e.token, reason)
|
||||
end
|
||||
|
||||
odebug "Opening editor for Cask #{cask_token}"
|
||||
|
||||
@ -9,9 +9,12 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
args.each do |cask_token|
|
||||
ohai "Downloading external files for Cask #{cask_token}"
|
||||
cask = CaskLoader.load(cask_token)
|
||||
raise CaskError, "Fetch incomplete." if fetch_casks == :incomplete
|
||||
end
|
||||
|
||||
def fetch_casks
|
||||
casks.each do |cask|
|
||||
ohai "Downloading external files for Cask #{cask}"
|
||||
downloaded_path = Download.new(cask, force: force?).perform
|
||||
Verify.all(cask, downloaded_path)
|
||||
ohai "Success! Downloaded to -> #{downloaded_path}"
|
||||
|
||||
@ -2,9 +2,7 @@ module Hbc
|
||||
class CLI
|
||||
class Home < AbstractCommand
|
||||
def run
|
||||
casks = args.map(&CaskLoader.public_method(:load))
|
||||
|
||||
if casks.empty?
|
||||
if casks.none?
|
||||
odebug "Opening project homepage"
|
||||
self.class.open_url "https://caskroom.github.io/"
|
||||
else
|
||||
|
||||
@ -7,10 +7,8 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
args.each do |cask_token|
|
||||
odebug "Getting info for Cask #{cask_token}"
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
casks.each do |cask|
|
||||
odebug "Getting info for Cask #{cask}"
|
||||
self.class.info(cask)
|
||||
end
|
||||
end
|
||||
|
||||
@ -10,53 +10,21 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
retval = install_casks
|
||||
# retval is ternary: true/false/nil
|
||||
|
||||
raise CaskError, "nothing to install" if retval.nil?
|
||||
raise CaskError, "install incomplete" unless retval
|
||||
raise CaskError, "Install incomplete." if install_casks == :incomplete
|
||||
end
|
||||
|
||||
def install_casks
|
||||
count = 0
|
||||
args.each do |cask_token|
|
||||
casks.each do |cask|
|
||||
begin
|
||||
cask = CaskLoader.load(cask_token)
|
||||
Installer.new(cask, binaries: binaries?,
|
||||
verbose: verbose?,
|
||||
verbose: verbose?,
|
||||
force: force?,
|
||||
skip_cask_deps: skip_cask_deps?,
|
||||
require_sha: require_sha?).install
|
||||
count += 1
|
||||
rescue CaskAlreadyInstalledError => e
|
||||
opoo e.message
|
||||
count += 1
|
||||
rescue CaskAlreadyInstalledAutoUpdatesError => e
|
||||
opoo e.message
|
||||
count += 1
|
||||
rescue CaskUnavailableError => e
|
||||
self.class.warn_unavailable_with_suggestion cask_token, e
|
||||
rescue CaskNoShasumError => e
|
||||
opoo e.message
|
||||
count += 1
|
||||
rescue CaskError => e
|
||||
onoe e.message
|
||||
end
|
||||
end
|
||||
|
||||
count.zero? ? nil : count == args.length
|
||||
end
|
||||
|
||||
def self.warn_unavailable_with_suggestion(cask_token, e)
|
||||
exact_match, partial_matches = Search.search(cask_token)
|
||||
error_message = e.message
|
||||
if exact_match
|
||||
error_message.concat(". Did you mean:\n#{exact_match}")
|
||||
elsif !partial_matches.empty?
|
||||
error_message.concat(". Did you mean one of:\n")
|
||||
.concat(Formatter.columns(partial_matches.take(20)))
|
||||
end
|
||||
onoe error_message
|
||||
end
|
||||
|
||||
def self.help
|
||||
|
||||
@ -7,25 +7,11 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
retval = dump_casks
|
||||
# retval is ternary: true/false/nil
|
||||
|
||||
raise CaskError, "nothing to dump" if retval.nil?
|
||||
raise CaskError, "dump incomplete" unless retval
|
||||
raise CaskError, "Dump incomplete." if dump_casks == :incomplet
|
||||
end
|
||||
|
||||
def dump_casks
|
||||
count = 0
|
||||
args.each do |cask_token|
|
||||
begin
|
||||
cask = CaskLoader.load(cask_token)
|
||||
count += 1
|
||||
cask.dumpcask
|
||||
rescue StandardError => e
|
||||
opoo "#{cask_token} was not found or would not load: #{e}"
|
||||
end
|
||||
end
|
||||
count.zero? ? nil : count == args.length
|
||||
casks.each(&:dumpcask)
|
||||
end
|
||||
|
||||
def self.help
|
||||
|
||||
@ -72,38 +72,22 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
retval = print_stanzas
|
||||
# retval is ternary: true/false/nil
|
||||
if retval.nil?
|
||||
exit 1 if quiet?
|
||||
raise CaskError, "nothing to print"
|
||||
elsif !retval
|
||||
exit 1 if quiet?
|
||||
raise CaskError, "print incomplete"
|
||||
end
|
||||
return unless print_stanzas == :incomplete
|
||||
exit 1 if quiet?
|
||||
raise CaskError, "Print incomplete."
|
||||
end
|
||||
|
||||
def print_stanzas
|
||||
count = 0
|
||||
if ARTIFACTS.include?(stanza)
|
||||
artifact_name = stanza
|
||||
@stanza = :artifacts
|
||||
end
|
||||
|
||||
cask_tokens = args.empty? ? Hbc.all_tokens : args
|
||||
cask_tokens.each do |cask_token|
|
||||
print "#{cask_token}\t" if table?
|
||||
|
||||
begin
|
||||
cask = CaskLoader.load(cask_token)
|
||||
rescue StandardError
|
||||
opoo "Cask '#{cask_token}' was not found" unless quiet?
|
||||
puts ""
|
||||
next
|
||||
end
|
||||
casks(alternative: -> { Hbc.all }).each do |cask|
|
||||
print "#{cask}\t" if table?
|
||||
|
||||
unless cask.respond_to?(stanza)
|
||||
opoo "no such stanza '#{stanza}' on Cask '#{cask_token}'" unless quiet?
|
||||
opoo "no such stanza '#{stanza}' on Cask '#{cask}'" unless quiet?
|
||||
puts ""
|
||||
next
|
||||
end
|
||||
@ -111,13 +95,13 @@ module Hbc
|
||||
begin
|
||||
value = cask.send(@stanza)
|
||||
rescue StandardError
|
||||
opoo "failure calling '#{stanza}' on Cask '#{cask_token}'" unless quiet?
|
||||
opoo "failure calling '#{stanza}' on Cask '#{cask}'" unless quiet?
|
||||
puts ""
|
||||
next
|
||||
end
|
||||
|
||||
if artifact_name && !value.key?(artifact_name)
|
||||
opoo "no such stanza '#{artifact_name}' on Cask '#{cask_token}'" unless quiet?
|
||||
opoo "no such stanza '#{artifact_name}' on Cask '#{cask}'" unless quiet?
|
||||
puts ""
|
||||
next
|
||||
end
|
||||
@ -131,10 +115,7 @@ module Hbc
|
||||
else
|
||||
puts value.to_s
|
||||
end
|
||||
|
||||
count += 1
|
||||
end
|
||||
count.zero? ? nil : count == cask_tokens.length
|
||||
end
|
||||
|
||||
def self.help
|
||||
|
||||
@ -11,44 +11,22 @@ module Hbc
|
||||
|
||||
def run
|
||||
retval = args.any? ? list : list_installed
|
||||
# retval is ternary: true/false/nil
|
||||
if retval.nil? && args.none?
|
||||
opoo "nothing to list" # special case: avoid exit code
|
||||
elsif retval.nil?
|
||||
raise CaskError, "nothing to list"
|
||||
elsif !retval
|
||||
raise CaskError, "listing incomplete"
|
||||
end
|
||||
raise CaskError, "Listing incomplete." if retval == :incomplete
|
||||
end
|
||||
|
||||
def list
|
||||
count = 0
|
||||
casks.each do |cask|
|
||||
raise CaskNotInstalledError, cask unless cask.installed?
|
||||
|
||||
args.each do |cask_token|
|
||||
odebug "Listing files for Cask #{cask_token}"
|
||||
begin
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
if cask.installed?
|
||||
if one?
|
||||
puts cask.token
|
||||
elsif versions?
|
||||
puts self.class.format_versioned(cask)
|
||||
else
|
||||
cask = CaskLoader.load_from_file(cask.installed_caskfile)
|
||||
self.class.list_artifacts(cask)
|
||||
end
|
||||
|
||||
count += 1
|
||||
else
|
||||
opoo "#{cask} is not installed"
|
||||
end
|
||||
rescue CaskUnavailableError => e
|
||||
onoe e
|
||||
if one?
|
||||
puts cask.token
|
||||
elsif versions?
|
||||
puts self.class.format_versioned(cask)
|
||||
else
|
||||
cask = CaskLoader.load_from_file(cask.installed_caskfile)
|
||||
self.class.list_artifacts(cask)
|
||||
end
|
||||
end
|
||||
|
||||
count.zero? ? nil : count == args.length
|
||||
end
|
||||
|
||||
def self.list_artifacts(cask)
|
||||
@ -69,7 +47,7 @@ module Hbc
|
||||
puts Formatter.columns(installed_casks.map(&:to_s))
|
||||
end
|
||||
|
||||
installed_casks.empty? ? nil : true
|
||||
installed_casks.empty? ? :empty : :complete
|
||||
end
|
||||
|
||||
def self.format_versioned(cask)
|
||||
|
||||
@ -10,9 +10,7 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
casks_to_check = args.empty? ? Hbc.installed : args.map(&CaskLoader.public_method(:load))
|
||||
|
||||
casks_to_check.each do |cask|
|
||||
casks(alternative: -> { Hbc.installed }).each do |cask|
|
||||
odebug "Checking update info of Cask #{cask}"
|
||||
self.class.list_if_outdated(cask, greedy?, verbose?)
|
||||
end
|
||||
|
||||
@ -2,28 +2,13 @@ module Hbc
|
||||
class CLI
|
||||
class Reinstall < Install
|
||||
def install_casks
|
||||
count = 0
|
||||
args.each do |cask_token|
|
||||
begin
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
Installer.new(cask,
|
||||
binaries: binaries?,
|
||||
verbose: verbose?,
|
||||
force: force?,
|
||||
skip_cask_deps: skip_cask_deps?,
|
||||
require_sha: require_sha?).reinstall
|
||||
|
||||
count += 1
|
||||
rescue CaskUnavailableError => e
|
||||
self.class.warn_unavailable_with_suggestion cask_token, e
|
||||
rescue CaskNoShasumError => e
|
||||
opoo e.message
|
||||
count += 1
|
||||
end
|
||||
casks.each do |cask|
|
||||
Installer.new(cask, binaries: binaries?,
|
||||
verbose: verbose?,
|
||||
force: force?,
|
||||
skip_cask_deps: skip_cask_deps?,
|
||||
require_sha: require_sha?).reinstall
|
||||
end
|
||||
|
||||
count.zero? ? nil : count == args.length
|
||||
end
|
||||
|
||||
def self.help
|
||||
|
||||
@ -31,7 +31,7 @@ module Hbc
|
||||
elsif args.any? { |file| File.exist?(file) }
|
||||
args
|
||||
else
|
||||
args.map { |token| CaskLoader.path(token) }
|
||||
casks.map(&:sourcefile_path)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -9,9 +9,12 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
args.each do |cask_token|
|
||||
odebug "Uninstalling Cask #{cask_token}"
|
||||
cask = CaskLoader.load(cask_token)
|
||||
raise CaskError, "Uninstall incomplete." if uninstall_casks == :incomplete
|
||||
end
|
||||
|
||||
def uninstall_casks
|
||||
casks.each do |cask|
|
||||
odebug "Uninstalling Cask #{cask}"
|
||||
|
||||
raise CaskNotInstalledError, cask unless cask.installed? || force?
|
||||
|
||||
@ -27,8 +30,8 @@ module Hbc
|
||||
single = versions.count == 1
|
||||
|
||||
puts <<-EOS.undent
|
||||
#{cask_token} #{versions.join(", ")} #{single ? "is" : "are"} still installed.
|
||||
Remove #{single ? "it" : "them all"} with `brew cask uninstall --force #{cask_token}`.
|
||||
#{cask} #{versions.join(", ")} #{single ? "is" : "are"} still installed.
|
||||
Remove #{single ? "it" : "them all"} with `brew cask uninstall --force #{cask}`.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
@ -7,9 +7,12 @@ module Hbc
|
||||
end
|
||||
|
||||
def run
|
||||
args.each do |cask_token|
|
||||
odebug "Zapping Cask #{cask_token}"
|
||||
cask = CaskLoader.load(cask_token)
|
||||
raise CaskError, "Zap incomplete." if zap_casks == :incomplete
|
||||
end
|
||||
|
||||
def zap_casks
|
||||
casks.each do |cask|
|
||||
odebug "Zapping Cask #{cask}"
|
||||
Installer.new(cask, verbose: verbose?).zap
|
||||
end
|
||||
end
|
||||
|
||||
@ -3,59 +3,43 @@ module Hbc
|
||||
|
||||
class AbstractCaskErrorWithToken < CaskError
|
||||
attr_reader :token
|
||||
attr_reader :reason
|
||||
|
||||
def initialize(token)
|
||||
def initialize(token, reason = nil)
|
||||
@token = token
|
||||
@reason = reason.to_s
|
||||
end
|
||||
end
|
||||
|
||||
class CaskNotInstalledError < AbstractCaskErrorWithToken
|
||||
def to_s
|
||||
"#{token} is not installed"
|
||||
"Cask '#{token}' is not installed."
|
||||
end
|
||||
end
|
||||
|
||||
class CaskUnavailableError < AbstractCaskErrorWithToken
|
||||
def to_s
|
||||
"No available Cask for #{token}"
|
||||
"Cask '#{token}' is unavailable" << (reason.empty? ? "." : ": #{reason}")
|
||||
end
|
||||
end
|
||||
|
||||
class CaskAlreadyCreatedError < AbstractCaskErrorWithToken
|
||||
def to_s
|
||||
%Q(A Cask for #{token} already exists. Run "brew cask cat #{token}" to see it.)
|
||||
%Q(Cask '#{token}' already exists. Run #{Formatter.identifier("brew cask cat #{token}")} to edit it.)
|
||||
end
|
||||
end
|
||||
|
||||
class CaskAlreadyInstalledError < AbstractCaskErrorWithToken
|
||||
def to_s
|
||||
s = <<-EOS.undent
|
||||
A Cask for #{token} is already installed.
|
||||
EOS
|
||||
|
||||
s.concat("\n").concat(reinstall_message)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def reinstall_message
|
||||
<<-EOS.undent
|
||||
Cask '#{token}' is already installed.
|
||||
|
||||
To re-install #{token}, run:
|
||||
brew cask reinstall #{token}
|
||||
#{Formatter.identifier("brew cask reinstall #{token}")}
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
class CaskAlreadyInstalledAutoUpdatesError < CaskAlreadyInstalledError
|
||||
def to_s
|
||||
s = <<-EOS.undent
|
||||
A Cask for #{token} is already installed and using auto-updates.
|
||||
EOS
|
||||
|
||||
s.concat("\n").concat(reinstall_message)
|
||||
end
|
||||
end
|
||||
|
||||
class CaskCommandFailedError < CaskError
|
||||
def initialize(cmd, stdout, stderr, status)
|
||||
@cmd = cmd
|
||||
@ -84,8 +68,8 @@ module Hbc
|
||||
class CaskX11DependencyError < AbstractCaskErrorWithToken
|
||||
def to_s
|
||||
<<-EOS.undent
|
||||
#{token} requires XQuartz/X11, which can be installed using Homebrew-Cask by running
|
||||
brew cask install xquartz
|
||||
Cask '#{token}' requires XQuartz/X11, which can be installed using Homebrew-Cask by running
|
||||
#{Formatter.identifier("brew cask install xquartz")}
|
||||
|
||||
or manually, by downloading the package from
|
||||
#{Formatter.url("https://www.xquartz.org/")}
|
||||
@ -101,60 +85,67 @@ module Hbc
|
||||
|
||||
class CaskUnspecifiedError < CaskError
|
||||
def to_s
|
||||
"This command requires a Cask token"
|
||||
"This command requires a Cask token."
|
||||
end
|
||||
end
|
||||
|
||||
class CaskInvalidError < AbstractCaskErrorWithToken
|
||||
attr_reader :submsg
|
||||
def initialize(token, *submsg)
|
||||
super(token)
|
||||
@submsg = submsg.join(" ")
|
||||
end
|
||||
|
||||
def to_s
|
||||
"Cask '#{token}' definition is invalid#{": #{submsg}" unless submsg.empty?}"
|
||||
"Cask '#{token}' definition is invalid" << (reason.empty? ? ".": ": #{reason}")
|
||||
end
|
||||
end
|
||||
|
||||
class CaskTokenDoesNotMatchError < CaskInvalidError
|
||||
class CaskTokenMismatchError < CaskInvalidError
|
||||
def initialize(token, header_token)
|
||||
super(token, "Bad header line: '#{header_token}' does not match file name")
|
||||
super(token, "Token '#{header_token}' in header line does not match the file name.")
|
||||
end
|
||||
end
|
||||
|
||||
class CaskSha256MissingError < ArgumentError
|
||||
end
|
||||
class CaskSha256Error < AbstractCaskErrorWithToken
|
||||
attr_reader :expected, :actual
|
||||
|
||||
class CaskSha256MismatchError < RuntimeError
|
||||
attr_reader :path, :expected, :actual
|
||||
def initialize(path, expected, actual)
|
||||
@path = path
|
||||
def initialize(token, expected = nil, actual = nil)
|
||||
super(token)
|
||||
@expected = expected
|
||||
@actual = actual
|
||||
end
|
||||
end
|
||||
|
||||
class CaskSha256MissingError < CaskSha256Error
|
||||
def to_s
|
||||
<<-EOS.undent
|
||||
Cask '#{token}' requires a checksum:
|
||||
#{Formatter.identifier("sha256 '#{actual}'")}
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
class CaskSha256MismatchError < CaskSha256Error
|
||||
attr_reader :path
|
||||
|
||||
def initialize(token, expected, actual, path)
|
||||
super(token, expected, actual)
|
||||
@path = path
|
||||
end
|
||||
|
||||
def to_s
|
||||
<<-EOS.undent
|
||||
sha256 mismatch
|
||||
Expected: #{expected}
|
||||
Actual: #{actual}
|
||||
File: #{path}
|
||||
Checksum for Cask '#{token}' does not match.
|
||||
|
||||
Expected: #{Formatter.success(expected.to_s)}
|
||||
Actual: #{Formatter.error(actual.to_s)}
|
||||
File: #{path}
|
||||
|
||||
To retry an incomplete download, remove the file above.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
class CaskNoShasumError < CaskError
|
||||
attr_reader :token
|
||||
def initialize(token)
|
||||
@token = token
|
||||
end
|
||||
|
||||
class CaskNoShasumError < CaskSha256Error
|
||||
def to_s
|
||||
<<-EOS.undent
|
||||
Cask '#{token}' does not have a sha256 checksum defined and was not installed.
|
||||
This means you have the "--require-sha" option set, perhaps in your HOMEBREW_CASK_OPTS.
|
||||
This means you have the #{Formatter.identifier("--require-sha")} option set, perhaps in your HOMEBREW_CASK_OPTS.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
@ -94,7 +94,6 @@ module Hbc
|
||||
odebug "Hbc::Installer#install"
|
||||
|
||||
if @cask.installed? && !force? && !@reinstall
|
||||
raise CaskAlreadyInstalledAutoUpdatesError, @cask if @cask.auto_updates
|
||||
raise CaskAlreadyInstalledError, @cask
|
||||
end
|
||||
|
||||
@ -143,7 +142,7 @@ module Hbc
|
||||
def verify_has_sha
|
||||
odebug "Checking cask has checksum"
|
||||
return unless @cask.sha256 == :no_check
|
||||
raise CaskNoShasumError, @cask
|
||||
raise CaskNoShasumError, @cask.token
|
||||
end
|
||||
|
||||
def verify
|
||||
|
||||
@ -33,13 +33,13 @@ module Hbc
|
||||
end
|
||||
|
||||
def verify_checksum
|
||||
raise CaskSha256MissingError, "sha256 required: sha256 '#{computed}'" if expected.nil? || expected.empty?
|
||||
raise CaskSha256MissingError.new(cask.token, expected, computed) if expected.nil? || expected.empty?
|
||||
|
||||
if expected == computed
|
||||
odebug "SHA256 checksums match"
|
||||
else
|
||||
ohai 'Note: running "brew update" may fix sha256 checksum errors'
|
||||
raise CaskSha256MismatchError.new(downloaded_path, expected, computed)
|
||||
raise CaskSha256MismatchError.new(cask.token, expected, computed, downloaded_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
describe Hbc::CLI::Audit, :cask do
|
||||
let(:cask) { double }
|
||||
let(:cask) { double("cask", token: nil) }
|
||||
|
||||
describe "selection of Casks to audit" do
|
||||
it "audits all Casks if no tokens are given" do
|
||||
|
||||
@ -34,9 +34,9 @@ describe Hbc::CLI::Cat, :cask do
|
||||
end
|
||||
|
||||
it "raises an exception when the Cask does not exist" do
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("notacask")
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
expect { Hbc::CLI::Cat.run("notacask") }
|
||||
.to output(/is unavailable/).to_stderr
|
||||
.and raise_error(Hbc::CaskError, "Cat incomplete.")
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
|
||||
@ -54,7 +54,7 @@ describe Hbc::CLI::Fetch, :cask do
|
||||
shutup do
|
||||
Hbc::CLI::Fetch.run("notacask")
|
||||
end
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
}.to raise_error(Hbc::CaskError, "Fetch incomplete.")
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
|
||||
@ -41,7 +41,7 @@ describe Hbc::CLI::Install, :cask do
|
||||
|
||||
expect {
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
}.to output(/Warning: A Cask for local-transmission is already installed./).to_stderr
|
||||
}.to output(/Warning: Cask 'local-transmission' is already installed./).to_stderr
|
||||
end
|
||||
|
||||
it "allows double install with --force" do
|
||||
@ -70,7 +70,7 @@ describe Hbc::CLI::Install, :cask do
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("notacask")
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
}.to raise_error(Hbc::CaskError, "Install incomplete.")
|
||||
end
|
||||
|
||||
it "returns a suggestion for a misspelled Cask" do
|
||||
@ -80,7 +80,7 @@ describe Hbc::CLI::Install, :cask do
|
||||
rescue Hbc::CaskError
|
||||
nil
|
||||
end
|
||||
}.to output(/No available Cask for localcaffeine\. Did you mean:\nlocal-caffeine/).to_stderr
|
||||
}.to output(/Cask 'localcaffeine' is unavailable: No Cask with this name exists\. Did you mean:\nlocal-caffeine/).to_stderr
|
||||
end
|
||||
|
||||
it "returns multiple suggestions for a Cask fragment" do
|
||||
@ -90,7 +90,7 @@ describe Hbc::CLI::Install, :cask do
|
||||
rescue Hbc::CaskError
|
||||
nil
|
||||
end
|
||||
}.to output(/No available Cask for local-caf\. Did you mean one of:\nlocal-caffeine/).to_stderr
|
||||
}.to output(/Cask 'local-caf' is unavailable: No Cask with this name exists\. Did you mean one of:\nlocal-caffeine/).to_stderr
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
|
||||
@ -107,7 +107,7 @@ describe Hbc::CLI::Style, :cask do
|
||||
end
|
||||
|
||||
it "tries to find paths for all tokens" do
|
||||
expect(Hbc::CaskLoader).to receive(:path).twice
|
||||
expect(Hbc::CaskLoader).to receive(:load).twice.and_return(double("cask", sourcefile_path: nil))
|
||||
subject
|
||||
end
|
||||
end
|
||||
|
||||
@ -17,15 +17,15 @@ describe Hbc::CLI::Uninstall, :cask do
|
||||
end
|
||||
|
||||
it "shows an error when a bad Cask is provided" do
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("notacask")
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
expect { Hbc::CLI::Uninstall.run("notacask") }
|
||||
.to output(/is unavailable/).to_stderr
|
||||
.and raise_error(Hbc::CaskError, "Uninstall incomplete.")
|
||||
end
|
||||
|
||||
it "shows an error when a Cask is provided that's not installed" do
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("local-caffeine")
|
||||
}.to raise_error(Hbc::CaskNotInstalledError)
|
||||
expect { Hbc::CLI::Uninstall.run("local-caffeine") }
|
||||
.to output(/is not installed/).to_stderr
|
||||
.and raise_error(Hbc::CaskError, "Uninstall incomplete.")
|
||||
end
|
||||
|
||||
it "tries anyway on a non-present Cask when --force is given" do
|
||||
@ -89,11 +89,9 @@ describe Hbc::CLI::Uninstall, :cask do
|
||||
|
||||
Hbc.appdir.join("MyFancyApp.app").rmtree
|
||||
|
||||
expect {
|
||||
shutup do
|
||||
Hbc::CLI::Uninstall.run("with-uninstall-script-app")
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError, /does not exist/)
|
||||
expect { shutup { Hbc::CLI::Uninstall.run("with-uninstall-script-app") } }
|
||||
.to output(/does not exist/).to_stderr
|
||||
.and raise_error(Hbc::CaskError, "Uninstall incomplete.")
|
||||
|
||||
expect(cask).to be_installed
|
||||
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
describe Hbc::CLI::Zap, :cask do
|
||||
it "shows an error when a bad Cask is provided" do
|
||||
expect {
|
||||
Hbc::CLI::Zap.run("notacask")
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
expect { Hbc::CLI::Zap.run("notacask") }
|
||||
.to output(/is unavailable/).to_stderr
|
||||
.and raise_error(Hbc::CaskError, "Zap incomplete.")
|
||||
end
|
||||
|
||||
it "can zap and unlink multiple Casks at once" do
|
||||
|
||||
@ -57,7 +57,7 @@ describe Hbc::DSL, :cask do
|
||||
it "raises an error" do
|
||||
expect {
|
||||
cask
|
||||
}.to raise_error(Hbc::CaskTokenDoesNotMatchError, /Bad header line:.*does not match file name/)
|
||||
}.to raise_error(Hbc::CaskTokenMismatchError, /header line does not match the file name/)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -145,22 +145,6 @@ describe Hbc::Installer, :cask do
|
||||
expect(with_macosx_dir.staged_path.join("__MACOSX")).not_to be_a_directory
|
||||
end
|
||||
|
||||
it "installer method raises an exception when already-installed Casks which auto-update are attempted" do
|
||||
with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
|
||||
expect(with_auto_updates).not_to be_installed
|
||||
|
||||
installer = Hbc::Installer.new(with_auto_updates)
|
||||
|
||||
shutup do
|
||||
installer.install
|
||||
end
|
||||
|
||||
expect {
|
||||
installer.install
|
||||
}.to raise_error(Hbc::CaskAlreadyInstalledAutoUpdatesError)
|
||||
end
|
||||
|
||||
it "allows already-installed Casks which auto-update to be installed if force is provided" do
|
||||
with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
describe Hbc::Verify::Checksum, :cask do
|
||||
let(:cask) { double("cask") }
|
||||
let(:cask) { double("cask", token: "cask") }
|
||||
let(:downloaded_path) { double("downloaded_path") }
|
||||
let(:verification) { described_class.new(cask, downloaded_path) }
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user