From 28349370d3131f36efceb566649eead8f6758736 Mon Sep 17 00:00:00 2001 From: Issy Long Date: Wed, 18 Sep 2024 20:39:57 +0000 Subject: [PATCH 1/2] Bump more files to Sorbet `typed: strict` --- Library/Homebrew/brew.rb | 2 +- Library/Homebrew/cask/migrator.rb | 8 +++++-- Library/Homebrew/formula_cellar_checks.rb | 11 +++++---- Library/Homebrew/help.rb | 27 +++++++++++++++++++++-- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 6898eff1f13e0..dbe7acc2105c8 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -144,7 +144,7 @@ end rescue UsageError => e require "help" - Homebrew::Help.help cmd, remaining_args: args&.remaining, usage_error: e.message + Homebrew::Help.help cmd, remaining_args: args&.remaining || [], usage_error: e.message rescue SystemExit => e onoe "Kernel.exit" if args&.debug? && !e.success? if args&.debug? || ARGV.include?("--debug") diff --git a/Library/Homebrew/cask/migrator.rb b/Library/Homebrew/cask/migrator.rb index 9f15da316cf0a..1b9648869500b 100644 --- a/Library/Homebrew/cask/migrator.rb +++ b/Library/Homebrew/cask/migrator.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "cask/cask_loader" @@ -6,6 +6,7 @@ module Cask class Migrator + sig { returns(Cask) } attr_reader :old_cask, :new_cask sig { params(old_cask: Cask, new_cask: Cask).void } @@ -38,7 +39,10 @@ def migrate(dry_run: false) old_caskroom_path = old_cask.caskroom_path new_caskroom_path = new_cask.caskroom_path - old_installed_caskfile = old_cask.installed_caskfile.relative_path_from(old_caskroom_path) + old_caskfile = old_cask.installed_caskfile + return if old_caskfile.nil? + + old_installed_caskfile = old_caskfile.relative_path_from(old_caskroom_path) new_installed_caskfile = old_installed_caskfile.dirname/old_installed_caskfile.basename.sub( old_token, new_token, diff --git a/Library/Homebrew/formula_cellar_checks.rb b/Library/Homebrew/formula_cellar_checks.rb index 45973181e7631..93cf4b9d7e9ce 100644 --- a/Library/Homebrew/formula_cellar_checks.rb +++ b/Library/Homebrew/formula_cellar_checks.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "utils/shell" @@ -191,6 +191,7 @@ def check_elisp_root(share, name) EOS end + sig { params(lib: Pathname, deps: T::Array[Dependency]).returns(T.nilable(String)) } def check_python_packages(lib, deps) return unless lib.directory? @@ -250,6 +251,7 @@ def check_shim_references(prefix) EOS end + sig { params(prefix: Pathname, plist: Pathname).returns(T.nilable(String)) } def check_plist(prefix, plist) return unless prefix.directory? @@ -412,7 +414,7 @@ def check_binary_arches(formula) sig { void } def audit_installed - @new_formula ||= false + @new_formula ||= T.let(false, T.nilable(T::Boolean)) problem_if_output(check_manpages) problem_if_output(check_infopages) @@ -442,8 +444,9 @@ def relative_glob(dir, pattern) File.directory?(dir) ? Dir.chdir(dir) { Dir[pattern] } : [] end - def cpuid_instruction?(file, objdump = "objdump") - @instruction_column_index ||= {} + sig { params(file: T.any(Pathname, String), objdump: Pathname).returns(T::Boolean) } + def cpuid_instruction?(file, objdump) + @instruction_column_index ||= T.let({}, T.nilable(T::Hash[Pathname, Integer])) @instruction_column_index[objdump] ||= begin objdump_version = Utils.popen_read(objdump, "--version") diff --git a/Library/Homebrew/help.rb b/Library/Homebrew/help.rb index 88b6e297baeb2..ef6d975f50221 100644 --- a/Library/Homebrew/help.rb +++ b/Library/Homebrew/help.rb @@ -1,4 +1,4 @@ -# typed: true # rubocop:todo Sorbet/StrictSigil +# typed: strict # frozen_string_literal: true require "cli/parser" @@ -7,6 +7,14 @@ module Homebrew # Helper module for printing help output. module Help + sig { + params( + cmd: T.nilable(String), + empty_argv: T::Boolean, + usage_error: T.nilable(String), + remaining_args: T::Array[String], + ).void + } def self.help(cmd = nil, empty_argv: false, usage_error: nil, remaining_args: []) if cmd.nil? # Handle `brew` (no arguments). @@ -39,6 +47,13 @@ def self.help(cmd = nil, empty_argv: false, usage_error: nil, remaining_args: [] exit 0 end + sig { + params( + cmd: String, + path: Pathname, + remaining_args: T::Array[String], + ).returns(String) + } def self.command_help(cmd, path, remaining_args:) # Only some types of commands can have a parser. output = if Commands.valid_internal_cmd?(cmd) || @@ -58,6 +73,12 @@ def self.command_help(cmd, path, remaining_args:) end private_class_method :command_help + sig { + params( + path: Pathname, + remaining_args: T::Array[String], + ).returns(T.nilable(String)) + } def self.parser_help(path, remaining_args:) # Let OptionParser generate help text for commands which have a parser. cmd_parser = CLI::Parser.from_cmd_path(path) @@ -69,14 +90,16 @@ def self.parser_help(path, remaining_args:) end private_class_method :parser_help + sig { params(path: Pathname).returns(T::Array[String]) } def self.command_help_lines(path) path.read .lines .grep(/^#:/) - .map { |line| line.slice(2..-1).delete_prefix(" ") } + .filter_map { |line| line.slice(2..-1)&.delete_prefix(" ") } end private_class_method :command_help_lines + sig { params(path: Pathname).returns(T.nilable(String)) } def self.comment_help(path) # Otherwise read #: lines from the file. help_lines = command_help_lines(path) From d1892d436af2be2f3196f567354f4eb3a27ff071 Mon Sep 17 00:00:00 2001 From: Issy Long Date: Sat, 5 Oct 2024 23:25:09 +0100 Subject: [PATCH 2/2] Fix leftover errors for `Dependencies` vs. `T::Array[Dependency]` --- Library/Homebrew/dependencies.rb | 5 +++++ Library/Homebrew/formula_cellar_checks.rb | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index 3e8bd125e83d6..354b12745e2b8 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -39,6 +39,11 @@ def dup_without_system_deps def inspect "#<#{self.class.name}: #{__getobj__}>" end + + sig { returns(T::Array[Dependency]) } + def to_a + __getobj__.to_a + end end # A collection of requirements. diff --git a/Library/Homebrew/formula_cellar_checks.rb b/Library/Homebrew/formula_cellar_checks.rb index 93cf4b9d7e9ce..26e4f2f0665b8 100644 --- a/Library/Homebrew/formula_cellar_checks.rb +++ b/Library/Homebrew/formula_cellar_checks.rb @@ -191,7 +191,7 @@ def check_elisp_root(share, name) EOS end - sig { params(lib: Pathname, deps: T::Array[Dependency]).returns(T.nilable(String)) } + sig { params(lib: Pathname, deps: Dependencies).returns(T.nilable(String)) } def check_python_packages(lib, deps) return unless lib.directory? @@ -209,7 +209,8 @@ def check_python_packages(lib, deps) return if pythons.blank? - python_deps = deps.map(&:name) + python_deps = deps.to_a + .map(&:name) .grep(/^python(@.*)?$/) .filter_map { |d| Formula[d].version.to_s[/^\d+\.\d+/] }