args: Refactor to load casks directly
This commit is contained in:
parent
4dc2df6e6a
commit
8a05b5258a
@ -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 = []
|
||||
unknowns = []
|
||||
casks = []
|
||||
|
||||
downcased_unique_named.each do |name|
|
||||
resolved_formulae << Formulary.resolve(name, spec: spec(nil))
|
||||
rescue FormulaUnavailableError
|
||||
unknowns << name
|
||||
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 = []
|
||||
unknowns = []
|
||||
casks = []
|
||||
|
||||
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)
|
||||
casks << Cask::CaskLoader.load(name)
|
||||
rescue Cask::CaskUnavailableError
|
||||
raise "No installed keg or cask with the name \"#{name}\""
|
||||
end
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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."
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user