diff --git a/Library/Homebrew/cask/cask_loader.rb b/Library/Homebrew/cask/cask_loader.rb index 22b7efe25e..93332576ba 100644 --- a/Library/Homebrew/cask/cask_loader.rb +++ b/Library/Homebrew/cask/cask_loader.rb @@ -286,6 +286,16 @@ module Cask desc json_cask[:desc] homepage json_cask[:homepage] + if (deprecation_date = json_cask[:deprecation_date].presence) + reason = DeprecateDisable.to_reason_string_or_symbol json_cask[:deprecation_reason], type: :cask + deprecate! date: deprecation_date, because: reason + end + + if (disable_date = json_cask[:disable_date].presence) + reason = DeprecateDisable.to_reason_string_or_symbol json_cask[:disable_reason], type: :cask + deprecate! date: disable_date, because: reason + end + auto_updates json_cask[:auto_updates] unless json_cask[:auto_updates].nil? conflicts_with(**json_cask[:conflicts_with]) if json_cask[:conflicts_with].present? diff --git a/Library/Homebrew/cask/exceptions.rb b/Library/Homebrew/cask/exceptions.rb index 05bdde818a..acbc0fa338 100644 --- a/Library/Homebrew/cask/exceptions.rb +++ b/Library/Homebrew/cask/exceptions.rb @@ -54,6 +54,23 @@ module Cask end end + # Error when a cask cannot be installed. + # + # @api private + class CaskCannotBeInstalledError < AbstractCaskErrorWithToken + attr_reader :message + + def initialize(token, message) + super(token) + @message = message + end + + sig { returns(String) } + def to_s + "Cask '#{token}' has been #{message}" + end + end + # Error when a cask conflicts with another cask. # # @api private diff --git a/Library/Homebrew/cask/info.rb b/Library/Homebrew/cask/info.rb index 64caa572a7..e80a88024a 100644 --- a/Library/Homebrew/cask/info.rb +++ b/Library/Homebrew/cask/info.rb @@ -12,6 +12,8 @@ module Cask output = +"#{title_info(cask)}\n" output << "#{Formatter.url(cask.homepage)}\n" if cask.homepage + deprecate_disable = DeprecateDisable.message(cask) + output << "#{deprecate_disable.capitalize}\n" if deprecate_disable output << installation_info(cask) repo = repo_info(cask) output << "#{repo}\n" if repo diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index a9e42cc6b3..45383d30ec 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -93,6 +93,7 @@ module Cask old_config = @cask.config predecessor = @cask if reinstall? && @cask.installed? + check_deprecate_disable check_conflicts print caveats @@ -124,6 +125,17 @@ on_request: true) raise end + def check_deprecate_disable + deprecate_disable_type = DeprecateDisable.type(@cask) + return if deprecate_disable_type.blank? + + if deprecate_disable_type == :deprecated + opoo "#{@cask.token} has been #{DeprecateDisable.message(@cask)}" + elsif deprecate_disable_type == :disabled + raise CaskCannotBeInstalledError.new(@cask, DeprecateDisable.message(@cask)) + end + end + def check_conflicts return unless @cask.conflicts_with diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index ca7ac0f28b..705790a8b3 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -278,14 +278,8 @@ module Homebrew puts formula.desc if formula.desc puts Formatter.url(formula.homepage) if formula.homepage - deprecate_disable_type, deprecate_disable_reason = DeprecateDisable.deprecate_disable_info formula - if deprecate_disable_type.present? - if deprecate_disable_reason.present? - puts "#{deprecate_disable_type.capitalize} because it #{deprecate_disable_reason}!" - else - puts "#{deprecate_disable_type.capitalize}!" - end - end + deprecate_disable_info_string = DeprecateDisable.message(formula) + puts deprecate_disable_info_string.capitalize if deprecate_disable_info_string.present? conflicts = formula.conflicts.map do |conflict| reason = " (because #{conflict.reason})" if conflict.reason diff --git a/Library/Homebrew/deprecate_disable.rb b/Library/Homebrew/deprecate_disable.rb index b64e98e854..8ade837dea 100644 --- a/Library/Homebrew/deprecate_disable.rb +++ b/Library/Homebrew/deprecate_disable.rb @@ -35,23 +35,39 @@ module DeprecateDisable **SHARED_DEPRECATE_DISABLE_REASONS, }.freeze - def deprecate_disable_info(formula_or_cask) - if formula_or_cask.deprecated? - type = :deprecated - reason = formula_or_cask.deprecation_reason + def type(formula_or_cask) + return :deprecated if formula_or_cask.deprecated? + return :disabled if formula_or_cask.disabled? + end + + def message(formula_or_cask) + return if type(formula_or_cask).blank? + + reason = if formula_or_cask.deprecated? + formula_or_cask.deprecation_reason elsif formula_or_cask.disabled? - type = :disabled - reason = formula_or_cask.disable_reason - else - return + formula_or_cask.disable_reason end reason = if formula_or_cask.is_a?(Formula) && FORMULA_DEPRECATE_DISABLE_REASONS.key?(reason) FORMULA_DEPRECATE_DISABLE_REASONS[reason] elsif formula_or_cask.is_a?(Cask::Cask) && CASK_DEPRECATE_DISABLE_REASONS.key?(reason) CASK_DEPRECATE_DISABLE_REASONS[reason] + else + reason end - [type, reason] + return "#{type(formula_or_cask)} because it #{reason}!" if reason.present? + + "#{type(formula_or_cask)}!" + end + + def to_reason_string_or_symbol(string, type:) + if (type == :formula && FORMULA_DEPRECATE_DISABLE_REASONS.key?(string.to_sym)) || + (type == :cask && CASK_DEPRECATE_DISABLE_REASONS.key?(string.to_sym)) + return string.to_sym + end + + string end end diff --git a/Library/Homebrew/diagnostic.rb b/Library/Homebrew/diagnostic.rb index 512f475b77..f0bec7ee80 100644 --- a/Library/Homebrew/diagnostic.rb +++ b/Library/Homebrew/diagnostic.rb @@ -642,6 +642,18 @@ module Homebrew EOS end + def check_cask_deprecated_disabled + deprecated_or_disabled = Cask::Caskroom.casks.select(&:deprecated?) + deprecated_or_disabled += Cask::Caskroom.casks.select(&:disabled?) + return if deprecated_or_disabled.empty? + + <<~EOS + Some installed casks are deprecated or disabled. + You should find replacements for the following casks: + #{deprecated_or_disabled.sort_by(&:token).uniq * "\n "} + EOS + end + sig { returns(T.nilable(String)) } def check_git_status return unless Utils::Git.available? diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index ce55a97d9d..9b46b15d02 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -200,21 +200,14 @@ class FormulaInstaller sig { void } def prelude - type, reason = DeprecateDisable.deprecate_disable_info formula - if type.present? - case type - when :deprecated - if reason.present? - opoo "#{formula.full_name} has been deprecated because it #{reason}!" - else - opoo "#{formula.full_name} has been deprecated!" - end - when :disabled - if reason.present? - raise CannotInstallFormulaError, "#{formula.full_name} has been disabled because it #{reason}!" - end + deprecate_disable_type = DeprecateDisable.type(formula) + if deprecate_disable_type.present? + message = "#{formula.full_name} has been #{DeprecateDisable.message(formula)}" - raise CannotInstallFormulaError, "#{formula.full_name} has been disabled!" + if deprecate_disable_type == :deprecated + opoo message + elsif deprecate_disable_type == :disabled + raise CannotInstallFormulaError, message end end diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 5d6e47c5b0..90857aa3b9 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -7,6 +7,7 @@ require "tab" require "utils/bottles" require "service" require "utils/curl" +require "deprecate_disable" require "active_support/core_ext/hash/deep_transform_values" @@ -301,12 +302,12 @@ module Formulary end if (deprecation_date = json_formula["deprecation_date"].presence) - reason = Formulary.convert_to_deprecate_disable_reason_string_or_symbol json_formula["deprecation_reason"] + reason = DeprecateDisable.to_reason_string_or_symbol json_formula["deprecation_reason"], type: :formula deprecate! date: deprecation_date, because: reason end if (disable_date = json_formula["disable_date"].presence) - reason = Formulary.convert_to_deprecate_disable_reason_string_or_symbol json_formula["disable_reason"] + reason = DeprecateDisable.to_reason_string_or_symbol json_formula["disable_reason"], type: :formula disable! date: disable_date, because: reason end @@ -462,13 +463,6 @@ module Formulary string end - def self.convert_to_deprecate_disable_reason_string_or_symbol(string) - require "deprecate_disable" - return string unless DeprecateDisable::FORMULARY_DEPRECATE_DISABLE_REASONS.keys.map(&:to_s).include?(string) - - string.to_sym - end - # A {FormulaLoader} returns instances of formulae. # Subclasses implement loaders for particular sources of formulae. class FormulaLoader