cask_reason will suggest brew cask uninstall

This commit is contained in:
Zach Auten 2019-07-20 14:09:13 -04:00
parent a98bbbc644
commit ecc7b9e174
4 changed files with 76 additions and 12 deletions

View File

@ -42,6 +42,7 @@ module HomebrewArgvExtension
def kegs def kegs
require "keg" require "keg"
require "formula" require "formula"
require "missing_formula"
# TODO: use @instance variable to ||= cache when moving to CLI::Parser # TODO: use @instance variable to ||= cache when moving to CLI::Parser
downcased_unique_named.map do |name| downcased_unique_named.map do |name|
raise UsageError if name.empty? raise UsageError if name.empty?
@ -50,7 +51,12 @@ module HomebrewArgvExtension
dirs = rack.directory? ? rack.subdirs : [] dirs = rack.directory? ? rack.subdirs : []
raise NoSuchKegError, rack.basename if dirs.empty? 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 linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename
opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}"

View File

@ -1,5 +1,10 @@
# frozen_string_literal: true # frozen_string_literal: true
require "cask/cmd/abstract_command"
require "cask/cmd/info"
require "cask/cask_loader"
require "cask/caskroom"
module Homebrew module Homebrew
module MissingFormula module MissingFormula
class << self class << self
@ -17,14 +22,32 @@ module Homebrew
def cask_reason(name, silent: false, show_info: false) def cask_reason(name, silent: false, show_info: false)
return if silent return if silent
cask = Cask::CaskLoader.load(name) suggest_command(name, show_info ? "info" : "install")
reason = +"Found a cask named \"#{name}\" instead.\n"
if show_info
reason << Cask::Cmd::Info.get_info(cask)
else
reason << "Did you mean to type \"brew cask install #{name}\"?\n"
end end
reason.freeze
def suggest_command(name, command)
suggestion = <<~EOS
Found a cask named "#{name}" instead. Try
brew cask #{command} #{name}
EOS
case command
when "install"
Cask::CaskLoader.load(name)
when "uninstall"
cask = Cask::Caskroom.casks.find { |installed_cask| installed_cask.to_s == name }
raise Cask::CaskUnavailableError, name if cask.nil?
when "info"
cask = Cask::CaskLoader.load(name)
suggestion = <<~EOS
Found a cask named "#{name}" instead.
#{Cask::Cmd::Info.get_info(cask)}
EOS
else
return
end
suggestion
rescue Cask::CaskUnavailableError rescue Cask::CaskUnavailableError
nil nil
end end

View File

@ -1,9 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
require "formulary" require "formulary"
require "cask/cmd/abstract_command"
require "cask/cmd/info"
require "cask/cask_loader"
module Homebrew module Homebrew
module MissingFormula module MissingFormula
@ -198,6 +195,8 @@ module Homebrew
def cask_reason(name, silent: false, show_info: false); end def cask_reason(name, silent: false, show_info: false); end
def suggest_command(name, command); end
require "extend/os/missing_formula" require "extend/os/missing_formula"
end end
end end

View File

@ -100,14 +100,14 @@ describe Homebrew::MissingFormula do
let(:show_info) { false } let(:show_info) { false }
it { is_expected.to match(/Found a cask named "local-caffeine" instead./) } it { is_expected.to match(/Found a cask named "local-caffeine" instead./) }
it { is_expected.to match(/Did you mean to type "brew cask install local-caffeine"?/) } it { is_expected.to match(/Try\n brew cask install local-caffeine/) }
end end
context "with a formula name that is a cask and show_info: true" do context "with a formula name that is a cask and show_info: true" do
let(:formula) { "local-caffeine" } let(:formula) { "local-caffeine" }
let(:show_info) { true } let(:show_info) { true }
it { is_expected.to match(/Found a cask named "local-caffeine" instead.\nlocal-caffeine: 1.2.3\n/) } it { is_expected.to match(/Found a cask named "local-caffeine" instead.\n\nlocal-caffeine: 1.2.3\n/) }
end end
context "with a formula name that is not a cask" do context "with a formula name that is not a cask" do
@ -117,4 +117,40 @@ describe Homebrew::MissingFormula do
it { is_expected.to be_nil } it { is_expected.to be_nil }
end end
end end
describe "::suggest_command", :cask do
subject { described_class.suggest_command(name, command) }
context "brew install" do
let(:name) { "local-caffeine" }
let(:command) { "install" }
it { is_expected.to match(/Found a cask named "local-caffeine" instead./) }
it { is_expected.to match(/Try\n brew cask install local-caffeine/) }
end
context "brew uninstall" do
let(:name) { "local-caffeine" }
let(:command) { "uninstall" }
it { is_expected.to be_nil }
context "with described cask installed" do
before do
allow(Cask::Caskroom).to receive(:casks).and_return(["local-caffeine"])
end
it { is_expected.to match(/Found a cask named "local-caffeine" instead./) }
it { is_expected.to match(/Try\n brew cask uninstall local-caffeine/) }
end
end
context "brew info" do
let(:name) { "local-caffeine" }
let(:command) { "info" }
it { is_expected.to match(/Found a cask named "local-caffeine" instead./) }
it { is_expected.to match(/local-caffeine: 1.2.3/) }
end
end
end end