Update cask logic to handle deprecations and disables

This commit is contained in:
Rylan Polster 2023-12-04 00:30:49 -05:00
parent 036723a668
commit 641a80475e
No known key found for this signature in database
GPG Key ID: 46A744940CFF4D64
9 changed files with 90 additions and 40 deletions

View File

@ -286,6 +286,16 @@ module Cask
desc json_cask[:desc] desc json_cask[:desc]
homepage json_cask[:homepage] 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? auto_updates json_cask[:auto_updates] unless json_cask[:auto_updates].nil?
conflicts_with(**json_cask[:conflicts_with]) if json_cask[:conflicts_with].present? conflicts_with(**json_cask[:conflicts_with]) if json_cask[:conflicts_with].present?

View File

@ -54,6 +54,23 @@ module Cask
end end
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. # Error when a cask conflicts with another cask.
# #
# @api private # @api private

View File

@ -12,6 +12,8 @@ module Cask
output = +"#{title_info(cask)}\n" output = +"#{title_info(cask)}\n"
output << "#{Formatter.url(cask.homepage)}\n" if cask.homepage 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) output << installation_info(cask)
repo = repo_info(cask) repo = repo_info(cask)
output << "#{repo}\n" if repo output << "#{repo}\n" if repo

View File

@ -93,6 +93,7 @@ module Cask
old_config = @cask.config old_config = @cask.config
predecessor = @cask if reinstall? && @cask.installed? predecessor = @cask if reinstall? && @cask.installed?
check_deprecate_disable
check_conflicts check_conflicts
print caveats print caveats
@ -124,6 +125,17 @@ on_request: true)
raise raise
end 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 def check_conflicts
return unless @cask.conflicts_with return unless @cask.conflicts_with

View File

@ -278,14 +278,8 @@ module Homebrew
puts formula.desc if formula.desc puts formula.desc if formula.desc
puts Formatter.url(formula.homepage) if formula.homepage puts Formatter.url(formula.homepage) if formula.homepage
deprecate_disable_type, deprecate_disable_reason = DeprecateDisable.deprecate_disable_info formula deprecate_disable_info_string = DeprecateDisable.message(formula)
if deprecate_disable_type.present? puts deprecate_disable_info_string.capitalize if deprecate_disable_info_string.present?
if deprecate_disable_reason.present?
puts "#{deprecate_disable_type.capitalize} because it #{deprecate_disable_reason}!"
else
puts "#{deprecate_disable_type.capitalize}!"
end
end
conflicts = formula.conflicts.map do |conflict| conflicts = formula.conflicts.map do |conflict|
reason = " (because #{conflict.reason})" if conflict.reason reason = " (because #{conflict.reason})" if conflict.reason

View File

@ -35,23 +35,39 @@ module DeprecateDisable
**SHARED_DEPRECATE_DISABLE_REASONS, **SHARED_DEPRECATE_DISABLE_REASONS,
}.freeze }.freeze
def deprecate_disable_info(formula_or_cask) def type(formula_or_cask)
if formula_or_cask.deprecated? return :deprecated if formula_or_cask.deprecated?
type = :deprecated return :disabled if formula_or_cask.disabled?
reason = formula_or_cask.deprecation_reason 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? elsif formula_or_cask.disabled?
type = :disabled formula_or_cask.disable_reason
reason = formula_or_cask.disable_reason
else
return
end end
reason = if formula_or_cask.is_a?(Formula) && FORMULA_DEPRECATE_DISABLE_REASONS.key?(reason) reason = if formula_or_cask.is_a?(Formula) && FORMULA_DEPRECATE_DISABLE_REASONS.key?(reason)
FORMULA_DEPRECATE_DISABLE_REASONS[reason] FORMULA_DEPRECATE_DISABLE_REASONS[reason]
elsif formula_or_cask.is_a?(Cask::Cask) && CASK_DEPRECATE_DISABLE_REASONS.key?(reason) elsif formula_or_cask.is_a?(Cask::Cask) && CASK_DEPRECATE_DISABLE_REASONS.key?(reason)
CASK_DEPRECATE_DISABLE_REASONS[reason] CASK_DEPRECATE_DISABLE_REASONS[reason]
else
reason
end 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
end end

View File

@ -642,6 +642,18 @@ module Homebrew
EOS EOS
end 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)) } sig { returns(T.nilable(String)) }
def check_git_status def check_git_status
return unless Utils::Git.available? return unless Utils::Git.available?

View File

@ -200,21 +200,14 @@ class FormulaInstaller
sig { void } sig { void }
def prelude def prelude
type, reason = DeprecateDisable.deprecate_disable_info formula deprecate_disable_type = DeprecateDisable.type(formula)
if type.present? if deprecate_disable_type.present?
case type message = "#{formula.full_name} has been #{DeprecateDisable.message(formula)}"
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
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
end end

View File

@ -7,6 +7,7 @@ require "tab"
require "utils/bottles" require "utils/bottles"
require "service" require "service"
require "utils/curl" require "utils/curl"
require "deprecate_disable"
require "active_support/core_ext/hash/deep_transform_values" require "active_support/core_ext/hash/deep_transform_values"
@ -301,12 +302,12 @@ module Formulary
end end
if (deprecation_date = json_formula["deprecation_date"].presence) 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 deprecate! date: deprecation_date, because: reason
end end
if (disable_date = json_formula["disable_date"].presence) 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 disable! date: disable_date, because: reason
end end
@ -462,13 +463,6 @@ module Formulary
string string
end 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. # A {FormulaLoader} returns instances of formulae.
# Subclasses implement loaders for particular sources of formulae. # Subclasses implement loaders for particular sources of formulae.
class FormulaLoader class FormulaLoader