Merge pull request #7853 from MLH-Fellowship/integrate-uninstall-reinstall
Allow references to casks when running uninstall and reinstall
This commit is contained in:
commit
1558179a50
@ -36,9 +36,11 @@ module Homebrew
|
|||||||
# Reset cache values reliant on named_args
|
# Reset cache values reliant on named_args
|
||||||
@formulae = nil
|
@formulae = nil
|
||||||
@resolved_formulae = nil
|
@resolved_formulae = nil
|
||||||
|
@resolved_formulae_casks = nil
|
||||||
@formulae_paths = nil
|
@formulae_paths = nil
|
||||||
@casks = nil
|
@casks = nil
|
||||||
@kegs = nil
|
@kegs = nil
|
||||||
|
@kegs_casks = nil
|
||||||
|
|
||||||
self[:named_args] = named_args
|
self[:named_args] = named_args
|
||||||
self[:named_args].freeze
|
self[:named_args].freeze
|
||||||
@ -96,6 +98,25 @@ module Homebrew
|
|||||||
end.uniq(&:name).freeze
|
end.uniq(&:name).freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def resolved_formulae_casks
|
||||||
|
@resolved_formulae_casks ||= begin
|
||||||
|
resolved_formulae = []
|
||||||
|
casks = []
|
||||||
|
|
||||||
|
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
|
||||||
|
end
|
||||||
|
|
||||||
def formulae_paths
|
def formulae_paths
|
||||||
@formulae_paths ||= (downcased_unique_named - casks).map do |name|
|
@formulae_paths ||= (downcased_unique_named - casks).map do |name|
|
||||||
Formulary.path(name)
|
Formulary.path(name)
|
||||||
@ -108,57 +129,35 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
|
|
||||||
def kegs
|
def kegs
|
||||||
require "keg"
|
|
||||||
require "formula"
|
|
||||||
require "missing_formula"
|
|
||||||
|
|
||||||
@kegs ||= downcased_unique_named.map do |name|
|
@kegs ||= downcased_unique_named.map do |name|
|
||||||
raise UsageError if name.empty?
|
resolve_keg name
|
||||||
|
rescue NoSuchKegError => e
|
||||||
rack = Formulary.to_rack(name.downcase)
|
if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall"))
|
||||||
|
$stderr.puts reason
|
||||||
dirs = rack.directory? ? rack.subdirs : []
|
|
||||||
|
|
||||||
if dirs.empty?
|
|
||||||
if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall"))
|
|
||||||
$stderr.puts reason
|
|
||||||
end
|
|
||||||
raise NoSuchKegError, rack.basename
|
|
||||||
end
|
|
||||||
|
|
||||||
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
|
||||||
|
raise e
|
||||||
end.freeze
|
end.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def kegs_casks
|
||||||
|
@kegs_casks ||= begin
|
||||||
|
kegs = []
|
||||||
|
casks = []
|
||||||
|
|
||||||
|
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
|
||||||
|
end
|
||||||
|
|
||||||
|
[kegs.freeze, casks.freeze].freeze
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def build_stable?
|
def build_stable?
|
||||||
!(HEAD? || devel?)
|
!(HEAD? || devel?)
|
||||||
end
|
end
|
||||||
@ -241,6 +240,50 @@ module Homebrew
|
|||||||
default
|
default
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def resolve_keg(name)
|
||||||
|
require "keg"
|
||||||
|
require "formula"
|
||||||
|
require "missing_formula"
|
||||||
|
|
||||||
|
raise UsageError if name.blank?
|
||||||
|
|
||||||
|
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} has multiple installed versions"
|
||||||
|
end
|
||||||
|
|
||||||
|
Keg.new(prefix)
|
||||||
|
end
|
||||||
|
rescue FormulaUnavailableError
|
||||||
|
raise MultipleVersionsInstalledError, <<~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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -6,6 +6,9 @@ require "messages"
|
|||||||
require "reinstall"
|
require "reinstall"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
require "cleanup"
|
require "cleanup"
|
||||||
|
require "cask/cmd"
|
||||||
|
require "cask/utils"
|
||||||
|
require "cask/macos"
|
||||||
require "upgrade"
|
require "upgrade"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
@ -57,7 +60,8 @@ module Homebrew
|
|||||||
|
|
||||||
Install.perform_preinstall_checks
|
Install.perform_preinstall_checks
|
||||||
|
|
||||||
args.resolved_formulae.each do |f|
|
resolved_formulae, casks = args.resolved_formulae_casks
|
||||||
|
resolved_formulae.each do |f|
|
||||||
if f.pinned?
|
if f.pinned?
|
||||||
onoe "#{f.full_name} is pinned. You must unpin it to reinstall."
|
onoe "#{f.full_name} is pinned. You must unpin it to reinstall."
|
||||||
next
|
next
|
||||||
@ -70,5 +74,12 @@ module Homebrew
|
|||||||
check_installed_dependents
|
check_installed_dependents
|
||||||
|
|
||||||
Homebrew.messages.display_messages
|
Homebrew.messages.display_messages
|
||||||
|
|
||||||
|
return if casks.blank?
|
||||||
|
|
||||||
|
reinstall_cmd = Cask::Cmd::Reinstall.new(casks)
|
||||||
|
reinstall_cmd.verbose = args.verbose?
|
||||||
|
reinstall_cmd.force = args.force?
|
||||||
|
reinstall_cmd.run
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -5,6 +5,9 @@ require "formula"
|
|||||||
require "diagnostic"
|
require "diagnostic"
|
||||||
require "migrator"
|
require "migrator"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
|
require "cask/all"
|
||||||
|
require "cask/cmd"
|
||||||
|
require "cask/cask_loader"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module_function
|
module_function
|
||||||
@ -29,15 +32,26 @@ module Homebrew
|
|||||||
def uninstall
|
def uninstall
|
||||||
uninstall_args.parse
|
uninstall_args.parse
|
||||||
|
|
||||||
kegs_by_rack = if args.force?
|
if args.force?
|
||||||
Hash[args.named.map do |name|
|
casks = []
|
||||||
rack = Formulary.to_rack(name)
|
kegs_by_rack = {}
|
||||||
next unless rack.directory?
|
|
||||||
|
|
||||||
[rack, rack.subdirs.map { |d| Keg.new(d) }]
|
args.named.each do |name|
|
||||||
end]
|
rack = Formulary.to_rack(name)
|
||||||
|
|
||||||
|
if rack.directory?
|
||||||
|
kegs_by_rack[rack] = rack.subdirs.map { |d| Keg.new(d) }
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
casks << Cask::CaskLoader.load(name)
|
||||||
|
rescue Cask::CaskUnavailableError
|
||||||
|
# Since the uninstall was forced, ignore any unavailable casks
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
args.kegs.group_by(&:rack)
|
all_kegs, casks = args.kegs_casks
|
||||||
|
kegs_by_rack = all_kegs.group_by(&:rack)
|
||||||
end
|
end
|
||||||
|
|
||||||
handle_unsatisfied_dependents(kegs_by_rack)
|
handle_unsatisfied_dependents(kegs_by_rack)
|
||||||
@ -108,6 +122,13 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return if casks.blank?
|
||||||
|
|
||||||
|
cask_uninstall = Cask::Cmd::Uninstall.new(casks)
|
||||||
|
cask_uninstall.force = args.force?
|
||||||
|
cask_uninstall.verbose = args.verbose?
|
||||||
|
cask_uninstall.run
|
||||||
rescue MultipleVersionsInstalledError => e
|
rescue MultipleVersionsInstalledError => e
|
||||||
ofail e
|
ofail e
|
||||||
puts "Run `brew uninstall --force #{e.name}` to remove all versions."
|
puts "Run `brew uninstall --force #{e.name}` to remove all versions."
|
||||||
|
|||||||
@ -29,14 +29,7 @@ class KegUnspecifiedError < UsageError
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class MultipleVersionsInstalledError < RuntimeError
|
class MultipleVersionsInstalledError < RuntimeError; end
|
||||||
attr_reader :name
|
|
||||||
|
|
||||||
def initialize(name)
|
|
||||||
@name = name
|
|
||||||
super "#{name} has multiple installed versions"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class NotAKegError < RuntimeError; end
|
class NotAKegError < RuntimeError; end
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
require "exceptions"
|
require "exceptions"
|
||||||
|
|
||||||
describe MultipleVersionsInstalledError do
|
describe MultipleVersionsInstalledError do
|
||||||
subject { described_class.new("foo") }
|
subject { described_class.new("foo has multiple installed versions") }
|
||||||
|
|
||||||
its(:to_s) { is_expected.to eq("foo has multiple installed versions") }
|
its(:to_s) { is_expected.to eq("foo has multiple installed versions") }
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user