diff --git a/Library/Homebrew/cmd/--cache.rb b/Library/Homebrew/cmd/--cache.rb index 1e39aa66c9..00d0847748 100644 --- a/Library/Homebrew/cmd/--cache.rb +++ b/Library/Homebrew/cmd/--cache.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "fetch" @@ -10,10 +10,8 @@ module Homebrew extend Fetch - module_function - sig { returns(CLI::Parser) } - def __cache_args + def self.__cache_args Homebrew::CLI::Parser.new do description <<~EOS Display Homebrew's download cache. See also `HOMEBREW_CACHE`. @@ -41,7 +39,7 @@ module Homebrew end sig { void } - def __cache + def self.__cache args = __cache_args.parse if args.no_named? @@ -61,9 +59,9 @@ module Homebrew end sig { params(formula: Formula, args: CLI::Args).void } - def print_formula_cache(formula, args:) + def self.print_formula_cache(formula, args:) if fetch_bottle?(formula, args: args) - puts formula.bottle_for_tag(args.bottle_tag&.to_sym).cached_download + puts formula.bottle_for_tag(args.bottle_tag&.to_sym)&.cached_download elsif args.HEAD? puts formula.head.cached_download else @@ -72,7 +70,7 @@ module Homebrew end sig { params(cask: Cask::Cask).void } - def print_cask_cache(cask) + def self.print_cask_cache(cask) puts Cask::Download.new(cask).downloader.cached_location end end diff --git a/Library/Homebrew/cmd/--prefix.rb b/Library/Homebrew/cmd/--prefix.rb index e6c476466a..ead995cb62 100644 --- a/Library/Homebrew/cmd/--prefix.rb +++ b/Library/Homebrew/cmd/--prefix.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -105,7 +105,8 @@ module Homebrew arguments.concat UNBREWED_EXCLUDE_PATHS.flat_map { |d| %W[! -path #{d}] } arguments.push ")" - cd HOMEBREW_PREFIX + # This is a false positive type error: https://github.com/sorbet/sorbet/issues/6812 + T.unsafe(self).cd HOMEBREW_PREFIX safe_system "find", *arguments end end diff --git a/Library/Homebrew/cmd/commands.rb b/Library/Homebrew/cmd/commands.rb index ea41c1efa3..f7ea8186b4 100644 --- a/Library/Homebrew/cmd/commands.rb +++ b/Library/Homebrew/cmd/commands.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -32,7 +32,7 @@ module Homebrew return end - prepend_separator = false + prepend_separator = T.let(false, T::Boolean) { "Built-in commands" => Commands.internal_commands, diff --git a/Library/Homebrew/cmd/deps.rb b/Library/Homebrew/cmd/deps.rb index 2ca0ca80bc..f04add7c65 100644 --- a/Library/Homebrew/cmd/deps.rb +++ b/Library/Homebrew/cmd/deps.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" @@ -12,10 +12,8 @@ module Homebrew extend DependenciesHelpers - module_function - sig { returns(CLI::Parser) } - def deps_args + def self.deps_args Homebrew::CLI::Parser.new do description <<~EOS Show dependencies for . Additional options specific to @@ -78,7 +76,7 @@ module Homebrew end end - def deps + def self.deps args = deps_args.parse all = args.eval_all? @@ -164,16 +162,16 @@ module Homebrew puts all_deps end - def sorted_dependents(formulae_or_casks) + def self.sorted_dependents(formulae_or_casks) dependents(formulae_or_casks).sort_by(&:name) end - def condense_requirements(deps, args:) + def self.condense_requirements(deps, args:) deps.select! { |dep| dep.is_a?(Dependency) } unless args.include_requirements? deps.select! { |dep| dep.is_a?(Requirement) || dep.installed? } if args.installed? end - def dep_display_name(dep, args:) + def self.dep_display_name(dep, args:) str = if dep.is_a? Requirement if args.include_requirements? ":#{dep.display_s}" @@ -198,7 +196,7 @@ module Homebrew str end - def deps_for_dependent(d, args:, recursive: false) + def self.deps_for_dependent(d, args:, recursive: false) includes, ignores = args_includes_ignores(args) deps = d.runtime_dependencies if @use_runtime_dependencies @@ -214,11 +212,11 @@ module Homebrew deps + reqs.to_a end - def deps_for_dependents(dependents, args:, recursive: false, &block) + def self.deps_for_dependents(dependents, args:, recursive: false, &block) dependents.map { |d| deps_for_dependent(d, recursive: recursive, args: args) }.reduce(&block) end - def puts_deps(dependents, args:, recursive: false) + def self.puts_deps(dependents, args:, recursive: false) dependents.each do |dependent| deps = deps_for_dependent(dependent, recursive: recursive, args: args) condense_requirements(deps, args: args) @@ -228,7 +226,7 @@ module Homebrew end end - def dot_code(dependents, recursive:, args:) + def self.dot_code(dependents, recursive:, args:) dep_graph = {} dependents.each do |d| graph_deps(d, dep_graph: dep_graph, recursive: recursive, args: args) @@ -251,7 +249,7 @@ module Homebrew "digraph {\n#{dot_code}\n}" end - def graph_deps(f, dep_graph:, recursive:, args:) + def self.graph_deps(f, dep_graph:, recursive:, args:) return if dep_graph.key?(f) dependables = dependables(f, args: args) @@ -268,7 +266,7 @@ module Homebrew end end - def puts_deps_tree(dependents, args:, recursive: false) + def self.puts_deps_tree(dependents, args:, recursive: false) dependents.each do |d| puts d.full_name recursive_deps_tree(d, dep_stack: [], prefix: "", recursive: recursive, args: args) @@ -276,7 +274,7 @@ module Homebrew end end - def dependables(f, args:) + def self.dependables(f, args:) includes, ignores = args_includes_ignores(args) deps = @use_runtime_dependencies ? f.runtime_dependencies : f.deps deps = reject_ignores(deps, ignores, includes) @@ -285,7 +283,7 @@ module Homebrew reqs + deps end - def recursive_deps_tree(f, dep_stack:, prefix:, recursive:, args:) + def self.recursive_deps_tree(f, dep_stack:, prefix:, recursive:, args:) dependables = dependables(f, args: args) max = dependables.length - 1 dep_stack.push f.name diff --git a/Library/Homebrew/cmd/desc.rb b/Library/Homebrew/cmd/desc.rb index 965e8f23a8..8abbf08588 100644 --- a/Library/Homebrew/cmd/desc.rb +++ b/Library/Homebrew/cmd/desc.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "descriptions" diff --git a/Library/Homebrew/cmd/doctor.rb b/Library/Homebrew/cmd/doctor.rb index 8f4de98b8c..d5956b2242 100644 --- a/Library/Homebrew/cmd/doctor.rb +++ b/Library/Homebrew/cmd/doctor.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "diagnostic" @@ -8,10 +8,8 @@ require "cask/caskroom" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def doctor_args + def self.doctor_args Homebrew::CLI::Parser.new do description <<~EOS Check your system for potential problems. Will exit with a non-zero status @@ -30,7 +28,7 @@ module Homebrew end end - def doctor + def self.doctor args = doctor_args.parse inject_dump_stats!(Diagnostic::Checks, /^check_*/) if args.audit_debug? @@ -53,7 +51,7 @@ module Homebrew methods = args.named end - first_warning = true + first_warning = T.let(true, T::Boolean) methods.each do |method| $stderr.puts Formatter.headline("Checking #{method}", color: :magenta) if args.debug? unless checks.respond_to?(method) diff --git a/Library/Homebrew/cmd/fetch.rb b/Library/Homebrew/cmd/fetch.rb index d348b69bf2..24234c7150 100644 --- a/Library/Homebrew/cmd/fetch.rb +++ b/Library/Homebrew/cmd/fetch.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" @@ -11,12 +11,10 @@ module Homebrew extend Fetch - module_function - FETCH_MAX_TRIES = 5 sig { returns(CLI::Parser) } - def fetch_args + def self.fetch_args Homebrew::CLI::Parser.new do description <<~EOS Download a bottle (if available) or source packages for e @@ -65,7 +63,7 @@ module Homebrew end end - def fetch + def self.fetch args = fetch_args.parse bucket = if args.deps? @@ -132,7 +130,7 @@ module Homebrew end end - def fetch_resource(r, args:) + def self.fetch_resource(r, args:) puts "Resource: #{r.name}" fetch_fetchable r, args: args rescue ChecksumMismatchError => e @@ -140,28 +138,28 @@ module Homebrew opoo "Resource #{r.name} reports different sha256: #{e.expected}" end - def fetch_formula(f, args:) + def self.fetch_formula(f, args:) fetch_fetchable f, args: args rescue ChecksumMismatchError => e retry if retry_fetch?(f, args: args) opoo "Formula reports different sha256: #{e.expected}" end - def fetch_cask(cask_download, args:) + def self.fetch_cask(cask_download, args:) fetch_fetchable cask_download, args: args rescue ChecksumMismatchError => e retry if retry_fetch?(cask_download, args: args) opoo "Cask reports different sha256: #{e.expected}" end - def fetch_patch(p, args:) + def self.fetch_patch(p, args:) fetch_fetchable p, args: args rescue ChecksumMismatchError => e opoo "Patch reports different sha256: #{e.expected}" Homebrew.failed = true end - def retry_fetch?(f, args:) + def self.retry_fetch?(f, args:) @fetch_tries ||= Hash.new { |h, k| h[k] = 1 } if args.retry? && (@fetch_tries[f] < FETCH_MAX_TRIES) wait = 2 ** @fetch_tries[f] @@ -180,7 +178,7 @@ module Homebrew end end - def fetch_fetchable(f, args:) + def self.fetch_fetchable(f, args:) f.clear_cache if args.force? already_fetched = f.cached_download.exist? diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index 1a4d3f3b42..82d5de39c4 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "missing_formula" @@ -191,7 +191,7 @@ module Homebrew version_hash[version] end - sig { params(all: T::Boolean, args: CLI::Args).void } + sig { params(all: T::Boolean, args: T.untyped).void } def print_json(all, args:) raise FormulaOrCaskUnspecifiedError if !(all || args.installed?) && args.no_named? diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 886631f820..7481ddb3d0 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cask/config" @@ -279,7 +279,11 @@ module Homebrew Homebrew.failed = true # formula name or cask token - name = e.try(:name) || e.token + name = case e + when FormulaOrCaskUnavailableError then e.name + when Cask::CaskUnavailableError then e.token + else T.absurd(e) + end if name == "updog" ofail "What's updog?" diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb index 2bab5bd361..2a5ee074cb 100644 --- a/Library/Homebrew/cmd/list.rb +++ b/Library/Homebrew/cmd/list.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "metafiles" diff --git a/Library/Homebrew/cmd/log.rb b/Library/Homebrew/cmd/log.rb index 9602e87d7c..5b84bcd774 100644 --- a/Library/Homebrew/cmd/log.rb +++ b/Library/Homebrew/cmd/log.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -54,7 +54,8 @@ module Homebrew end def git_log(cd_dir, path = nil, tap = nil, args:) - cd cd_dir + # This is a false positive type error: https://github.com/sorbet/sorbet/issues/6812 + T.unsafe(self).cd cd_dir repo = Utils.popen_read("git", "rev-parse", "--show-toplevel").chomp if tap name = tap.to_s diff --git a/Library/Homebrew/cmd/options.rb b/Library/Homebrew/cmd/options.rb index d83f825529..8263c1cac3 100644 --- a/Library/Homebrew/cmd/options.rb +++ b/Library/Homebrew/cmd/options.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" diff --git a/Library/Homebrew/cmd/outdated.rb b/Library/Homebrew/cmd/outdated.rb index 28186cce9a..becc267a2d 100644 --- a/Library/Homebrew/cmd/outdated.rb +++ b/Library/Homebrew/cmd/outdated.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" @@ -11,10 +11,8 @@ require "api" module Homebrew extend T::Sig - module_function - sig { returns(CLI::Parser) } - def outdated_args + def self.outdated_args Homebrew::CLI::Parser.new do description <<~EOS List installed casks and formulae that have an updated version available. By default, version @@ -52,7 +50,7 @@ module Homebrew end end - def outdated + def self.outdated args = outdated_args.parse case json_version(args.json) @@ -90,7 +88,7 @@ module Homebrew Homebrew.failed = args.named.present? && outdated.present? end - def print_outdated(formulae_or_casks, args:) + def self.print_outdated(formulae_or_casks, args:) formulae_or_casks.each do |formula_or_cask| if formula_or_cask.is_a?(Formula) f = formula_or_cask @@ -128,7 +126,7 @@ module Homebrew end end - def json_info(formulae_or_casks, args:) + def self.json_info(formulae_or_casks, args:) formulae_or_casks.map do |formula_or_cask| if formula_or_cask.is_a?(Formula) f = formula_or_cask @@ -153,11 +151,11 @@ module Homebrew end end - def verbose? + def self.verbose? ($stdout.tty? || super) && !quiet? end - def json_version(version) + def self.json_version(version) version_hash = { nil => nil, true => :default, @@ -170,11 +168,11 @@ module Homebrew version_hash[version] end - def outdated_formulae(args:) + def self.outdated_formulae(args:) select_outdated((args.named.to_resolved_formulae.presence || Formula.installed), args: args).sort end - def outdated_casks(args:) + def self.outdated_casks(args:) if args.named.present? select_outdated(args.named.to_casks, args: args) else @@ -182,7 +180,7 @@ module Homebrew end end - def outdated_formulae_casks(args:) + def self.outdated_formulae_casks(args:) formulae, casks = args.named.to_resolved_formulae_to_casks if formulae.blank? && casks.blank? @@ -193,7 +191,7 @@ module Homebrew [select_outdated(formulae, args: args).sort, select_outdated(casks, args: args)] end - def select_outdated(formulae_or_casks, args:) + def self.select_outdated(formulae_or_casks, args:) formulae_or_casks.select do |formula_or_cask| if formula_or_cask.is_a?(Formula) formula_or_cask.outdated?(fetch_head: args.fetch_HEAD?) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 1a61d57534..8eeb2f370c 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula_installer" diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb index 191ae105f9..c666b7df65 100644 --- a/Library/Homebrew/cmd/search.rb +++ b/Library/Homebrew/cmd/search.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "formula" diff --git a/Library/Homebrew/cmd/tap-info.rb b/Library/Homebrew/cmd/tap-info.rb index 4a471a8e01..039c861dca 100644 --- a/Library/Homebrew/cmd/tap-info.rb +++ b/Library/Homebrew/cmd/tap-info.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -64,6 +64,7 @@ module Homebrew info += ", #{Tap::TAP_DIRECTORY.dup.abv}" if Tap::TAP_DIRECTORY.directory? puts info else + info = "" taps.each_with_index do |tap, i| puts unless i.zero? info = "#{tap}: " diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 94323b369f..58a220cf52 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true require "cli/parser" @@ -121,7 +121,7 @@ module Homebrew Homebrew.messages.display_messages(display_times: args.display_times?) end - sig { params(formulae: T::Array[Formula], args: CLI::Args).returns(T::Boolean) } + sig { params(formulae: T::Array[Formula], args: T.untyped).returns(T::Boolean) } def upgrade_outdated_formulae(formulae, args:) return false if args.cask? @@ -226,7 +226,7 @@ module Homebrew true end - sig { params(casks: T::Array[Cask::Cask], args: CLI::Args).returns(T::Boolean) } + sig { params(casks: T::Array[Cask::Cask], args: T.untyped).returns(T::Boolean) } def upgrade_outdated_casks(casks, args:) return false if args.formula? diff --git a/Library/Homebrew/cmd/uses.rb b/Library/Homebrew/cmd/uses.rb index e1d0c8830c..a4620bc159 100644 --- a/Library/Homebrew/cmd/uses.rb +++ b/Library/Homebrew/cmd/uses.rb @@ -1,4 +1,4 @@ -# typed: false +# typed: true # frozen_string_literal: true # `brew uses foo bar` returns formulae that use both foo and bar @@ -15,10 +15,8 @@ module Homebrew extend DependenciesHelpers - module_function - sig { returns(CLI::Parser) } - def uses_args + def self.uses_args Homebrew::CLI::Parser.new do description <<~EOS Show formulae and casks that specify as a dependency; that is, show dependents @@ -55,7 +53,7 @@ module Homebrew end end - def uses + def self.uses args = uses_args.parse Formulary.enable_factory_cache! @@ -88,7 +86,7 @@ module Homebrew odie "Missing formulae should not have dependents!" if used_formulae_missing end - def intersection_of_dependents(use_runtime_dependents, used_formulae, args:) + def self.intersection_of_dependents(use_runtime_dependents, used_formulae, args:) recursive = args.recursive? show_formulae_and_casks = !args.formula? && !args.cask? includes, ignores = args_includes_ignores(args) @@ -132,7 +130,7 @@ module Homebrew end end - def select_used_dependents(dependents, used_formulae, recursive, includes, ignores) + def self.select_used_dependents(dependents, used_formulae, recursive, includes, ignores) dependents.select do |d| deps = if recursive recursive_includes(Dependency, d, includes, ignores) diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb index b72ecd2ac1..2d480cc0bf 100644 --- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb +++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb @@ -172,7 +172,7 @@ module Homebrew EOS end check_new_version(formula, tap_remote_repo, url: old_url, tag: new_tag, args: args) if new_version.blank? - resource_path, forced_version = fetch_resource(formula, new_version, old_url, tag: new_tag) + resource_path, forced_version = fetch_resource_and_forced_version(formula, new_version, old_url, tag: new_tag) new_revision = Utils.popen_read("git", "-C", resource_path.to_s, "rev-parse", "-q", "--verify", "HEAD") new_revision = new_revision.strip elsif new_revision.blank? @@ -199,7 +199,7 @@ module Homebrew EOS end check_new_version(formula, tap_remote_repo, url: new_url, args: args) if new_version.blank? - resource_path, forced_version = fetch_resource(formula, new_version, new_url) + resource_path, forced_version = fetch_resource_and_forced_version(formula, new_version, new_url) Utils::Tar.validate_file(resource_path) new_hash = resource_path.sha256 end @@ -388,7 +388,7 @@ module Homebrew end end - def fetch_resource(formula, new_version, url, **specs) + def fetch_resource_and_forced_version(formula, new_version, url, **specs) resource = Resource.new resource.url(url, specs) resource.owner = Resource.new(formula.name) diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 3ca0e63535..c0eaae9b41 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -26,9 +26,7 @@ module Homebrew extend Context extend T::Sig - module_function - - def _system(cmd, *args, **options) + def self._system(cmd, *args, **options) pid = fork do yield if block_given? args.map!(&:to_s) @@ -43,7 +41,7 @@ module Homebrew $CHILD_STATUS.success? end - def system(cmd, *args, **options) + def self.system(cmd, *args, **options) if verbose? puts "#{cmd} #{args * " "}".gsub(RUBY_PATH, "ruby") .gsub($LOAD_PATH.join(File::PATH_SEPARATOR).to_s, "$LOAD_PATH") @@ -53,7 +51,7 @@ module Homebrew # rubocop:disable Style/GlobalVars sig { params(the_module: Module, pattern: Regexp).void } - def inject_dump_stats!(the_module, pattern) + def self.inject_dump_stats!(the_module, pattern) @injected_dump_stat_modules ||= {} @injected_dump_stat_modules[the_module] ||= [] injected_methods = @injected_dump_stat_modules[the_module]