diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 987ab61946..de2d784a2b 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -36,11 +36,11 @@ module Homebrew # Reset cache values reliant on named_args @formulae = nil @resolved_formulae = nil - @resolved_formulae_and_unknowns = nil + @resolved_formulae_casks = nil @formulae_paths = nil @casks = nil @kegs = nil - @kegs_and_unknowns = nil + @kegs_casks = nil self[:named_args] = named_args self[:named_args].freeze @@ -98,17 +98,23 @@ module Homebrew end.uniq(&:name).freeze end - def resolved_formulae_and_unknowns - return @resolved_formulae_and_unknowns if @resolved_formulae_and_unknowns + def resolved_formulae_casks + @resolved_formulae_casks ||= begin + resolved_formulae = [] + casks = [] - resolved_formulae = [] - unknowns = [] - downcased_unique_named.each do |name| - resolved_formulae << Formulary.resolve(name, spec: spec(nil)) - rescue FormulaUnavailableError - unknowns << name + downcased_unique_named.each do |name| + resolved_formulae << Formulary.resolve(name, spec: spec(nil)) + rescue FormulaUnavailableError + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + raise "No available formula or cask with the name \"#{name}\"" + end + end + + [resolved_formulae.freeze, casks.freeze].freeze end - @resolved_formulae_and_unknowns = [resolved_formulae.freeze, unknowns.freeze].freeze end def formulae_paths @@ -133,62 +139,22 @@ module Homebrew end.freeze end - def kegs_and_unknowns - return @kegs_and_unknowns if @kegs_and_unknowns + def kegs_casks + @kegs_casks ||= begin + kegs = [] + casks = [] - kegs = [] - unknowns = [] - downcased_unique_named.each do |name| - kegs << resolve_keg(name) - rescue NoSuchKegError - unknowns << name - end - - @kegs_and_unknowns = [kegs.freeze, unknowns.freeze].freeze - end - - def resolve_keg(name) - require "keg" - require "formula" - require "missing_formula" - - raise UsageError if name.empty? - - rack = Formulary.to_rack(name.downcase) - - dirs = rack.directory? ? rack.subdirs : [] - - raise NoSuchKegError, rack.basename if dirs.empty? - - linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename - opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" - - begin - if opt_prefix.symlink? && opt_prefix.directory? - Keg.new(opt_prefix.resolved_path) - elsif linked_keg_ref.symlink? && linked_keg_ref.directory? - Keg.new(linked_keg_ref.resolved_path) - elsif dirs.length == 1 - Keg.new(dirs.first) - else - f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) + downcased_unique_named.each do |name| + kegs << resolve_keg(name) + rescue NoSuchKegError + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + raise "No installed keg or cask with the name \"#{name}\"" end - - unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename - end - - Keg.new(prefix) end - rescue FormulaUnavailableError - raise <<~EOS - Multiple kegs installed to #{rack} - However we don't know which one you refer to. - Please delete (with rm -rf!) all but one and then try again. - EOS + + [kegs.freeze, casks.freeze].freeze end end @@ -274,6 +240,51 @@ module Homebrew default end end + + def resolve_keg(name) + require "keg" + require "formula" + require "missing_formula" + + raise UsageError if name.empty? + + rack = Formulary.to_rack(name.downcase) + + dirs = rack.directory? ? rack.subdirs : [] + + raise NoSuchKegError, rack.basename if dirs.empty? + + linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename + opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + + begin + if opt_prefix.symlink? && opt_prefix.directory? + Keg.new(opt_prefix.resolved_path) + elsif linked_keg_ref.symlink? && linked_keg_ref.directory? + Keg.new(linked_keg_ref.resolved_path) + elsif dirs.length == 1 + Keg.new(dirs.first) + else + f = if name.include?("/") || File.exist?(name) + Formulary.factory(name) + else + Formulary.from_rack(rack) + end + + unless (prefix = f.installed_prefix).directory? + raise MultipleVersionsInstalledError, rack.basename + end + + Keg.new(prefix) + end + rescue FormulaUnavailableError + raise <<~EOS + Multiple kegs installed to #{rack} + However we don't know which one you refer to. + Please delete (with rm -rf!) all but one and then try again. + EOS + end + end end end end diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 3f47614ddc..87fdfd577d 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -57,7 +57,7 @@ module Homebrew Install.perform_preinstall_checks - resolved_formulae, possible_casks = args.resolved_formulae_and_unknowns + resolved_formulae, casks = args.resolved_formulae_casks resolved_formulae.each do |f| if f.pinned? onoe "#{f.full_name} is pinned. You must unpin it to reinstall." @@ -69,13 +69,11 @@ module Homebrew end Homebrew.messages.display_messages - possible_casks.each do |name| - reinstall_cmd = Cask::Cmd::Reinstall.new(name) + unless casks.empty? + reinstall_cmd = Cask::Cmd::Reinstall.new(casks) reinstall_cmd.verbose = args.verbose? reinstall_cmd.force = args.force? reinstall_cmd.run - rescue Cask::CaskUnavailableError - ofail "No installed keg or cask with the name \"#{name}\"" end end end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 3d16ec70f5..1ee0616681 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -33,20 +33,24 @@ module Homebrew uninstall_args.parse if args.force? - possible_casks = [] + casks = [] kegs_by_rack = Hash[args.named.map do |name| rack = Formulary.to_rack(name) unless rack.directory? - possible_casks << name + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + # Since the uninstall was forced, ignore any unavailable casks + end next end [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - kegs_, possible_casks = args.kegs_and_unknowns - kegs_by_rack = kegs_.group_by(&:rack) + _kegs, casks = args.kegs_casks + kegs_by_rack = _kegs.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -118,14 +122,13 @@ module Homebrew end end - possible_casks.each do |name| - cmd = Cask::Cmd::Uninstall.new(name) - cmd.force = args.force? - cmd.verbose = args.verbose? - cmd.run - rescue Cask::CaskUnavailableError - ofail "No installed keg or cask with the name \"#{name}\"" + unless casks.empty? + cask_uninstall = Cask::Cmd::Uninstall.new(casks) + cask_uninstall.force = args.force? + cask_uninstall.verbose = args.verbose? + cask_uninstall.run end + rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions."