From f4c9a96c707cc1111eaf97591bfd4aa6aa8ef92e Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Mon, 13 Mar 2023 18:31:26 -0700 Subject: [PATCH] Enable types in dev-cmd --- Library/Homebrew/cask/uninstall.rb | 2 +- Library/Homebrew/dev-cmd/audit.rb | 18 +++--- Library/Homebrew/dev-cmd/bottle.rb | 44 +++++++-------- Library/Homebrew/dev-cmd/bump-cask-pr.rb | 4 +- Library/Homebrew/dev-cmd/cat.rb | 71 ++++++++++++------------ Library/Homebrew/dev-cmd/extract.rb | 40 ++++++------- Library/Homebrew/dev-cmd/pr-publish.rb | 4 +- Library/Homebrew/dev-cmd/pr-pull.rb | 34 ++++++------ Library/Homebrew/dev-cmd/sh.rb | 4 +- Library/Homebrew/dev-cmd/tap-new.rb | 10 ++-- Library/Homebrew/extend/kernel.rb | 1 + Library/Homebrew/utils/git.rb | 6 ++ 12 files changed, 118 insertions(+), 120 deletions(-) diff --git a/Library/Homebrew/cask/uninstall.rb b/Library/Homebrew/cask/uninstall.rb index 71b3684a00..9f28b3f14c 100644 --- a/Library/Homebrew/cask/uninstall.rb +++ b/Library/Homebrew/cask/uninstall.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true module Cask diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index c5dac1cb53..15ddc1f72f 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" @@ -22,10 +22,8 @@ require "tap_auditor" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def audit_args + def self.audit_args Homebrew::CLI::Parser.new do description <<~EOS Check for Homebrew coding style violations. This should be run before @@ -103,7 +101,7 @@ module Homebrew end sig { void } - def audit + def self.audit args = audit_args.parse Homebrew.auditing = true @@ -117,7 +115,7 @@ module Homebrew strict = new_formula || args.strict? online = new_formula || args.online? skip_style = args.skip_style? || args.no_named? || args.tap - no_named_args = false + no_named_args = T.let(false, T::Boolean) ENV.activate_extensions! ENV.setup_build_environment @@ -195,7 +193,7 @@ module Homebrew # load licenses spdx_license_data = SPDX.license_data spdx_exception_data = SPDX.exception_data - new_formula_problem_lines = [] + new_formula_problem_lines = T.let([], T::Array[String]) formula_results = audit_formulae.sort.to_h do |f| only = only_cops ? ["style"] : args.only options = { @@ -320,16 +318,16 @@ module Homebrew end end - def format_problem_lines(problems) + def self.format_problem_lines(problems) problems.uniq .map { |message:, location:| format_problem(message, location) } end - def format_problem(message, location) + def self.format_problem(message, location) "* #{location&.to_s&.dup&.concat(": ")}#{message.chomp.gsub("\n", "\n ")}" end - def without_api(&block) + def self.without_api(&block) return yield if Homebrew::EnvConfig.no_install_from_api? with_env(HOMEBREW_NO_INSTALL_FROM_API: "1", HOMEBREW_AUTOMATICALLY_SET_NO_INSTALL_FROM_API: "1", &block) diff --git a/Library/Homebrew/dev-cmd/bottle.rb b/Library/Homebrew/dev-cmd/bottle.rb index 2a71804855..be35d3211c 100644 --- a/Library/Homebrew/dev-cmd/bottle.rb +++ b/Library/Homebrew/dev-cmd/bottle.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" @@ -38,10 +38,8 @@ ALLOWABLE_HOMEBREW_REPOSITORY_LINKS = [ module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def bottle_args + def self.bottle_args Homebrew::CLI::Parser.new do description <<~EOS Generate a bottle (binary package) from a formula that was installed with @@ -94,7 +92,7 @@ module Homebrew end end - def bottle + def self.bottle args = bottle_args.parse if args.merge? @@ -107,7 +105,7 @@ module Homebrew end end - def keg_contain?(string, keg, ignores, formula_and_runtime_deps_names = nil, args:) + def self.keg_contain?(string, keg, ignores, formula_and_runtime_deps_names = nil, args:) @put_string_exists_header, @put_filenames = nil print_filename = lambda do |str, filename| @@ -124,7 +122,7 @@ module Homebrew @put_filenames << filename end - result = false + result = T.let(false, T::Boolean) keg.each_unique_file_matching(string) do |file| next if Metafiles::EXTENSIONS.include?(file.extname) # Skip document files. @@ -157,7 +155,7 @@ module Homebrew keg_contain_absolute_symlink_starting_with?(string, keg, args: args) || result end - def keg_contain_absolute_symlink_starting_with?(string, keg, args:) + def self.keg_contain_absolute_symlink_starting_with?(string, keg, args:) absolute_symlinks_start_with_string = [] keg.find do |pn| next if !pn.symlink? || !(link = pn.readlink).absolute? @@ -175,7 +173,7 @@ module Homebrew !absolute_symlinks_start_with_string.empty? end - def cellar_parameter_needed?(cellar) + def self.cellar_parameter_needed?(cellar) default_cellars = [ Homebrew::DEFAULT_MACOS_CELLAR, Homebrew::DEFAULT_MACOS_ARM_CELLAR, @@ -184,7 +182,7 @@ module Homebrew cellar.present? && default_cellars.exclude?(cellar) end - def generate_sha256_line(tag, digest, cellar, tag_column, digest_column) + def self.generate_sha256_line(tag, digest, cellar, tag_column, digest_column) line = "sha256 " tag_column += line.length digest_column += line.length @@ -199,7 +197,7 @@ module Homebrew %Q(#{line}"#{digest}") end - def bottle_output(bottle, root_url_using) + def self.bottle_output(bottle, root_url_using) cellars = bottle.checksums.map do |checksum| cellar = checksum["cellar"] next unless cellar_parameter_needed? cellar @@ -227,13 +225,13 @@ module Homebrew erb.result(erb_binding).gsub(/^\s*$\n/, "") end - def sudo_purge + def self.sudo_purge return unless ENV["HOMEBREW_BOTTLE_SUDO_PURGE"] system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge" end - def setup_tar_and_args!(args, mtime) + def self.setup_tar_and_args!(args, mtime) # Without --only-json-tab bottles are never reproducible default_tar_args = ["tar", [].freeze].freeze return default_tar_args unless args.only_json_tab? @@ -261,7 +259,7 @@ module Homebrew ["#{gnu_tar.opt_bin}/gtar", gnutar_args].freeze end - def formula_ignores(formula) + def self.formula_ignores(formula) ignores = [] cellar_regex = Regexp.escape(HOMEBREW_CELLAR) prefix_regex = Regexp.escape(HOMEBREW_PREFIX) @@ -291,7 +289,7 @@ module Homebrew ignores.compact end - def bottle_formula(formula, args:) + def self.bottle_formula(formula, args:) local_bottle_json = args.json? && formula.local_bottle_path.present? unless local_bottle_json @@ -425,7 +423,7 @@ module Homebrew sudo_purge # Set filename as it affects the tarball checksum. relocatable_tar_path = "#{formula}-bottle.tar" - mv tar_path, relocatable_tar_path + mv T.must(tar_path), relocatable_tar_path # Use gzip, faster to compress than bzip2, faster to uncompress than bzip2 # or an uncompressed tarball (and more bandwidth friendly). Utils::Gzip.compress_with_options(relocatable_tar_path, @@ -572,13 +570,13 @@ module Homebrew json_path.write(JSON.pretty_generate(json)) end - def parse_json_files(filenames) + def self.parse_json_files(filenames) filenames.map do |filename| JSON.parse(File.read(filename)) end end - def merge_json_files(json_files) + def self.merge_json_files(json_files) json_files.reduce({}) do |hash, json_file| json_file.each_value do |json_hash| json_bottle = json_hash["bottle"] @@ -591,7 +589,7 @@ module Homebrew end end - def merge(args:) + def self.merge(args:) bottles_hash = merge_json_files(parse_json_files(args.named)) any_cellars = ["any", "any_skip_relocation"] @@ -660,7 +658,7 @@ module Homebrew end end - all_bottle_hash = nil + all_bottle_hash = T.let(nil, T.nilable(Hash)) bottle_hash["bottle"]["tags"].each do |tag, tag_hash| filename = Bottle::Filename.new( formula_name, @@ -745,7 +743,7 @@ module Homebrew end end - def merge_bottle_spec(old_keys, old_bottle_spec, new_bottle_hash) + def self.merge_bottle_spec(old_keys, old_bottle_spec, new_bottle_hash) mismatches = [] checksums = [] @@ -785,12 +783,12 @@ module Homebrew [mismatches, checksums] end - def old_checksums(formula, formula_ast, bottle_hash, args:) + def self.old_checksums(formula, formula_ast, bottle_hash, args:) bottle_node = formula_ast.bottle_block return if bottle_node.nil? return [] unless args.keep_old? - old_keys = Utils::AST.body_children(bottle_node.body).map(&:method_name) + old_keys = T.cast(Utils::AST.body_children(bottle_node.body), T::Array[RuboCop::AST::SendNode]).map(&:method_name) old_bottle_spec = formula.bottle_specification mismatches, checksums = merge_bottle_spec(old_keys, old_bottle_spec, bottle_hash["bottle"]) if mismatches.present? diff --git a/Library/Homebrew/dev-cmd/bump-cask-pr.rb b/Library/Homebrew/dev-cmd/bump-cask-pr.rb index d00b417f61..bb485b1b4b 100644 --- a/Library/Homebrew/dev-cmd/bump-cask-pr.rb +++ b/Library/Homebrew/dev-cmd/bump-cask-pr.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cask" @@ -158,7 +158,7 @@ module Homebrew m = /^ +url "(.+?)"\n/m.match(old_contents) odie "Could not find old URL in cask!" if m.nil? - old_base_url = m.captures.first + old_base_url = m.captures.fetch(0) replacement_pairs << [ /#{Regexp.escape(old_base_url)}/, diff --git a/Library/Homebrew/dev-cmd/cat.rb b/Library/Homebrew/dev-cmd/cat.rb index 734d570c7b..7b9faa1c25 100644 --- a/Library/Homebrew/dev-cmd/cat.rb +++ b/Library/Homebrew/dev-cmd/cat.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -6,10 +6,8 @@ require "cli/parser" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def cat_args + def self.cat_args Homebrew::CLI::Parser.new do description <<~EOS Display the source of a or . @@ -26,40 +24,41 @@ module Homebrew end end - def cat + def self.cat args = cat_args.parse - cd HOMEBREW_REPOSITORY - pager = if Homebrew::EnvConfig.bat? - ENV["BAT_CONFIG_PATH"] = Homebrew::EnvConfig.bat_config_path - ENV["BAT_THEME"] = Homebrew::EnvConfig.bat_theme - ensure_formula_installed!( - "bat", - reason: "displaying / source", - # The user might want to capture the output of `brew cat ...` - # Redirect stdout to stderr - output_to_stderr: true, - ).opt_bin/"bat" - else - "cat" + cd HOMEBREW_REPOSITORY do + pager = if Homebrew::EnvConfig.bat? + ENV["BAT_CONFIG_PATH"] = Homebrew::EnvConfig.bat_config_path + ENV["BAT_THEME"] = Homebrew::EnvConfig.bat_theme + ensure_formula_installed!( + "bat", + reason: "displaying / source", + # The user might want to capture the output of `brew cat ...` + # Redirect stdout to stderr + output_to_stderr: true, + ).opt_bin/"bat" + else + "cat" + end + + args.named.to_paths.each do |path| + next path if path.exist? + + path = path.basename(".rb") if args.cask? + + ofail "#{path}'s source doesn't exist on disk." + end + + if Homebrew.failed? + $stderr.puts "The name may be wrong, or the tap hasn't been tapped. Instead try:" + treat_as = "--cask " if args.cask? + treat_as = "--formula " if args.formula? + $stderr.puts " brew info --github #{treat_as}#{args.named.join(" ")}" + return + end + + safe_system pager, *args.named.to_paths end - - args.named.to_paths.each do |path| - next path if path.exist? - - path = path.basename(".rb") if args.cask? - - ofail "#{path}'s source doesn't exist on disk." - end - - if Homebrew.failed? - $stderr.puts "The name may be wrong, or the tap hasn't been tapped. Instead try:" - treat_as = "--cask " if args.cask? - treat_as = "--formula " if args.formula? - $stderr.puts " brew info --github #{treat_as}#{args.named.join(" ")}" - return - end - - safe_system pager, *args.named.to_paths end end diff --git a/Library/Homebrew/dev-cmd/extract.rb b/Library/Homebrew/dev-cmd/extract.rb index fad9c4a9c0..ac002199cc 100644 --- a/Library/Homebrew/dev-cmd/extract.rb +++ b/Library/Homebrew/dev-cmd/extract.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -8,29 +8,30 @@ require "software_spec" require "tap" def with_monkey_patch + # Since `method_defined?` is not a supported type guard, the use of `alias_method` below is not typesafe: BottleSpecification.class_eval do - alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) + T.unsafe(self).alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) define_method(:method_missing) do |*| # do nothing end end Module.class_eval do - alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) + T.unsafe(self).alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) define_method(:method_missing) do |*| # do nothing end end Resource.class_eval do - alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) + T.unsafe(self).alias_method :old_method_missing, :method_missing if method_defined?(:method_missing) define_method(:method_missing) do |*| # do nothing end end DependencyCollector.class_eval do - alias_method :old_parse_symbol_spec, :parse_symbol_spec if method_defined?(:parse_symbol_spec) + T.unsafe(self).alias_method :old_parse_symbol_spec, :parse_symbol_spec if method_defined?(:parse_symbol_spec) define_method(:parse_symbol_spec) do |*| # do nothing end @@ -40,28 +41,28 @@ def with_monkey_patch ensure BottleSpecification.class_eval do if method_defined?(:old_method_missing) - alias_method :method_missing, :old_method_missing + T.unsafe(self).alias_method :method_missing, :old_method_missing undef :old_method_missing end end Module.class_eval do if method_defined?(:old_method_missing) - alias_method :method_missing, :old_method_missing + T.unsafe(self).alias_method :method_missing, :old_method_missing undef :old_method_missing end end Resource.class_eval do if method_defined?(:old_method_missing) - alias_method :method_missing, :old_method_missing + T.unsafe(self).alias_method :method_missing, :old_method_missing undef :old_method_missing end end DependencyCollector.class_eval do if method_defined?(:old_parse_symbol_spec) - alias_method :parse_symbol_spec, :old_parse_symbol_spec + T.unsafe(self).alias_method :parse_symbol_spec, :old_parse_symbol_spec undef :old_parse_symbol_spec end end @@ -70,12 +71,10 @@ end module Homebrew extend T::Sig - module_function - BOTTLE_BLOCK_REGEX = / bottle (?:do.+?end|:[a-z]+)\n\n/m.freeze sig { returns(CLI::Parser) } - def extract_args + def self.extract_args Homebrew::CLI::Parser.new do usage_banner "`extract` [`--version=`] [`--force`] " description <<~EOS @@ -95,7 +94,7 @@ module Homebrew end end - def extract + def self.extract args = extract_args.parse if (match = args.named.first.match(HOMEBREW_TAP_FORMULA_REGEX)) @@ -126,8 +125,8 @@ module Homebrew ohai "Searching repository history" version = args.version version_segments = Gem::Version.new(version).segments if Gem::Version.correct?(version) - rev = nil - test_formula = nil + rev = T.let(nil, T.nilable(String)) + test_formula = T.let(nil, T.nilable(Formula)) result = "" loop do rev = rev.nil? ? "HEAD" : "#{rev}~1" @@ -166,7 +165,7 @@ module Homebrew else # Search in the root directory of as well as recursively in all of its subdirectories files = Dir[repo/"{,**/}"].map do |dir| - Pathname.glob(["#{dir}/#{name}.rb"]).find(&:file?) + Pathname.glob("#{dir}/#{name}.rb").find(&:file?) end.compact if files.empty? @@ -174,11 +173,11 @@ module Homebrew rev, (path,) = Utils::Git.last_revision_commit_of_files(repo, pattern) odie "Could not find #{name}! The formula or version may not have existed." if rev.nil? file = repo/path - version = formula_at_revision(repo, name, file, rev).version + version = T.must(formula_at_revision(repo, name, file, rev)).version result = Utils::Git.last_revision_of_file(repo, file) else - file = files.first.realpath - rev = "HEAD" + file = files.fetch(0).realpath + rev = T.let("HEAD", T.nilable(String)) version = Formulary.factory(file).version result = File.read(file) end @@ -214,7 +213,8 @@ module Homebrew end # @private - def formula_at_revision(repo, name, file, rev) + sig { params(repo: Pathname, name: String, file: Pathname, rev: String).returns(T.nilable(Formula)) } + def self.formula_at_revision(repo, name, file, rev) return if rev.empty? contents = Utils::Git.last_revision_of_file(repo, file, before_commit: rev) diff --git a/Library/Homebrew/dev-cmd/pr-publish.rb b/Library/Homebrew/dev-cmd/pr-publish.rb index 3e32ee7fef..67731af12b 100644 --- a/Library/Homebrew/dev-cmd/pr-publish.rb +++ b/Library/Homebrew/dev-cmd/pr-publish.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -51,7 +51,7 @@ module Homebrew url_match = arg.match HOMEBREW_PULL_OR_COMMIT_URL_REGEX _, user, repo, issue = *url_match odie "Not a GitHub pull request: #{arg}" unless issue - if args.tap.present? && !"#{user}/#{repo}".casecmp(tap.full_name).zero? + if args.tap.present? && !T.must("#{user}/#{repo}".casecmp(tap.full_name)).zero? odie "Pull request URL is for #{user}/#{repo} but `--tap=#{tap.full_name}` was specified!" end diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb index 914009d1b9..9a1a1618b9 100644 --- a/Library/Homebrew/dev-cmd/pr-pull.rb +++ b/Library/Homebrew/dev-cmd/pr-pull.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "download_strategy" @@ -10,10 +10,8 @@ require "formula" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def pr_pull_args + def self.pr_pull_args Homebrew::CLI::Parser.new do description <<~EOS Download and publish bottles, and apply the bottle commit from a @@ -69,7 +67,7 @@ module Homebrew end # Separates a commit message into subject, body, and trailers. - def separate_commit_message(message) + def self.separate_commit_message(message) subject = message.lines.first.strip # Skip the subject and separate lines that look like trailers (e.g. "Co-authored-by") @@ -82,7 +80,7 @@ module Homebrew [subject, body, trailers] end - def signoff!(path, pr: nil, dry_run: false) + def self.signoff!(path, pr: nil, dry_run: false) subject, body, trailers = separate_commit_message(path.git_commit_message) if pr @@ -108,7 +106,7 @@ module Homebrew end end - def get_package(tap, subject_name, subject_path, content) + def self.get_package(tap, subject_name, subject_path, content) if subject_path.dirname == tap.cask_dir cask = begin Cask::CaskLoader.load(content.dup) @@ -125,7 +123,7 @@ module Homebrew end end - def determine_bump_subject(old_contents, new_contents, subject_path, reason: nil) + def self.determine_bump_subject(old_contents, new_contents, subject_path, reason: nil) subject_path = Pathname(subject_path) tap = Tap.from_path(subject_path) subject_name = subject_path.basename.to_s.chomp(".rb") @@ -153,7 +151,7 @@ module Homebrew # Cherry picks a single commit that modifies a single file. # Potentially rewords this commit using {determine_bump_subject}. - def reword_package_commit(commit, file, reason: "", verbose: false, resolve: false, path: ".") + def self.reword_package_commit(commit, file, reason: "", verbose: false, resolve: false, path: ".") package_file = Pathname.new(path) / file package_name = package_file.basename.to_s.chomp(".rb") @@ -178,7 +176,7 @@ module Homebrew # Cherry picks multiple commits that each modify a single file. # Words the commit according to {determine_bump_subject} with the body # corresponding to all the original commit messages combined. - def squash_package_commits(commits, file, reason: "", verbose: false, resolve: false, path: ".") + def self.squash_package_commits(commits, file, reason: "", verbose: false, resolve: false, path: ".") odebug "Squashing #{file}: #{commits.join " "}" # Format commit messages into something similar to `git fmt-merge-message`. @@ -223,7 +221,7 @@ module Homebrew ohai bump_subject end - def autosquash!(original_commit, tap:, reason: "", verbose: false, resolve: false) + def self.autosquash!(original_commit, tap:, reason: "", verbose: false, resolve: false) original_head = tap.path.git_head commits = Utils.safe_popen_read("git", "-C", tap.path, "rev-list", @@ -257,7 +255,7 @@ module Homebrew # Iterate over every commit in the pull request series, but if we have to squash # multiple commits into one, ensure that we skip over commits we've already squashed. - processed_commits = [] + processed_commits = T.let([], T::Array[String]) commits.each do |commit| next if processed_commits.include? commit @@ -288,7 +286,7 @@ module Homebrew raise end - def cherry_pick_pr!(user, repo, pr, args:, path: ".") + def self.cherry_pick_pr!(user, repo, pr, args:, path: ".") if args.dry_run? puts <<~EOS git fetch --force origin +refs/pull/#{pr}/head @@ -304,7 +302,7 @@ module Homebrew Utils::Git.cherry_pick!(path, "--ff", "--allow-empty", *commits, verbose: args.verbose?, resolve: args.resolve?) end - def formulae_need_bottles?(tap, original_commit, user, repo, pr, args:) + def self.formulae_need_bottles?(tap, original_commit, user, repo, pr, args:) return if args.dry_run? labels = GitHub.pull_request_labels(user, repo, pr) @@ -316,7 +314,7 @@ module Homebrew end end - def changed_packages(tap, original_commit) + def self.changed_packages(tap, original_commit) formulae = Utils.popen_read("git", "-C", tap.path, "diff-tree", "-r", "--name-only", "--diff-filter=AM", original_commit, "HEAD", "--", tap.formula_dir) @@ -352,7 +350,7 @@ module Homebrew formulae + casks end - def download_artifact(url, dir, pr) + def self.download_artifact(url, dir, pr) odie "Credentials must be set to access the Artifacts API" if GitHub::API.credentials_type == :none token = GitHub::API.credentials @@ -368,7 +366,7 @@ module Homebrew end end - def pr_check_conflicts(repo, pr) + def self.pr_check_conflicts(repo, pr) long_build_pr_files = GitHub.issues( repo: repo, state: "open", labels: "no long build conflict", ).each_with_object({}) do |long_build_pr, hash| @@ -415,7 +413,7 @@ module Homebrew EOS end - def pr_pull + def self.pr_pull args = pr_pull_args.parse # Needed when extracting the CI artifact. diff --git a/Library/Homebrew/dev-cmd/sh.rb b/Library/Homebrew/dev-cmd/sh.rb index b531e6675b..4fbc9e2e78 100644 --- a/Library/Homebrew/dev-cmd/sh.rb +++ b/Library/Homebrew/dev-cmd/sh.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "extend/ENV" @@ -38,7 +38,7 @@ module Homebrew ENV.setup_build_environment if superenv?(args.env) # superenv stopped adding brew's bin but generally users will want it - ENV["PATH"] = PATH.new(ENV.fetch("PATH")).insert(1, HOMEBREW_PREFIX/"bin") + ENV["PATH"] = PATH.new(ENV.fetch("PATH")).insert(1, HOMEBREW_PREFIX/"bin").to_s end ENV["VERBOSE"] = "1" if args.verbose? diff --git a/Library/Homebrew/dev-cmd/tap-new.rb b/Library/Homebrew/dev-cmd/tap-new.rb index 54f9bfad50..8662c3a221 100644 --- a/Library/Homebrew/dev-cmd/tap-new.rb +++ b/Library/Homebrew/dev-cmd/tap-new.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "tap" @@ -7,10 +7,8 @@ require "cli/parser" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def tap_new_args + def self.tap_new_args Homebrew::CLI::Parser.new do usage_banner "`tap-new` [] `/`" description <<~EOS @@ -31,7 +29,7 @@ module Homebrew end end - def tap_new + def self.tap_new args = tap_new_args.parse label = args.pull_label || "pr-pull" @@ -176,7 +174,7 @@ module Homebrew EOS end - def write_path(tap, filename, content) + def self.write_path(tap, filename, content) path = tap.path/filename tap.path.mkpath odie "#{path} already exists" if path.exist? diff --git a/Library/Homebrew/extend/kernel.rb b/Library/Homebrew/extend/kernel.rb index 13b5cf3e59..c9500c28f6 100644 --- a/Library/Homebrew/extend/kernel.rb +++ b/Library/Homebrew/extend/kernel.rb @@ -79,6 +79,7 @@ module Kernel Homebrew.failed = true end + sig { params(error: T.any(String, Exception)).returns(T.noreturn) } def odie(error) onoe error exit 1 diff --git a/Library/Homebrew/utils/git.rb b/Library/Homebrew/utils/git.rb index eb492c2832..525ee03cad 100644 --- a/Library/Homebrew/utils/git.rb +++ b/Library/Homebrew/utils/git.rb @@ -7,6 +7,8 @@ module Utils # @see GitRepositoryExtension # @api private module Git + extend T::Sig + module_function def available? @@ -76,6 +78,10 @@ module Utils [rev, paths] end + sig { + params(repo: T.any(Pathname, String), file: T.any(Pathname, String), before_commit: T.nilable(String)) + .returns(String) + } def last_revision_of_file(repo, file, before_commit: nil) relative_file = Pathname(file).relative_path_from(repo) commit_hash = last_revision_commit_of_file(repo, relative_file, before_commit: before_commit)