From f83ba58f8db0406114408e92bb8457a114661bcd Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Fri, 29 Mar 2024 18:21:13 -0700 Subject: [PATCH] Port Homebrew::Cmd::Doctor --- Library/Homebrew/cmd/doctor.rb | 134 +++++++++++------------ Library/Homebrew/test/cmd/doctor_spec.rb | 3 +- 2 files changed, 69 insertions(+), 68 deletions(-) diff --git a/Library/Homebrew/cmd/doctor.rb b/Library/Homebrew/cmd/doctor.rb index d3677fc624..a273921d8e 100644 --- a/Library/Homebrew/cmd/doctor.rb +++ b/Library/Homebrew/cmd/doctor.rb @@ -1,80 +1,80 @@ -# typed: true +# typed: strict # frozen_string_literal: true +require "abstract_command" require "diagnostic" -require "cli/parser" require "cask/caskroom" module Homebrew - sig { returns(CLI::Parser) } - def self.doctor_args - Homebrew::CLI::Parser.new do - description <<~EOS - Check your system for potential problems. Will exit with a non-zero status - if any potential problems are found. + module Cmd + class Doctor < AbstractCommand + cmd_args do + description <<~EOS + Check your system for potential problems. Will exit with a non-zero status + if any potential problems are found. - Please note that these warnings are just used to help the Homebrew maintainers - with debugging if you file an issue. If everything you use Homebrew for - is working fine: please don't worry or file an issue; just ignore this. - EOS - switch "--list-checks", - description: "List all audit methods, which can be run individually " \ - "if provided as arguments." - switch "-D", "--audit-debug", - description: "Enable debugging and profiling of audit methods." - - named_args :diagnostic_check - end - end - - def self.doctor - args = doctor_args.parse - - inject_dump_stats!(Diagnostic::Checks, /^check_*/) if args.audit_debug? - - checks = Diagnostic::Checks.new(verbose: args.verbose?) - - if args.list_checks? - puts checks.all - return - end - - if args.no_named? - slow_checks = %w[ - check_for_broken_symlinks - check_missing_deps - ] - methods = (checks.all - slow_checks) + slow_checks - methods -= checks.cask_checks unless Cask::Caskroom.any_casks_installed? - else - methods = args.named - end - - 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) - ofail "No check available by the name: #{method}" - next - end - - out = checks.send(method) - next if out.blank? - - if first_warning - $stderr.puts <<~EOS - #{Tty.bold}Please note that these warnings are just used to help the Homebrew maintainers - with debugging if you file an issue. If everything you use Homebrew for is - working fine: please don't worry or file an issue; just ignore this. Thanks!#{Tty.reset} + Please note that these warnings are just used to help the Homebrew maintainers + with debugging if you file an issue. If everything you use Homebrew for + is working fine: please don't worry or file an issue; just ignore this. EOS + switch "--list-checks", + description: "List all audit methods, which can be run individually " \ + "if provided as arguments." + switch "-D", "--audit-debug", + description: "Enable debugging and profiling of audit methods." + + named_args :diagnostic_check end - $stderr.puts - opoo out - Homebrew.failed = true - first_warning = false - end + sig { override.void } + def run + Homebrew.inject_dump_stats!(Diagnostic::Checks, /^check_*/) if args.audit_debug? - puts "Your system is ready to brew." if !Homebrew.failed? && !args.quiet? + checks = Diagnostic::Checks.new(verbose: args.verbose?) + + if args.list_checks? + puts checks.all + return + end + + if args.no_named? + slow_checks = %w[ + check_for_broken_symlinks + check_missing_deps + ] + methods = (checks.all - slow_checks) + slow_checks + methods -= checks.cask_checks unless Cask::Caskroom.any_casks_installed? + else + methods = args.named + end + + 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) + ofail "No check available by the name: #{method}" + next + end + + out = checks.send(method) + next if out.blank? + + if first_warning + $stderr.puts <<~EOS + #{Tty.bold}Please note that these warnings are just used to help the Homebrew maintainers + with debugging if you file an issue. If everything you use Homebrew for is + working fine: please don't worry or file an issue; just ignore this. Thanks!#{Tty.reset} + EOS + end + + $stderr.puts + opoo out + Homebrew.failed = true + first_warning = false + end + + puts "Your system is ready to brew." if !Homebrew.failed? && !args.quiet? + end + end end end diff --git a/Library/Homebrew/test/cmd/doctor_spec.rb b/Library/Homebrew/test/cmd/doctor_spec.rb index c82dfb3458..ca20e4a470 100644 --- a/Library/Homebrew/test/cmd/doctor_spec.rb +++ b/Library/Homebrew/test/cmd/doctor_spec.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true +require "cmd/doctor" require "cmd/shared_examples/args_parse" -RSpec.describe "brew doctor" do +RSpec.describe Homebrew::Cmd::Doctor do it_behaves_like "parseable arguments" specify "check_integration_test", :integration_test do