diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 4c62dc8095..4bc98b2305 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -1,11 +1,11 @@ -# typed: true +# typed: strict # frozen_string_literal: true +require "abstract_command" require "keg" require "formula" require "diagnostic" require "migrator" -require "cli/parser" require "cask/cask_loader" require "cask/exceptions" require "cask/installer" @@ -13,74 +13,72 @@ require "cask/uninstall" require "uninstall" module Homebrew - module_function + module Cmd + class UninstallCmd < AbstractCommand + cmd_args do + description <<~EOS + Uninstall a or . + EOS + switch "-f", "--force", + description: "Delete all installed versions of . Uninstall even if is not " \ + "installed, overwrite existing files and ignore errors when removing files." + switch "--zap", + description: "Remove all files associated with a . " \ + "*May remove files which are shared between applications.*" + switch "--ignore-dependencies", + description: "Don't fail uninstall, even if is a dependency of any installed " \ + "formulae." + switch "--formula", "--formulae", + description: "Treat all named arguments as formulae." + switch "--cask", "--casks", + description: "Treat all named arguments as casks." - sig { returns(CLI::Parser) } - def uninstall_args - Homebrew::CLI::Parser.new do - description <<~EOS - Uninstall a or . - EOS - switch "-f", "--force", - description: "Delete all installed versions of . Uninstall even if is not " \ - "installed, overwrite existing files and ignore errors when removing files." - switch "--zap", - description: "Remove all files associated with a . " \ - "*May remove files which are shared between applications.*" - switch "--ignore-dependencies", - description: "Don't fail uninstall, even if is a dependency of any installed " \ - "formulae." - switch "--formula", "--formulae", - description: "Treat all named arguments as formulae." - switch "--cask", "--casks", - description: "Treat all named arguments as casks." + conflicts "--formula", "--cask" + conflicts "--formula", "--zap" - conflicts "--formula", "--cask" - conflicts "--formula", "--zap" - - named_args [:installed_formula, :installed_cask], min: 1 - end - end - - def uninstall - args = uninstall_args.parse - - all_kegs, casks = args.named.to_kegs_to_casks( - ignore_unavailable: args.force?, - all_kegs: args.force?, - ) - - # If ignore_unavailable is true and the named args - # are a series of invalid kegs and casks, - # #to_kegs_to_casks will return empty arrays. - return if all_kegs.blank? && casks.blank? - - kegs_by_rack = all_kegs.group_by(&:rack) - - Uninstall.uninstall_kegs( - kegs_by_rack, - casks:, - force: args.force?, - ignore_dependencies: args.ignore_dependencies?, - named_args: args.named, - ) - - if args.zap? - casks.each do |cask| - odebug "Zapping Cask #{cask}" - - raise Cask::CaskNotInstalledError, cask if !cask.installed? && !args.force? - - Cask::Installer.new(cask, verbose: args.verbose?, force: args.force?).zap + named_args [:installed_formula, :installed_cask], min: 1 end - else - Cask::Uninstall.uninstall_casks( - *casks, - verbose: args.verbose?, - force: args.force?, - ) - end - Cleanup.autoremove if Homebrew::EnvConfig.autoremove? + sig { override.void } + def run + all_kegs, casks = args.named.to_kegs_to_casks( + ignore_unavailable: args.force?, + all_kegs: args.force?, + ) + + # If ignore_unavailable is true and the named args + # are a series of invalid kegs and casks, + # #to_kegs_to_casks will return empty arrays. + return if all_kegs.blank? && casks.blank? + + kegs_by_rack = all_kegs.group_by(&:rack) + + Uninstall.uninstall_kegs( + kegs_by_rack, + casks:, + force: args.force?, + ignore_dependencies: args.ignore_dependencies?, + named_args: args.named, + ) + + if args.zap? + casks.each do |cask| + odebug "Zapping Cask #{cask}" + + raise Cask::CaskNotInstalledError, cask if !cask.installed? && !args.force? + + Cask::Installer.new(cask, verbose: args.verbose?, force: args.force?).zap + end + else + Cask::Uninstall.uninstall_casks( + *casks, + verbose: args.verbose?, + force: args.force?, + ) + end + + Cleanup.autoremove if Homebrew::EnvConfig.autoremove? + end + end end end diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index f4ee92782a..69c3516c00 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -1,10 +1,9 @@ # frozen_string_literal: true require "cmd/uninstall" - require "cmd/shared_examples/args_parse" -RSpec.describe "brew uninstall" do +RSpec.describe Homebrew::Cmd::UninstallCmd do it_behaves_like "parseable arguments" it "uninstalls a given Formula", :integration_test do