
- The `brew uninstall` command has `--zap`, so let's make `brew reinstall` have parity here for a better user experience. (Requested in issue 12983.) - It feels weird that to get my new reinstall test to pass I had to add `--zap` to `cask/cmd/install.rb`, not `cask/cmd/reinstall.rb` to get the tests to pass. But the `brew reinstall --cask caffeine --zap` command worked fine all the time. The CLI argument parser from the test run was complaining about not knowing what `zap` was. As a result, `--zap` now shows up as a switch in `brew install --help` which I'm not 100% convinced is the desired UX. But I've edited the description accordingly to specify that it will only work on `reinstall` operations (and `--zap` on `install` is a no-op). ``` issyl0 at pictor in /opt/homebrew on reinstall-cask-zap ❯ brew reinstall --cask caffeine --zap ==> Downloading https://github.com/IntelliScape/caffeine/releases/download/1.1.3/Caffeine.dmg Already downloaded: /Users/issyl0/Library/Caches/Homebrew/downloads/3d6ccfdd3b8d0ab37d1c2468d6e69078c2d31d3b12bf51947c4db21e5f376af2--Caffeine.dmg ==> Implied `brew uninstall --cask caffeine` ==> Backing App 'Caffeine.app' up to '/opt/homebrew/Caskroom/caffeine/1.1.3/Caffeine.app' ==> Removing App '/Applications/Caffeine.app' ==> Dispatching zap stanza ==> Trashing files: ~/Library/Application Support/com.intelliscapesolutions.caffeine ~/Library/Preferences/com.intelliscapesolutions.caffeine.plist ~/Library/Caches/com.intelliscapesolutions.caffeine ~/Library/HTTPStoages/com.intelliscapesolutions.caffeine.binarycookies ==> Removing all staged versions of Cask 'caffeine' ==> Installing Cask caffeine ==> Moving App 'Caffeine.app' to '/Applications/Caffeine.app' 🍺 caffeine was successfully installed! ```
86 lines
2.2 KiB
Ruby
86 lines
2.2 KiB
Ruby
# typed: false
|
|
# frozen_string_literal: true
|
|
|
|
module Cask
|
|
class Cmd
|
|
# Cask implementation of the `brew install` command.
|
|
#
|
|
# @api private
|
|
class Install < AbstractCommand
|
|
extend T::Sig
|
|
|
|
OPTIONS = [
|
|
[:switch, "--skip-cask-deps", {
|
|
description: "Skip installing cask dependencies.",
|
|
}],
|
|
[:switch, "--zap", {
|
|
description: "For use with `brew reinstall --cask`. Remove all files associated with a cask. " \
|
|
"*May remove files which are shared between applications.*",
|
|
}],
|
|
].freeze
|
|
|
|
def self.parser(&block)
|
|
super do
|
|
switch "--force",
|
|
description: "Force overwriting existing files."
|
|
|
|
OPTIONS.each do |option|
|
|
send(*option)
|
|
end
|
|
|
|
instance_eval(&block) if block
|
|
end
|
|
end
|
|
|
|
sig { void }
|
|
def run
|
|
self.class.install_casks(
|
|
*casks,
|
|
binaries: args.binaries?,
|
|
verbose: args.verbose?,
|
|
force: args.force?,
|
|
skip_cask_deps: args.skip_cask_deps?,
|
|
require_sha: args.require_sha?,
|
|
quarantine: args.quarantine?,
|
|
quiet: args.quiet?,
|
|
zap: args.zap?,
|
|
)
|
|
end
|
|
|
|
def self.install_casks(
|
|
*casks,
|
|
verbose: nil,
|
|
force: nil,
|
|
binaries: nil,
|
|
skip_cask_deps: nil,
|
|
require_sha: nil,
|
|
quarantine: nil,
|
|
quiet: nil,
|
|
zap: nil
|
|
)
|
|
odie "Installing casks is supported only on macOS" unless OS.mac?
|
|
|
|
options = {
|
|
verbose: verbose,
|
|
force: force,
|
|
binaries: binaries,
|
|
skip_cask_deps: skip_cask_deps,
|
|
require_sha: require_sha,
|
|
quarantine: quarantine,
|
|
zap: zap,
|
|
}.compact
|
|
|
|
options[:quarantine] = true if options[:quarantine].nil?
|
|
|
|
require "cask/installer"
|
|
|
|
casks.each do |cask|
|
|
Installer.new(cask, **options).install
|
|
rescue CaskAlreadyInstalledError => e
|
|
opoo e.message
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|