diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index e3ab2c8719..e956eba77d 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -135,6 +135,7 @@ rescue MethodDeprecatedError => e $stderr.puts "If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):" $stderr.puts " #{Formatter.url(e.issues_url)}" end + $stderr.puts e.backtrace if ARGV.debug? exit 1 rescue Exception => e # rubocop:disable Lint/RescueException onoe e diff --git a/Library/Homebrew/cask/lib/hbc/cli.rb b/Library/Homebrew/cask/lib/hbc/cli.rb index 5569b9f5a8..21a632bca7 100644 --- a/Library/Homebrew/cask/lib/hbc/cli.rb +++ b/Library/Homebrew/cask/lib/hbc/cli.rb @@ -154,7 +154,7 @@ module Hbc Tap.default_cask_tap.install unless Tap.default_cask_tap.installed? self.class.run_command(command, *args) - rescue CaskError, ArgumentError, OptionParser::InvalidOption => e + rescue CaskError, MethodDeprecatedError, ArgumentError, OptionParser::InvalidOption => e msg = e.message msg << e.backtrace.join("\n").prepend("\n") if ARGV.debug? onoe msg diff --git a/Library/Homebrew/test/utils_spec.rb b/Library/Homebrew/test/utils_spec.rb index 9b5e68d482..fa3409479a 100644 --- a/Library/Homebrew/test/utils_spec.rb +++ b/Library/Homebrew/test/utils_spec.rb @@ -253,7 +253,7 @@ describe "globally-scoped helper methods" do end describe "#odeprecated" do - it "raises a MethodDeprecatedError" do + it "raises a MethodDeprecatedError when `disable` is true" do ENV.delete("HOMEBREW_DEVELOPER") expect { odeprecated( @@ -261,7 +261,7 @@ describe "globally-scoped helper methods" do caller: ["#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core/"], disable: true ) - }.to raise_error(MethodDeprecatedError, %r{method.*replacement.*homebrew/homebrew-core.*homebrew/core}m) + }.to raise_error(MethodDeprecatedError, %r{method.*replacement.*homebrew/core.*\/Taps\/homebrew\/homebrew-core\/}m) end end diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 6e04ea27b8..20319c4c35 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -11,6 +11,7 @@ require "utils/link" require "utils/popen" require "utils/svn" require "utils/tty" +require "tap_constants" require "time" def require?(path) @@ -86,7 +87,6 @@ def odeprecated(method, replacement = nil, disable: false, disable_on: nil, call # - Location outside of 'compat/'. # - Location of caller of deprecated method (if all else fails). backtrace = caller - tap_message = nil # Don't throw deprecations at all for cached, .brew or .metadata files. return if backtrace.any? do |line| @@ -95,31 +95,26 @@ def odeprecated(method, replacement = nil, disable: false, disable_on: nil, call line.include?("/.metadata/") end - caller_message = backtrace.detect do |line| - next unless line =~ %r{^#{Regexp.escape(HOMEBREW_LIBRARY)}/Taps/([^/]+/[^/]+)/} - tap = Tap.fetch Regexp.last_match(1) - tap_message = "\nPlease report this to the #{tap} tap!" - true - end - caller_message ||= backtrace.detect do |line| - !line.start_with?("#{HOMEBREW_LIBRARY_PATH}/compat/") - end - caller_message ||= backtrace[1] + tap_message = nil - message = <<~EOS - Calling #{method} is #{verb}! - #{replacement_message} - #{caller_message}#{tap_message} - EOS + backtrace.each do |line| + next unless match = line.match(HOMEBREW_TAP_PATH_REGEX) + tap = Tap.fetch(match[:user], match[:repo]) + tap_message = "\nPlease report this to the #{tap} tap" + tap_message += ", or even better, submit a PR to fix it" if replacement + tap_message << ":\n #{line.sub(/^(.*\:\d+)\:.*$/, '\1')}\n\n" + break + end - if ARGV.homebrew_developer? || disable || - Homebrew.raise_deprecation_exceptions? - if replacement || tap_message - message += "Or, even better, submit a PR to fix it!" - end - raise MethodDeprecatedError, message + message = "Calling #{method} is #{verb}! #{replacement_message}" + message << tap_message if tap_message + + if ARGV.homebrew_developer? || disable || Homebrew.raise_deprecation_exceptions? + exception = MethodDeprecatedError.new(message) + exception.set_backtrace(backtrace) + raise exception elsif !Homebrew.auditing? - opoo "#{message}\n" + opoo message end end