diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index a55184628c..de6823300e 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -35,7 +35,7 @@ rescue MissingEnvironmentVariables => e exec ENV["HOMEBREW_BREW_FILE"], *ARGV end -def head_unsupported_error +def output_unsupported_error $stderr.puts <<~EOS Please create pull requests instead of asking for help on Homebrew's GitHub, Discourse, Twitter or IRC. @@ -149,7 +149,7 @@ rescue BuildError => e Utils::Analytics.report_build_error(e) e.dump - head_unsupported_error if Homebrew.args.HEAD? + output_unsupported_error if Homebrew.args.HEAD? || e.formula.deprecated? || e.formula.disabled? exit 1 rescue RuntimeError, SystemCallError => e @@ -158,7 +158,7 @@ rescue RuntimeError, SystemCallError => e onoe e $stderr.puts e.backtrace if ARGV.debug? - head_unsupported_error if Homebrew.args.HEAD? + output_unsupported_error if Homebrew.args.HEAD? exit 1 rescue MethodDeprecatedError => e diff --git a/Library/Homebrew/diagnostic.rb b/Library/Homebrew/diagnostic.rb index eb7b3a1bf6..e0e175169a 100644 --- a/Library/Homebrew/diagnostic.rb +++ b/Library/Homebrew/diagnostic.rb @@ -640,6 +640,20 @@ module Homebrew EOS end + def check_deprecated_disabled + return unless HOMEBREW_CELLAR.exist? + + deprecated_or_disabled = Formula.installed.select(&:deprecated?) + deprecated_or_disabled += Formula.installed.select(&:disabled?) + return if deprecated_or_disabled.empty? + + <<~EOS + Some installed formulae are deprecated or disabled. + You should find replacements for the following formulae: + #{deprecated_or_disabled.sort_by(&:full_name).uniq * "\n "} + EOS + end + def check_git_status return unless Utils.git_available? diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 4da0e79b41..45ebd50254 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1105,6 +1105,20 @@ class Formula end end + # Whether this {Formula} is deprecated (i.e. warns on installation). + # Defaults to false. + # @return [Boolean] + def deprecated? + self.class.deprecated? + end + + # Whether this {Formula} is disabled (i.e. cannot be installed). + # Defaults to false. + # @return [Boolean] + def disabled? + self.class.disabled? + end + def skip_cxxstdlib_check? false end @@ -2605,6 +2619,34 @@ class Formula @pour_bottle_check.instance_eval(&block) end + # Deprecates a {Formula} so a warning is shown on each installation. + def deprecate!(date: nil) + return if date.present? && Date.parse(date) > Date.today + + @deprecated = true + end + + # Whether this {Formula} is deprecated (i.e. warns on installation). + # Defaults to false. + # @return [Boolean] + def deprecated? + @deprecated == true + end + + # Disables a {Formula} so it cannot be installed. + def disable!(date: nil) + return if date.present? && Date.parse(date) > Date.today + + @disabled = true + end + + # Whether this {Formula} is disabled (i.e. cannot be installed). + # Defaults to false. + # @return [Boolean] + def disabled? + @disabled == true + end + # @private def link_overwrite(*paths) paths.flatten! diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index de418af649..bb7f2bdca5 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -161,6 +161,12 @@ class FormulaInstaller def check_install_sanity raise FormulaInstallationAlreadyAttemptedError, formula if self.class.attempted.include?(formula) + if formula.deprecated? + opoo "#{formula.full_name} has been deprecated!" + elsif formula.disabled? + odie "#{formula.full_name} has been disabled!" + end + return if ignore_deps? recursive_deps = formula.recursive_dependencies