Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure default cask tap is installed on CaskUnavailableError. #9398

Merged
merged 2 commits into from Dec 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions Library/Homebrew/cask/cask.rbi
@@ -0,0 +1,7 @@
# typed: strict

module Cask
class Cask
def homepage; end
end
end
2 changes: 1 addition & 1 deletion Library/Homebrew/cask/cmd.rb
Expand Up @@ -167,7 +167,7 @@ def run

args = self.class.parser.parse(argv, ignore_invalid_options: true)

Tap.default_cask_tap.install unless Tap.default_cask_tap.installed?
Tap.install_default_cask_tap_if_necessary

command, argv = detect_internal_command(*argv) ||
detect_external_command(*argv) ||
Expand Down
30 changes: 14 additions & 16 deletions Library/Homebrew/cli/named_args.rb
Expand Up @@ -37,11 +37,20 @@ def to_formulae
@to_formulae ||= to_formulae_and_casks(only: :formula).freeze
end

# Convert named arguments to {Formula} or {Cask} objects.
# If both a formula and cask with the same name exist, returns
# the formula and prints a warning unless `only` is specified.
sig do
params(only: T.nilable(Symbol), ignore_unavailable: T.nilable(T::Boolean), method: T.nilable(Symbol))
.returns(T::Array[T.any(Formula, Keg, Cask::Cask)])
end
def to_formulae_and_casks(only: nil, ignore_unavailable: nil, method: nil)
@to_formulae_and_casks ||= {}
@to_formulae_and_casks[only] ||= begin
to_objects(only: only, ignore_unavailable: ignore_unavailable, method: method).freeze
end
@to_formulae_and_casks[only] ||= downcased_unique_named.flat_map do |name|
load_formula_or_cask(name, only: only, method: method)
rescue NoSuchKegError, FormulaUnavailableError, Cask::CaskUnavailableError
ignore_unavailable ? [] : raise
end.uniq.freeze
end

def to_formulae_to_casks(only: nil, method: nil)
Expand Down Expand Up @@ -88,6 +97,8 @@ def load_formula_or_cask(name, only: nil, method: nil)
begin
return Cask::CaskLoader.load(name, config: Cask::Config.from_args(@parent))
rescue Cask::CaskUnavailableError => e
retry if Tap.install_default_cask_tap_if_necessary

raise e if only == :cask
end
end
Expand All @@ -111,19 +122,6 @@ def to_resolved_formulae_to_casks(only: nil)
to_formulae_to_casks(only: only, method: :resolve)
end

# Convert named arguments to {Formula} or {Cask} objects.
# If both a formula and cask exist with the same name, returns the
# formula and prints a warning unless `only` is specified.
def to_objects(only: nil, ignore_unavailable: nil, method: nil)
@to_objects ||= {}
@to_objects[only] ||= downcased_unique_named.flat_map do |name|
load_formula_or_cask(name, only: only, method: method)
rescue NoSuchKegError, FormulaUnavailableError, Cask::CaskUnavailableError
ignore_unavailable ? [] : raise
end.uniq.freeze
end
private :to_objects

def to_formulae_paths
to_paths(only: :formula)
end
Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/cmd/home.rb
Expand Up @@ -35,7 +35,7 @@ def home
formula_or_cask.homepage
end

exec_browser(*homepages)
exec_browser(*T.unsafe(homepages))
end

def name_of(formula_or_cask)
Expand Down
12 changes: 6 additions & 6 deletions Library/Homebrew/diagnostic.rb
Expand Up @@ -560,10 +560,10 @@ def check_coretap_git_origin
end

def check_casktap_git_origin
cask_tap = Tap.default_cask_tap
return unless cask_tap.installed?
default_cask_tap = Tap.default_cask_tap
return unless default_cask_tap.installed?

examine_git_origin(cask_tap.path, cask_tap.remote)
examine_git_origin(default_cask_tap.path, default_cask_tap.remote)
end

sig { returns(T.nilable(String)) }
Expand Down Expand Up @@ -921,12 +921,12 @@ def check_cask_staging_location
end

def check_cask_taps
default_tap = Tap.default_cask_tap
alt_taps = Tap.select { |t| t.cask_dir.exist? && t != default_tap }
default_cask_tap = Tap.default_cask_tap
alt_taps = Tap.select { |t| t.cask_dir.exist? && t != default_cask_tap }

error_tap_paths = []

add_info "Homebrew Cask Taps:", ([default_tap, *alt_taps].map do |tap|
add_info "Homebrew Cask Taps:", ([default_cask_tap, *alt_taps].map do |tap|
if tap.path.blank?
none_string
else
Expand Down
11 changes: 11 additions & 0 deletions Library/Homebrew/extend/os/mac/tap.rb
@@ -0,0 +1,11 @@
# typed: true
# frozen_string_literal: true

class Tap
def self.install_default_cask_tap_if_necessary
reitermarkus marked this conversation as resolved.
Show resolved Hide resolved
return false if default_cask_tap.installed?

default_cask_tap.install
true
end
end
1 change: 1 addition & 0 deletions Library/Homebrew/extend/os/tap.rb
Expand Up @@ -2,3 +2,4 @@
# frozen_string_literal: true

require "extend/os/linux/tap" if OS.linux?
require "extend/os/mac/tap" if OS.mac?
6 changes: 6 additions & 0 deletions Library/Homebrew/tap.rb
Expand Up @@ -60,10 +60,16 @@ def self.from_path(path)
fetch(match[:user], match[:repo])
end

sig { returns(T.attached_class) }
def self.default_cask_tap
@default_cask_tap ||= fetch("Homebrew", "cask")
end

sig { returns(T::Boolean) }
def self.install_default_cask_tap_if_necessary
false
end

extend Enumerable

# The user name of this {Tap}. Usually, it's the GitHub username of
Expand Down