aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/cask/lib')
-rw-r--r--Library/Homebrew/cask/lib/hbc/cask_loader.rb19
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli.rb50
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb38
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/audit.rb7
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/cat.rb10
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/cleanup.rb2
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/edit.rb10
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/fetch.rb9
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/home.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/info.rb6
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/install.rb39
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb18
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb35
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/list.rb44
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/outdated.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/reinstall.rb27
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/search.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/style.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/uninstall.rb13
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/zap.rb9
-rw-r--r--Library/Homebrew/cask/lib/hbc/exceptions.rb97
-rw-r--r--Library/Homebrew/cask/lib/hbc/installer.rb3
-rw-r--r--Library/Homebrew/cask/lib/hbc/scopes.rb1
-rw-r--r--Library/Homebrew/cask/lib/hbc/verify/checksum.rb4
24 files changed, 202 insertions, 255 deletions
diff --git a/Library/Homebrew/cask/lib/hbc/cask_loader.rb b/Library/Homebrew/cask/lib/hbc/cask_loader.rb
index a0c44d9b4..43fd9080d 100644
--- a/Library/Homebrew/cask/lib/hbc/cask_loader.rb
+++ b/Library/Homebrew/cask/lib/hbc/cask_loader.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli.rb b/Library/Homebrew/cask/lib/hbc/cli.rb
index 99980b88d..0108c1621 100644
--- a/Library/Homebrew/cask/lib/hbc/cli.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli.rb
@@ -66,7 +66,7 @@ module Hbc
option "--help", :help, false
# handled in OS::Mac
- option "--language a,b,c", ->(*) { raise OptionParser::InvalidOption }
+ option "--language a,b,c", ->(*) {}
# override default handling of --version
option "--version", ->(*) { raise OptionParser::InvalidOption }
@@ -92,10 +92,10 @@ module Hbc
command.is_a?(Class) && !command.abstract? && command.needs_init?
end
- def self.run_command(command, *rest)
+ def self.run_command(command, *args)
if command.respond_to?(:run)
# usual case: built-in command verb
- command.run(*rest)
+ command.run(*args)
elsif require?(which("brewcask-#{command}.rb"))
# external command as Ruby library on PATH, Homebrew-style
elsif command.to_s.include?("/") && require?(command.to_s)
@@ -111,7 +111,7 @@ module Hbc
if klass.respond_to?(:run)
# invoke "run" on a Ruby library which follows our coding conventions
# other Ruby libraries must do everything via "require"
- klass.run(*rest)
+ klass.run(*args)
end
elsif which("brewcask-#{command}")
# arbitrary external executable on PATH, Homebrew-style
@@ -124,7 +124,7 @@ module Hbc
exec command, *ARGV[1..-1]
else
# failure
- NullCommand.new(command).run
+ NullCommand.new(command, *args).run
end
end
@@ -136,18 +136,39 @@ module Hbc
@args = process_options(*args)
end
+ def detect_command_and_arguments(*args)
+ command = args.detect do |arg|
+ if self.class.commands.include?(arg)
+ true
+ else
+ break unless arg.start_with?("-")
+ end
+ end
+
+ if index = args.index(command)
+ args.delete_at(index)
+ end
+
+ [*command, *args]
+ end
+
def run
- command_name, *args = *@args
- command = help? ? "help" : self.class.lookup_command(command_name)
+ command_name, *args = detect_command_and_arguments(*@args)
+ command = if help?
+ args.unshift(command_name)
+ "help"
+ else
+ self.class.lookup_command(command_name)
+ end
MacOS.full_version = ENV["MACOS_VERSION"] unless ENV["MACOS_VERSION"].nil?
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") if ARGV.debug?
+ msg << e.backtrace.join("\n").prepend("\n") if ARGV.debug?
onoe msg
exit 1
rescue StandardError, ScriptError, NoMemoryError => e
@@ -199,18 +220,19 @@ module Hbc
end
class NullCommand
- def initialize(attempted_verb)
- @attempted_verb = attempted_verb
+ def initialize(command, *args)
+ @command = command
+ @args = args
end
def run(*_args)
purpose
usage
- return if @attempted_verb.to_s.strip.empty?
- return if @attempted_verb == "help"
+ return if @command == "help" && @args.empty?
- raise ArgumentError, "Unknown command: #{@attempted_verb}"
+ unknown_command = @args.empty? ? @command : @args.first
+ raise ArgumentError, "Unknown command: #{unknown_command}"
end
def purpose
diff --git a/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb b/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
index cdb7f5ec8..77f85301e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
@@ -9,6 +9,7 @@ module Hbc
option "--debug", :debug, false
option "--verbose", :verbose, false
option "--outdated", :outdated_only, false
+ option "--require-sha", :require_sha, false
def self.command_name
@command_name ||= name.sub(/^.*:/, "").gsub(/(.)([A-Z])/, '\1_\2').downcase
@@ -40,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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/audit.rb b/Library/Homebrew/cask/lib/hbc/cli/audit.rb
index 74d1ebfa7..35d82800c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/audit.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/audit.rb
@@ -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(" ")}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/cat.rb b/Library/Homebrew/cask/lib/hbc/cli/cat.rb
index e68481b46..d08c87bea 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/cat.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/cat.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb b/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
index 40b37dd5d..356162db5 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
@@ -20,7 +20,7 @@ module Hbc
end
def run
- remove_cache_files(*@args)
+ remove_cache_files(*args)
end
def cache_files
diff --git a/Library/Homebrew/cask/lib/hbc/cli/edit.rb b/Library/Homebrew/cask/lib/hbc/cli/edit.rb
index dec0fe36b..b9485886c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/edit.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/edit.rb
@@ -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}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/fetch.rb b/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
index 2c1cc5f66..e31b1a17c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
@@ -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}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/home.rb b/Library/Homebrew/cask/lib/hbc/cli/home.rb
index 009bc1e3e..d496e309e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/home.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/home.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/info.rb b/Library/Homebrew/cask/lib/hbc/cli/info.rb
index 623c4b737..d26747e17 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/info.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/info.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/install.rb b/Library/Homebrew/cask/lib/hbc/cli/install.rb
index 72f85fc69..0f1a5dd34 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/install.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/install.rb
@@ -3,7 +3,6 @@ module Hbc
class Install < AbstractCommand
option "--force", :force, false
option "--skip-cask-deps", :skip_cask_deps, false
- option "--require-sha", :require_sha, false
def initialize(*)
super
@@ -11,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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb b/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
index 78dbf1622..e21ce86b6 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb b/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
index 86dee7c9c..4515fe931 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/list.rb b/Library/Homebrew/cask/lib/hbc/cli/list.rb
index 9d2ded4be..9d978360e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/list.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/list.rb
@@ -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
-
- args.each do |cask_token|
- odebug "Listing files for Cask #{cask_token}"
- begin
- cask = CaskLoader.load(cask_token)
+ casks.each do |cask|
+ raise CaskNotInstalledError, cask unless cask.installed?
- 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)
diff --git a/Library/Homebrew/cask/lib/hbc/cli/outdated.rb b/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
index 7877ead05..b0a84e8d2 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb b/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
index eb5f45c90..337a2eb9d 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/search.rb b/Library/Homebrew/cask/lib/hbc/cli/search.rb
index b24091aef..9d1a16f15 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/search.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/search.rb
@@ -1,10 +1,6 @@
module Hbc
class CLI
class Search < AbstractCommand
- def initialize(*args)
- @args = args
- end
-
def run
results = self.class.search(*args)
self.class.render_results(*results)
diff --git a/Library/Homebrew/cask/lib/hbc/cli/style.rb b/Library/Homebrew/cask/lib/hbc/cli/style.rb
index 97208232b..86fc98eaa 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/style.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/style.rb
@@ -1,5 +1,3 @@
-require "English"
-
module Hbc
class CLI
class Style < AbstractCommand
@@ -33,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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb b/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
index 33ee5afa9..c0697c808 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/cli/zap.rb b/Library/Homebrew/cask/lib/hbc/cli/zap.rb
index 3c07ff9e8..d12943106 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/zap.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/zap.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/exceptions.rb b/Library/Homebrew/cask/lib/hbc/exceptions.rb
index b9d305a9b..d9e1b07db 100644
--- a/Library/Homebrew/cask/lib/hbc/exceptions.rb
+++ b/Library/Homebrew/cask/lib/hbc/exceptions.rb
@@ -3,56 +3,40 @@ 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
- To re-install #{token}, run:
- brew cask reinstall #{token}
- EOS
- end
- end
+ Cask '#{token}' is already installed.
- class CaskAlreadyInstalledAutoUpdatesError < CaskAlreadyInstalledError
- def to_s
- s = <<-EOS.undent
- A Cask for #{token} is already installed and using auto-updates.
+ To re-install #{token}, run:
+ #{Formatter.identifier("brew cask reinstall #{token}")}
EOS
-
- s.concat("\n").concat(reinstall_message)
end
end
@@ -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
- sha256 mismatch
- Expected: #{expected}
- Actual: #{actual}
- File: #{path}
- To retry an incomplete download, remove the file above.
+ Cask '#{token}' requires a checksum:
+ #{Formatter.identifier("sha256 '#{actual}'")}
EOS
end
end
- class CaskNoShasumError < CaskError
- attr_reader :token
- def initialize(token)
- @token = token
+ class CaskSha256MismatchError < CaskSha256Error
+ attr_reader :path
+
+ def initialize(token, expected, actual, path)
+ super(token, expected, actual)
+ @path = path
+ end
+
+ def to_s
+ <<-EOS.undent
+ 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 < 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
diff --git a/Library/Homebrew/cask/lib/hbc/installer.rb b/Library/Homebrew/cask/lib/hbc/installer.rb
index 7da9731e5..aa6d600f7 100644
--- a/Library/Homebrew/cask/lib/hbc/installer.rb
+++ b/Library/Homebrew/cask/lib/hbc/installer.rb
@@ -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
diff --git a/Library/Homebrew/cask/lib/hbc/scopes.rb b/Library/Homebrew/cask/lib/hbc/scopes.rb
index 149c2c343..a469ae0fa 100644
--- a/Library/Homebrew/cask/lib/hbc/scopes.rb
+++ b/Library/Homebrew/cask/lib/hbc/scopes.rb
@@ -27,6 +27,7 @@ module Hbc
# TODO: speed up Hbc::Source::Tapped (main perf drag is calling Hbc.all_tokens repeatedly)
# TODO: ability to specify expected source when calling CaskLoader.load (minor perf benefit)
Pathname.glob(caskroom.join("*"))
+ .sort
.map do |caskroom_path|
token = caskroom_path.basename.to_s
diff --git a/Library/Homebrew/cask/lib/hbc/verify/checksum.rb b/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
index d079a4446..620703d31 100644
--- a/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
+++ b/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
@@ -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