Fix handling of case-mistyped commands

- hide warnings when requiring files repeatedly on a case-insensitive
  filesystem and add reference to Ruby bugs
- add another case to check for command require failures
- also handle commands with `-` in them

Fixes #19125
This commit is contained in:
Mike McQuaid 2025-01-27 08:42:49 +00:00
parent de294f314f
commit d555ec9218
No known key found for this signature in database
2 changed files with 14 additions and 3 deletions

View File

@ -61,6 +61,7 @@ begin
ENV["PATH"] = path.to_s
require "commands"
require "warnings"
internal_cmd = Commands.valid_internal_cmd?(cmd) || Commands.valid_internal_dev_cmd?(cmd) if cmd
@ -96,8 +97,10 @@ begin
begin
Homebrew.public_send Commands.method_name(cmd)
rescue NoMethodError => e
case_error = "undefined method `#{cmd.downcase}' for module Homebrew"
odie "Unknown command: brew #{cmd}" if e.message == case_error
converted_cmd = cmd.downcase.tr("-", "_")
case_error = "undefined method `#{converted_cmd}' for module Homebrew"
private_method_error = "private method `#{converted_cmd}' called for module Homebrew"
odie "Unknown command: brew #{cmd}" if [case_error, private_method_error].include?(e.message)
raise
end

View File

@ -8,7 +8,15 @@ module Kernel
def require?(path)
return false if path.nil?
if defined?(Warnings)
# Work around require warning when done repeatedly:
# https://bugs.ruby-lang.org/issues/21091
Warnings.ignore(/already initialized constant/, /previous definition of/) do
require path
end
else
require path
end
true
rescue LoadError => e
# we should raise on syntax errors but not if the file doesn't exist.