Merge pull request #9398 from reitermarkus/cask-tap
Ensure default cask tap is installed on `CaskUnavailableError`.
This commit is contained in:
		
						commit
						1834a33d08
					
				
							
								
								
									
										7
									
								
								Library/Homebrew/cask/cask.rbi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Library/Homebrew/cask/cask.rbi
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					# typed: strict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module Cask
 | 
				
			||||||
 | 
					  class Cask
 | 
				
			||||||
 | 
					    def homepage; end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -167,7 +167,7 @@ module Cask
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      args = self.class.parser.parse(argv, ignore_invalid_options: true)
 | 
					      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) ||
 | 
					      command, argv = detect_internal_command(*argv) ||
 | 
				
			||||||
                      detect_external_command(*argv) ||
 | 
					                      detect_external_command(*argv) ||
 | 
				
			||||||
 | 
				
			|||||||
@ -37,11 +37,20 @@ module Homebrew
 | 
				
			|||||||
        @to_formulae ||= to_formulae_and_casks(only: :formula).freeze
 | 
					        @to_formulae ||= to_formulae_and_casks(only: :formula).freeze
 | 
				
			||||||
      end
 | 
					      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)
 | 
					      def to_formulae_and_casks(only: nil, ignore_unavailable: nil, method: nil)
 | 
				
			||||||
        @to_formulae_and_casks ||= {}
 | 
					        @to_formulae_and_casks ||= {}
 | 
				
			||||||
        @to_formulae_and_casks[only] ||= begin
 | 
					        @to_formulae_and_casks[only] ||= downcased_unique_named.flat_map do |name|
 | 
				
			||||||
          to_objects(only: only, ignore_unavailable: ignore_unavailable, method: method).freeze
 | 
					          load_formula_or_cask(name, only: only, method: method)
 | 
				
			||||||
        end
 | 
					      rescue NoSuchKegError, FormulaUnavailableError, Cask::CaskUnavailableError
 | 
				
			||||||
 | 
					        ignore_unavailable ? [] : raise
 | 
				
			||||||
 | 
					        end.uniq.freeze
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      def to_formulae_to_casks(only: nil, method: nil)
 | 
					      def to_formulae_to_casks(only: nil, method: nil)
 | 
				
			||||||
@ -88,6 +97,8 @@ module Homebrew
 | 
				
			|||||||
          begin
 | 
					          begin
 | 
				
			||||||
            return Cask::CaskLoader.load(name, config: Cask::Config.from_args(@parent))
 | 
					            return Cask::CaskLoader.load(name, config: Cask::Config.from_args(@parent))
 | 
				
			||||||
          rescue Cask::CaskUnavailableError => e
 | 
					          rescue Cask::CaskUnavailableError => e
 | 
				
			||||||
 | 
					            retry if Tap.install_default_cask_tap_if_necessary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            raise e if only == :cask
 | 
					            raise e if only == :cask
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
@ -111,19 +122,6 @@ module Homebrew
 | 
				
			|||||||
        to_formulae_to_casks(only: only, method: :resolve)
 | 
					        to_formulae_to_casks(only: only, method: :resolve)
 | 
				
			||||||
      end
 | 
					      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
 | 
					      def to_formulae_paths
 | 
				
			||||||
        to_paths(only: :formula)
 | 
					        to_paths(only: :formula)
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
				
			|||||||
@ -35,7 +35,7 @@ module Homebrew
 | 
				
			|||||||
      formula_or_cask.homepage
 | 
					      formula_or_cask.homepage
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    exec_browser(*homepages)
 | 
					    exec_browser(*T.unsafe(homepages))
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def name_of(formula_or_cask)
 | 
					  def name_of(formula_or_cask)
 | 
				
			||||||
 | 
				
			|||||||
@ -560,10 +560,10 @@ module Homebrew
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      def check_casktap_git_origin
 | 
					      def check_casktap_git_origin
 | 
				
			||||||
        cask_tap = Tap.default_cask_tap
 | 
					        default_cask_tap = Tap.default_cask_tap
 | 
				
			||||||
        return unless cask_tap.installed?
 | 
					        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
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      sig { returns(T.nilable(String)) }
 | 
					      sig { returns(T.nilable(String)) }
 | 
				
			||||||
@ -921,12 +921,12 @@ module Homebrew
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      def check_cask_taps
 | 
					      def check_cask_taps
 | 
				
			||||||
        default_tap = Tap.default_cask_tap
 | 
					        default_cask_tap = Tap.default_cask_tap
 | 
				
			||||||
        alt_taps = Tap.select { |t| t.cask_dir.exist? && t != default_tap }
 | 
					        alt_taps = Tap.select { |t| t.cask_dir.exist? && t != default_cask_tap }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        error_tap_paths = []
 | 
					        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?
 | 
					          if tap.path.blank?
 | 
				
			||||||
            none_string
 | 
					            none_string
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								Library/Homebrew/extend/os/mac/tap.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Library/Homebrew/extend/os/mac/tap.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					# typed: true
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Tap
 | 
				
			||||||
 | 
					  def self.install_default_cask_tap_if_necessary
 | 
				
			||||||
 | 
					    return false if default_cask_tap.installed?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default_cask_tap.install
 | 
				
			||||||
 | 
					    true
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -2,3 +2,4 @@
 | 
				
			|||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require "extend/os/linux/tap" if OS.linux?
 | 
					require "extend/os/linux/tap" if OS.linux?
 | 
				
			||||||
 | 
					require "extend/os/mac/tap" if OS.mac?
 | 
				
			||||||
 | 
				
			|||||||
@ -60,10 +60,16 @@ class Tap
 | 
				
			|||||||
    fetch(match[:user], match[:repo])
 | 
					    fetch(match[:user], match[:repo])
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sig { returns(T.attached_class) }
 | 
				
			||||||
  def self.default_cask_tap
 | 
					  def self.default_cask_tap
 | 
				
			||||||
    @default_cask_tap ||= fetch("Homebrew", "cask")
 | 
					    @default_cask_tap ||= fetch("Homebrew", "cask")
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sig { returns(T::Boolean) }
 | 
				
			||||||
 | 
					  def self.install_default_cask_tap_if_necessary
 | 
				
			||||||
 | 
					    false
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  extend Enumerable
 | 
					  extend Enumerable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # The user name of this {Tap}. Usually, it's the GitHub username of
 | 
					  # The user name of this {Tap}. Usually, it's the GitHub username of
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user