From cbfea6c125247fa302b11c3062df570d5847501a Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 11:59:07 -0400 Subject: [PATCH 01/20] args: Add field for kegs and unknowns --- Library/Homebrew/cli/args.rb | 91 ++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index ac5fd1875b00d..90e5f4a11df82 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -39,6 +39,7 @@ def freeze_named_args!(named_args) @formulae_paths = nil @casks = nil @kegs = nil + @kegs_and_unknowns = nil self[:named_args] = named_args self[:named_args].freeze @@ -108,55 +109,73 @@ def casks end def kegs + @kegs ||= downcased_unique_named.map do |name| + resolve_keg name + rescue NoSuchKegError => e + if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall")) + $stderr.puts reason + end + raise e + end.freeze + end + + def kegs_and_unknowns + return @kegs_and_unknowns if @kegs_and_unknowns + + kegs = [] + unknowns = [] + downcased_unique_named.each do |name| + kegs << resolve_keg(name) + rescue NoSuchKegError + unknowns << name + end + + @kegs_and_unknowns = [kegs, unknowns] + end + + def resolve_keg(name) require "keg" require "formula" require "missing_formula" - @kegs ||= downcased_unique_named.map do |name| - raise UsageError if name.empty? + raise UsageError if name.empty? - rack = Formulary.to_rack(name.downcase) + rack = Formulary.to_rack(name.downcase) - dirs = rack.directory? ? rack.subdirs : [] + 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 + raise NoSuchKegError, rack.basename if dirs.empty? - linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename - opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + 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) + 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 - 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 + Formulary.from_rack(rack) + end - Keg.new(prefix) + unless (prefix = f.installed_prefix).directory? + raise MultipleVersionsInstalledError, rack.basename 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 + + Keg.new(prefix) end - end.freeze + 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 def build_stable? From 90c26dadc7ec5021716fc0674b4b8b8dd8965293 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 11:59:55 -0400 Subject: [PATCH 02/20] uninstall: Add ability to reference casks from brew uninstall --- Library/Homebrew/cask/cmd/uninstall.rb | 30 +++++++++++++++----------- Library/Homebrew/cmd/uninstall.rb | 24 +++++++++++++++++---- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index dfa8bbfb77617..389fdb2792709 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,24 +12,28 @@ def initialize(*) def run casks.each do |cask| - odebug "Uninstalling Cask #{cask}" + uninstall_cask cask, binaries?, verbose?, force? + end + end - raise CaskNotInstalledError, cask unless cask.installed? || force? + def self.uninstall_cask(cask, binaries, verbose, force) + odebug "Uninstalling Cask #{cask}" - if cask.installed? && !cask.installed_caskfile.nil? - # use the same cask file that was used for installation, if possible - cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? - end + raise CaskNotInstalledError, cask unless cask.installed? || force - Installer.new(cask, binaries: binaries?, verbose: verbose?, force: force?).uninstall + if cask.installed? && !cask.installed_caskfile.nil? + # use the same cask file that was used for installation, if possible + cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? + end - next if (versions = cask.versions).empty? + Installer.new(cask, binaries: binaries, verbose: verbose, force: force).uninstall - puts <<~EOS - #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. - Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. - EOS - end + return if (versions = cask.versions).empty? + + puts <<~EOS + #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. + Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. + EOS end def self.help diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index af66c9ac1e18f..7da4306b7a401 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -5,6 +5,9 @@ require "diagnostic" require "migrator" require "cli/parser" +require "cask/all" +require "cask/cmd" +require "cask/cask_loader" module Homebrew module_function @@ -29,15 +32,21 @@ def uninstall_args def uninstall uninstall_args.parse - kegs_by_rack = if args.force? - Hash[args.named.map do |name| + if args.force? + possible_casks = [] + kegs_by_rack = Hash[args.named.map do |name| rack = Formulary.to_rack(name) - next unless rack.directory? + + unless rack.directory? + possible_casks << name + next + end [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - args.kegs.group_by(&:rack) + kegs_, possible_casks = args.kegs_and_unknowns + kegs_by_rack = kegs_.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -108,6 +117,13 @@ def uninstall end end end + + possible_casks.each do |name| + cask = Cask::CaskLoader.load name + Cask::Cmd::Uninstall.uninstall_cask(cask, true, args.verbose, args.force?) + rescue Cask::CaskUnavailableError + ofail "No installed keg or cask with the name \"#{name}\"" + end rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From 16f16f3a383b8094c25ec97441c5944c7aee735a Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 14:10:49 -0400 Subject: [PATCH 03/20] uninstall: Add test for uninstalling cask --- Library/Homebrew/cask/cmd/uninstall.rb | 2 +- Library/Homebrew/test/cmd/uninstall_spec.rb | 47 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index 389fdb2792709..d554b6853d42d 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,7 +12,7 @@ def initialize(*) def run casks.each do |cask| - uninstall_cask cask, binaries?, verbose?, force? + self.class.uninstall_cask cask, binaries?, verbose?, force? end end diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 696be790e37c7..247f1df374547 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -17,6 +17,53 @@ .and not_to_output.to_stderr .and be_a_success end + + it "uninstalls a given Cask" do + caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) + Cask::Installer.new(caffeine).install + + expect { brew "uninstall", "local-caffeine" } + .to output(/Uninstalling Cask local-caffeine/).to_stdout + .and not_to_output.to_stderr + .and be_a_success + + expect(caffeine).not_to be_installed + + # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it + expect( + Find.find(TEST_TMPDIR) + .reject { |f| File.basename(f) == ".DS_Store" } + .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, + ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) + + rm_r "#{TEST_TMPDIR}/cask-appdir" + end + + it "uninstalls given Formulae and Casks" do + install_test_formula "testball" + + caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) + Cask::Installer.new(caffeine).install + + expect { brew "uninstall", "testball", "local-caffeine" } + .to output(%r{ + Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n + ==>\sUninstalling\sCask\slocal-caffeine + }x).to_stdout + .and not_to_output.to_stderr + .and be_a_success + + expect(caffeine).not_to be_installed + + # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it + expect( + Find.find(TEST_TMPDIR) + .reject { |f| File.basename(f) == ".DS_Store" } + .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, + ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) + + rm_r "#{TEST_TMPDIR}/cask-appdir" + end end describe Homebrew do From 5900263cabb8cb653ea698ea89990cf134afb3d1 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 14:53:03 -0400 Subject: [PATCH 04/20] args: Add resolved_formulae_and_unknowns --- Library/Homebrew/cli/args.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 90e5f4a11df82..987ab61946a5c 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -36,6 +36,7 @@ def freeze_named_args!(named_args) # Reset cache values reliant on named_args @formulae = nil @resolved_formulae = nil + @resolved_formulae_and_unknowns = nil @formulae_paths = nil @casks = nil @kegs = nil @@ -97,6 +98,19 @@ def resolved_formulae end.uniq(&:name).freeze end + def resolved_formulae_and_unknowns + return @resolved_formulae_and_unknowns if @resolved_formulae_and_unknowns + + resolved_formulae = [] + unknowns = [] + downcased_unique_named.each do |name| + resolved_formulae << Formulary.resolve(name, spec: spec(nil)) + rescue FormulaUnavailableError + unknowns << name + end + @resolved_formulae_and_unknowns = [resolved_formulae.freeze, unknowns.freeze].freeze + end + def formulae_paths @formulae_paths ||= (downcased_unique_named - casks).map do |name| Formulary.path(name) @@ -130,7 +144,7 @@ def kegs_and_unknowns unknowns << name end - @kegs_and_unknowns = [kegs, unknowns] + @kegs_and_unknowns = [kegs.freeze, unknowns.freeze].freeze end def resolve_keg(name) From d1004c81430d6b893ff487a32b9c4fe70131a943 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 15:03:35 -0400 Subject: [PATCH 05/20] reinstall: Add ability to reference casks from brew reinstall --- Library/Homebrew/cmd/reinstall.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index c6abc8fa36e5c..3f47614ddce5a 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -6,6 +6,7 @@ require "reinstall" require "cli/parser" require "cleanup" +require "cask/all" module Homebrew module_function @@ -56,7 +57,8 @@ def reinstall Install.perform_preinstall_checks - args.resolved_formulae.each do |f| + resolved_formulae, possible_casks = args.resolved_formulae_and_unknowns + resolved_formulae.each do |f| if f.pinned? onoe "#{f.full_name} is pinned. You must unpin it to reinstall." next @@ -66,5 +68,14 @@ def reinstall Cleanup.install_formula_clean!(f) end Homebrew.messages.display_messages + + possible_casks.each do |name| + reinstall_cmd = Cask::Cmd::Reinstall.new(name) + 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 From e733fa16a2365003d94d1fa7eccaa1f2adfcf324 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 15:08:42 -0400 Subject: [PATCH 06/20] uninstall: Refactor to use AbstractCommand instead of declaring a class method --- Library/Homebrew/cask/cmd/uninstall.rb | 30 +++++++++++--------------- Library/Homebrew/cmd/uninstall.rb | 6 ++++-- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index d554b6853d42d..dfa8bbfb77617 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,28 +12,24 @@ def initialize(*) def run casks.each do |cask| - self.class.uninstall_cask cask, binaries?, verbose?, force? - end - end + odebug "Uninstalling Cask #{cask}" - def self.uninstall_cask(cask, binaries, verbose, force) - odebug "Uninstalling Cask #{cask}" + raise CaskNotInstalledError, cask unless cask.installed? || force? - raise CaskNotInstalledError, cask unless cask.installed? || force + if cask.installed? && !cask.installed_caskfile.nil? + # use the same cask file that was used for installation, if possible + cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? + end - if cask.installed? && !cask.installed_caskfile.nil? - # use the same cask file that was used for installation, if possible - cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? - end + Installer.new(cask, binaries: binaries?, verbose: verbose?, force: force?).uninstall - Installer.new(cask, binaries: binaries, verbose: verbose, force: force).uninstall + next if (versions = cask.versions).empty? - return if (versions = cask.versions).empty? - - puts <<~EOS - #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. - Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. - EOS + puts <<~EOS + #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. + Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. + EOS + end end def self.help diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 7da4306b7a401..3d16ec70f5e89 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -119,8 +119,10 @@ def uninstall end possible_casks.each do |name| - cask = Cask::CaskLoader.load name - Cask::Cmd::Uninstall.uninstall_cask(cask, true, args.verbose, args.force?) + 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}\"" end From f03336bb4077f5dd0c71f44088ed29ec638749e4 Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 25 Jun 2020 09:13:02 -0400 Subject: [PATCH 07/20] uninstall: Clean up cask-appdir after tests --- Library/Homebrew/test/cmd/uninstall_spec.rb | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 247f1df374547..9d0e5590d7fb4 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -29,14 +29,7 @@ expect(caffeine).not_to be_installed - # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it - expect( - Find.find(TEST_TMPDIR) - .reject { |f| File.basename(f) == ".DS_Store" } - .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, - ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) - - rm_r "#{TEST_TMPDIR}/cask-appdir" + rm_r(TEST_TMPDIR + "/cask-appdir") end it "uninstalls given Formulae and Casks" do @@ -55,14 +48,7 @@ expect(caffeine).not_to be_installed - # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it - expect( - Find.find(TEST_TMPDIR) - .reject { |f| File.basename(f) == ".DS_Store" } - .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, - ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) - - rm_r "#{TEST_TMPDIR}/cask-appdir" + rm_r(TEST_TMPDIR + "/cask-appdir") end end From 4dc2df6e6a8c69365a0990bba707bf81c8e2eb7f Mon Sep 17 00:00:00 2001 From: William Ma Date: Mon, 29 Jun 2020 10:13:29 -0400 Subject: [PATCH 08/20] uninstall: Run cask uninstall tests only on macos --- Library/Homebrew/test/cmd/uninstall_spec.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 9d0e5590d7fb4..7edabe911ec4c 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -17,15 +17,17 @@ .and not_to_output.to_stderr .and be_a_success end +end +describe "brew uninstall cask", :integration_test, :needs_macos do it "uninstalls a given Cask" do caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) Cask::Installer.new(caffeine).install expect { brew "uninstall", "local-caffeine" } .to output(/Uninstalling Cask local-caffeine/).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed @@ -43,8 +45,8 @@ Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n ==>\sUninstalling\sCask\slocal-caffeine }x).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed From 8a05b5258a23125bd4cbadb8a8c8bb15f8ff3e96 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 12:08:03 -0400 Subject: [PATCH 09/20] args: Refactor to load casks directly --- Library/Homebrew/cli/args.rb | 141 ++++++++++++++++-------------- Library/Homebrew/cmd/reinstall.rb | 8 +- Library/Homebrew/cmd/uninstall.rb | 25 +++--- 3 files changed, 93 insertions(+), 81 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 987ab61946a5c..de2d784a2b6b6 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -36,11 +36,11 @@ def freeze_named_args!(named_args) # 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 @@ def resolved_formulae 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 = [] + + 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 = [] - unknowns = [] - downcased_unique_named.each do |name| - resolved_formulae << Formulary.resolve(name, spec: spec(nil)) - rescue FormulaUnavailableError - unknowns << name + [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 @@ def kegs end.freeze end - def kegs_and_unknowns - return @kegs_and_unknowns if @kegs_and_unknowns - - 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) - end - - unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename + 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 - - 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 @@ def spec(default = :stable) 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 3f47614ddce5a..87fdfd577d9ae 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -57,7 +57,7 @@ def reinstall 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 @@ def reinstall 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 3d16ec70f5e89..1ee0616681060 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -33,20 +33,24 @@ def uninstall 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 @@ def uninstall 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." From dff61c9eab54f21329e537b8d7c34a9671805db7 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 12:21:21 -0400 Subject: [PATCH 10/20] style: Fix style issues --- Library/Homebrew/cli/args.rb | 8 ++++---- Library/Homebrew/cmd/reinstall.rb | 12 ++++++------ Library/Homebrew/cmd/uninstall.rb | 5 ++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index de2d784a2b6b6..7f76690df7207 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -266,10 +266,10 @@ def resolve_keg(name) Keg.new(dirs.first) else f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) - end + Formulary.factory(name) + else + Formulary.from_rack(rack) + end unless (prefix = f.installed_prefix).directory? raise MultipleVersionsInstalledError, rack.basename diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 87fdfd577d9ae..7d6a566af89fb 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -69,11 +69,11 @@ def reinstall end Homebrew.messages.display_messages - unless casks.empty? - reinstall_cmd = Cask::Cmd::Reinstall.new(casks) - reinstall_cmd.verbose = args.verbose? - reinstall_cmd.force = args.force? - reinstall_cmd.run - end + return if casks.empty? + + reinstall_cmd = Cask::Cmd::Reinstall.new(casks) + reinstall_cmd.verbose = args.verbose? + reinstall_cmd.force = args.force? + reinstall_cmd.run end end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 1ee0616681060..55b70fb16cfd1 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -49,8 +49,8 @@ def uninstall [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - _kegs, casks = args.kegs_casks - kegs_by_rack = _kegs.group_by(&:rack) + all_kegs, casks = args.kegs_casks + kegs_by_rack = all_kegs.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -128,7 +128,6 @@ def uninstall 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." From f3ae2fdfdc6adf14285f99d55af5592810cacd55 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:22:21 -0400 Subject: [PATCH 11/20] reinstall: Replace with more specific imports --- Library/Homebrew/cmd/reinstall.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 7d6a566af89fb..6286d6bef0025 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -6,7 +6,9 @@ require "reinstall" require "cli/parser" require "cleanup" -require "cask/all" +require "cask/cmd" +require "cask/utils" +require "cask/macos" module Homebrew module_function From 72dcbd6fda2c884f54edd0ded42bcfed2f276342 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:43:45 -0400 Subject: [PATCH 12/20] style: Dedent cask uninstall block --- Library/Homebrew/cmd/uninstall.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 55b70fb16cfd1..1764b6eb698dd 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -122,12 +122,12 @@ def uninstall end end - unless casks.empty? - cask_uninstall = Cask::Cmd::Uninstall.new(casks) - cask_uninstall.force = args.force? - cask_uninstall.verbose = args.verbose? - cask_uninstall.run - end + return if casks.empty? + + cask_uninstall = Cask::Cmd::Uninstall.new(casks) + cask_uninstall.force = args.force? + cask_uninstall.verbose = args.verbose? + cask_uninstall.run rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From ac5f0c10e5a4fa9ab0397f58d2a9cf683e22ef27 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:48:27 -0400 Subject: [PATCH 13/20] style: Dedent some autoformatted code in uninstall test case --- Library/Homebrew/test/cmd/uninstall_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 7edabe911ec4c..bc29f1be99a1f 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -26,8 +26,8 @@ expect { brew "uninstall", "local-caffeine" } .to output(/Uninstalling Cask local-caffeine/).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed @@ -45,8 +45,8 @@ Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n ==>\sUninstalling\sCask\slocal-caffeine }x).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed From 26d7dd7c186b46a5253dd98d82ecbcd061bf5113 Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 2 Jul 2020 15:04:55 -0400 Subject: [PATCH 14/20] uninstall: remove tests --- Library/Homebrew/test/cmd/uninstall_spec.rb | 35 --------------------- 1 file changed, 35 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index bc29f1be99a1f..696be790e37c7 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -19,41 +19,6 @@ end end -describe "brew uninstall cask", :integration_test, :needs_macos do - it "uninstalls a given Cask" do - caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) - Cask::Installer.new(caffeine).install - - expect { brew "uninstall", "local-caffeine" } - .to output(/Uninstalling Cask local-caffeine/).to_stdout - .and not_to_output.to_stderr - .and be_a_success - - expect(caffeine).not_to be_installed - - rm_r(TEST_TMPDIR + "/cask-appdir") - end - - it "uninstalls given Formulae and Casks" do - install_test_formula "testball" - - caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) - Cask::Installer.new(caffeine).install - - expect { brew "uninstall", "testball", "local-caffeine" } - .to output(%r{ - Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n - ==>\sUninstalling\sCask\slocal-caffeine - }x).to_stdout - .and not_to_output.to_stderr - .and be_a_success - - expect(caffeine).not_to be_installed - - rm_r(TEST_TMPDIR + "/cask-appdir") - end -end - describe Homebrew do let(:dependency) { formula("dependency") { url "f-1" } } let(:dependent) do From eb1ea006f2551b4fb562608e96debf5fb287e5b6 Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 2 Jul 2020 15:28:41 -0400 Subject: [PATCH 15/20] uninstall: Refactor when using --force --- Library/Homebrew/cmd/uninstall.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 1764b6eb698dd..a4a81a4421334 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -34,20 +34,21 @@ def uninstall if args.force? casks = [] - kegs_by_rack = Hash[args.named.map do |name| + kegs_by_rack = Hash.new + + args.named.each do |name| rack = Formulary.to_rack(name) - unless rack.directory? + 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 - next end - - [rack, rack.subdirs.map { |d| Keg.new(d) }] - end] + end else all_kegs, casks = args.kegs_casks kegs_by_rack = all_kegs.group_by(&:rack) From 1826be81f2202fddfe51846a0639f7ddd88ea258 Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 2 Jul 2020 15:29:58 -0400 Subject: [PATCH 16/20] style: Replace Hash.new with {} --- Library/Homebrew/.idea/.gitignore | 8 + Library/Homebrew/.idea/Homebrew.iml | 1087 +++++++++++++++++ .../.idea/codeStyles/codeStyleConfig.xml | 5 + .../inspectionProfiles/Project_Default.xml | 6 + Library/Homebrew/.idea/misc.xml | 7 + Library/Homebrew/.idea/modules.xml | 8 + Library/Homebrew/.idea/vcs.xml | 6 + Library/Homebrew/cmd/uninstall.rb | 2 +- 8 files changed, 1128 insertions(+), 1 deletion(-) create mode 100644 Library/Homebrew/.idea/.gitignore create mode 100644 Library/Homebrew/.idea/Homebrew.iml create mode 100644 Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml create mode 100644 Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml create mode 100644 Library/Homebrew/.idea/misc.xml create mode 100644 Library/Homebrew/.idea/modules.xml create mode 100644 Library/Homebrew/.idea/vcs.xml diff --git a/Library/Homebrew/.idea/.gitignore b/Library/Homebrew/.idea/.gitignore new file mode 100644 index 0000000000000..73f69e0958611 --- /dev/null +++ b/Library/Homebrew/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/Library/Homebrew/.idea/Homebrew.iml b/Library/Homebrew/.idea/Homebrew.iml new file mode 100644 index 0000000000000..ff55e88eb728b --- /dev/null +++ b/Library/Homebrew/.idea/Homebrew.iml @@ -0,0 +1,1087 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000000000..a55e7a179bde3 --- /dev/null +++ b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000000..b0db9b0fcaf45 --- /dev/null +++ b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Library/Homebrew/.idea/misc.xml b/Library/Homebrew/.idea/misc.xml new file mode 100644 index 0000000000000..da55c2a4c8f02 --- /dev/null +++ b/Library/Homebrew/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Library/Homebrew/.idea/modules.xml b/Library/Homebrew/.idea/modules.xml new file mode 100644 index 0000000000000..d6b4e03f57c30 --- /dev/null +++ b/Library/Homebrew/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Library/Homebrew/.idea/vcs.xml b/Library/Homebrew/.idea/vcs.xml new file mode 100644 index 0000000000000..b2bdec2d71b6a --- /dev/null +++ b/Library/Homebrew/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index a4a81a4421334..ad5f823dbfbfd 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -34,7 +34,7 @@ def uninstall if args.force? casks = [] - kegs_by_rack = Hash.new + kegs_by_rack = {} args.named.each do |name| rack = Formulary.to_rack(name) From 1ae38fb2a42d8260cc05c70c8c08957019430357 Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 3 Jul 2020 10:19:44 -0400 Subject: [PATCH 17/20] Delete IDE files (oops) --- Library/Homebrew/.idea/.gitignore | 8 - Library/Homebrew/.idea/Homebrew.iml | 1087 ----------------- .../.idea/codeStyles/codeStyleConfig.xml | 5 - .../inspectionProfiles/Project_Default.xml | 6 - Library/Homebrew/.idea/misc.xml | 7 - Library/Homebrew/.idea/modules.xml | 8 - Library/Homebrew/.idea/vcs.xml | 6 - 7 files changed, 1127 deletions(-) delete mode 100644 Library/Homebrew/.idea/.gitignore delete mode 100644 Library/Homebrew/.idea/Homebrew.iml delete mode 100644 Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 Library/Homebrew/.idea/misc.xml delete mode 100644 Library/Homebrew/.idea/modules.xml delete mode 100644 Library/Homebrew/.idea/vcs.xml diff --git a/Library/Homebrew/.idea/.gitignore b/Library/Homebrew/.idea/.gitignore deleted file mode 100644 index 73f69e0958611..0000000000000 --- a/Library/Homebrew/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/Library/Homebrew/.idea/Homebrew.iml b/Library/Homebrew/.idea/Homebrew.iml deleted file mode 100644 index ff55e88eb728b..0000000000000 --- a/Library/Homebrew/.idea/Homebrew.iml +++ /dev/null @@ -1,1087 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179bde3..0000000000000 --- a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index b0db9b0fcaf45..0000000000000 --- a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/Library/Homebrew/.idea/misc.xml b/Library/Homebrew/.idea/misc.xml deleted file mode 100644 index da55c2a4c8f02..0000000000000 --- a/Library/Homebrew/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Library/Homebrew/.idea/modules.xml b/Library/Homebrew/.idea/modules.xml deleted file mode 100644 index d6b4e03f57c30..0000000000000 --- a/Library/Homebrew/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Library/Homebrew/.idea/vcs.xml b/Library/Homebrew/.idea/vcs.xml deleted file mode 100644 index b2bdec2d71b6a..0000000000000 --- a/Library/Homebrew/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 525d1ac27da028d47c4a7aa41d88c70f18515a4f Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 3 Jul 2020 10:33:38 -0400 Subject: [PATCH 18/20] Fix PR issues --- Library/Homebrew/cli/args.rb | 5 ++--- Library/Homebrew/cmd/reinstall.rb | 2 +- Library/Homebrew/cmd/uninstall.rb | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 7f76690df7207..927703327d517 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -246,12 +246,11 @@ def resolve_keg(name) require "formula" require "missing_formula" - raise UsageError if name.empty? + 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 @@ -278,7 +277,7 @@ def resolve_keg(name) Keg.new(prefix) end rescue FormulaUnavailableError - raise <<~EOS + 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. diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index d5e4a972aed8b..037260a2eaabb 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -75,7 +75,7 @@ def reinstall Homebrew.messages.display_messages - return if casks.empty? + return if casks.blank? reinstall_cmd = Cask::Cmd::Reinstall.new(casks) reinstall_cmd.verbose = args.verbose? diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index ad5f823dbfbfd..2cb101b2961f6 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -123,7 +123,7 @@ def uninstall end end - return if casks.empty? + return if casks.blank? cask_uninstall = Cask::Cmd::Uninstall.new(casks) cask_uninstall.force = args.force? From 6e8f5d0958247e4b4d629866099ed2836a0e0863 Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 3 Jul 2020 18:24:52 -0400 Subject: [PATCH 19/20] Modify MultipleVersionsInstalledError to have a generic message --- Library/Homebrew/cli/args.rb | 7 ++++++- Library/Homebrew/exceptions.rb | 9 +-------- Library/Homebrew/test/exceptions_spec.rb | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 927703327d517..167965d6ea401 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -246,16 +246,21 @@ def resolve_keg(name) require "formula" require "missing_formula" + puts 1 raise UsageError if name.blank? + puts 2 rack = Formulary.to_rack(name.downcase) + puts 3 dirs = rack.directory? ? rack.subdirs : [] raise NoSuchKegError, rack.basename if dirs.empty? + puts 4 linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + puts 5 begin if opt_prefix.symlink? && opt_prefix.directory? Keg.new(opt_prefix.resolved_path) @@ -271,7 +276,7 @@ def resolve_keg(name) end unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename + raise MultipleVersionsInstalledError, "#{rack.basename} has multiple installed versions" end Keg.new(prefix) diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index ba47d036b7887..bc32524e61065 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -29,14 +29,7 @@ def initialize end end -class MultipleVersionsInstalledError < RuntimeError - attr_reader :name - - def initialize(name) - @name = name - super "#{name} has multiple installed versions" - end -end +class MultipleVersionsInstalledError < RuntimeError; end class NotAKegError < RuntimeError; end diff --git a/Library/Homebrew/test/exceptions_spec.rb b/Library/Homebrew/test/exceptions_spec.rb index ee0aa4f3708fc..79dba60a4ef34 100644 --- a/Library/Homebrew/test/exceptions_spec.rb +++ b/Library/Homebrew/test/exceptions_spec.rb @@ -3,7 +3,7 @@ require "exceptions" 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") } end From df8d22a29b3dfb4313d0b983e92e6683f5df809f Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 3 Jul 2020 18:27:19 -0400 Subject: [PATCH 20/20] Remove debugging markers (oops) --- Library/Homebrew/cli/args.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 167965d6ea401..cc7a571764c4e 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -246,21 +246,16 @@ def resolve_keg(name) require "formula" require "missing_formula" - puts 1 raise UsageError if name.blank? - puts 2 rack = Formulary.to_rack(name.downcase) - puts 3 dirs = rack.directory? ? rack.subdirs : [] raise NoSuchKegError, rack.basename if dirs.empty? - puts 4 linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" - puts 5 begin if opt_prefix.symlink? && opt_prefix.directory? Keg.new(opt_prefix.resolved_path)