From a76c33f7bb95c3ac6d7d6dae961858c9e6ef14ad Mon Sep 17 00:00:00 2001 From: Carlo Cabrera Date: Sat, 2 Aug 2025 01:59:46 +0800 Subject: [PATCH] extend/kernel: tighten up some type signatures Allowing either `Formula`e or `String`s in these methods leads to errors at runtime when one hasn't done `require "formula"` yet. Let's tighten these up so that they only accept `Formula` arguments to guarantee that `require "formula"` has been done before they are called. For callers that need to pass a `String`, we update them to call a version of these methods that accepts only `String`s. See discussion at #20352. --- Library/Homebrew/cmd/info.rb | 4 +-- Library/Homebrew/cmd/update-report.rb | 4 +-- Library/Homebrew/extend/kernel.rb | 39 ++++++++++++++++++--------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index eb92087faa..a2cceeac5f 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -371,9 +371,9 @@ module Homebrew def decorate_dependencies(dependencies) deps_status = dependencies.map do |dep| if dep.satisfied?([]) - pretty_installed(dep_display_s(dep)) + pretty_installed_string(dep_display_s(dep)) else - pretty_uninstalled(dep_display_s(dep)) + pretty_uninstalled_string(dep_display_s(dep)) end end deps_status.join(", ") diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index c74b725e7e..4856100dfb 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -903,7 +903,7 @@ class ReporterHub sig { void } def dump_deleted_formula_report formulae = select_formula_or_cask(:D).sort.filter_map do |name| - pretty_uninstalled(name) if installed?(name) + pretty_uninstalled_string(name) if installed?(name) end output_dump_formula_or_cask_report "Deleted Installed Formulae", formulae @@ -915,7 +915,7 @@ class ReporterHub casks = select_formula_or_cask(:DC).sort.filter_map do |name| name = T.must(name.split("/").last) - pretty_uninstalled(name) if cask_installed?(name) + pretty_uninstalled_string(name) if cask_installed?(name) end output_dump_formula_or_cask_report "Deleted Installed Casks", casks diff --git a/Library/Homebrew/extend/kernel.rb b/Library/Homebrew/extend/kernel.rb index cbcbc8fefe..bfc3e03c21 100644 --- a/Library/Homebrew/extend/kernel.rb +++ b/Library/Homebrew/extend/kernel.rb @@ -234,36 +234,51 @@ module Kernel odeprecated(method, replacement, disable: true, disable_on:, disable_for_developers:, caller:) end - sig { params(formula: T.any(String, Formula)).returns(String) } + sig { params(formula: Formula).returns(String) } def pretty_installed(formula) + pretty_installed_string(formula.to_s) + end + + sig { params(string: String).returns(String) } + def pretty_installed_string(string) if !$stdout.tty? - formula.to_s + string elsif Homebrew::EnvConfig.no_emoji? - Formatter.success("#{Tty.bold}#{formula} (installed)#{Tty.reset}") + Formatter.success("#{Tty.bold}#{string} (installed)#{Tty.reset}") else - "#{Tty.bold}#{formula} #{Formatter.success("✔")}#{Tty.reset}" + "#{Tty.bold}#{string} #{Formatter.success("✔")}#{Tty.reset}" end end - sig { params(formula: T.any(String, Formula)).returns(String) } + sig { params(formula: Formula).returns(String) } def pretty_outdated(formula) + pretty_outdated_string(formula.to_s) + end + + sig { params(string: String).returns(String) } + def pretty_outdated_string(string) if !$stdout.tty? - formula.to_s + string elsif Homebrew::EnvConfig.no_emoji? - Formatter.error("#{Tty.bold}#{formula} (outdated)#{Tty.reset}") + Formatter.error("#{Tty.bold}#{string} (outdated)#{Tty.reset}") else - "#{Tty.bold}#{formula} #{Formatter.warning("⚠")}#{Tty.reset}" + "#{Tty.bold}#{string} #{Formatter.warning("⚠")}#{Tty.reset}" end end - sig { params(formula: T.any(String, Formula)).returns(String) } + sig { params(formula: Formula).returns(String) } def pretty_uninstalled(formula) + pretty_uninstalled_string(formula.to_s) + end + + sig { params(string: String).returns(String) } + def pretty_uninstalled_string(string) if !$stdout.tty? - formula.to_s + string elsif Homebrew::EnvConfig.no_emoji? - Formatter.error("#{Tty.bold}#{formula} (uninstalled)#{Tty.reset}") + Formatter.error("#{Tty.bold}#{string} (uninstalled)#{Tty.reset}") else - "#{Tty.bold}#{formula} #{Formatter.error("✘")}#{Tty.reset}" + "#{Tty.bold}#{string} #{Formatter.error("✘")}#{Tty.reset}" end end