2018-11-03 02:07:56 +03:00
# frozen_string_literal: true
2019-06-01 12:49:40 +03:00
require_relative " vendored_thor "
2018-11-03 02:07:56 +03:00
module Bundler
module FriendlyErrors
2020-10-15 07:20:25 +03:00
module_function
2018-11-03 02:07:56 +03:00
2020-12-08 10:36:29 +03:00
def enable!
@disabled = false
end
def disabled?
@disabled
end
def disable!
@disabled = true
end
2018-11-03 02:07:56 +03:00
def log_error ( error )
case error
when YamlSyntaxError
Bundler . ui . error error . message
Bundler . ui . trace error . orig_exception
when Dsl :: DSLError , GemspecError
Bundler . ui . error error . message
when GemRequireError
Bundler . ui . error error . message
2019-11-11 11:57:45 +03:00
Bundler . ui . trace error . orig_exception
2018-11-03 02:07:56 +03:00
when BundlerError
2022-06-25 22:40:34 +03:00
if Bundler . ui . debug?
Bundler . ui . trace error
else
Bundler . ui . error error . message , :wrap = > true
end
2018-11-03 02:07:56 +03:00
when Thor :: Error
Bundler . ui . error error . message
when Interrupt
Bundler . ui . error " \n Quitting... "
Bundler . ui . trace error
when Gem :: InvalidSpecificationException
Bundler . ui . error error . message , :wrap = > true
when SystemExit
when * [ defined? ( Java :: JavaLang :: OutOfMemoryError ) && Java :: JavaLang :: OutOfMemoryError ] . compact
Bundler . ui . error " \n Your JVM has run out of memory, and Bundler cannot continue. " \
" You can decrease the amount of memory Bundler needs by removing gems from your Gemfile, " \
" especially large gems. (Gems can be as large as hundreds of megabytes, and Bundler has to read those files!). " \
" Alternatively, you can increase the amount of memory the JVM is able to use by running Bundler with jruby -J-Xmx1024m -S bundle (JRuby defaults to 500MB). "
else request_issue_report_for ( error )
end
end
def exit_status ( error )
case error
when BundlerError then error . status_code
when Thor :: Error then 15
when SystemExit then error . status
else 1
end
end
def request_issue_report_for ( e )
2023-03-21 12:57:58 +03:00
Bundler . ui . error << ~ EOS , nil , nil
2018-11-03 02:07:56 +03:00
- - - ERROR REPORT TEMPLATE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
` ` `
2022-05-24 16:23:13 +03:00
#{exception_message(e)}
2018-11-03 02:07:56 +03:00
` ` `
#{Bundler::Env.report}
- - - TEMPLATE END - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EOS
Bundler . ui . error " Unfortunately, an unexpected error occurred, and Bundler cannot continue. "
2023-03-21 12:57:58 +03:00
Bundler . ui . error << ~ EOS , nil , :yellow
2018-11-03 02:07:56 +03:00
First , try this link to see if there are any existing issue reports for this error :
#{issues_url(e)}
2021-10-11 16:42:39 +03:00
If there aren ' t any reports for this error yet , please fill in the new issue form located at #{new_issue_url}, and copy and paste the report template above in there.
2018-11-03 02:07:56 +03:00
EOS
end
2022-05-24 16:23:13 +03:00
def exception_message ( error )
message = serialized_exception_for ( error )
cause = error . cause
return message unless cause
message + serialized_exception_for ( cause )
end
def serialized_exception_for ( e )
2023-03-21 12:57:58 +03:00
<< ~ EOS
2022-05-24 16:23:13 +03:00
#{e.class}: #{e.message}
2022-12-26 08:00:11 +03:00
#{e.backtrace&.join("\n ")&.chomp}
2022-05-24 16:23:13 +03:00
EOS
end
2018-11-03 02:07:56 +03:00
def issues_url ( exception )
message = exception . message . lines . first . tr ( " : " , " " ) . chomp
message = message . split ( " - " ) . first if exception . is_a? ( Errno )
2019-12-14 13:49:16 +03:00
require " cgi "
2020-05-15 15:31:12 +03:00
" https://github.com/rubygems/rubygems/search?q= " \
2018-11-03 02:07:56 +03:00
" #{ CGI . escape ( message ) } &type=Issues "
end
2021-10-11 16:42:39 +03:00
def new_issue_url
" https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
end
2018-11-03 02:07:56 +03:00
end
def self . with_friendly_errors
2020-12-08 10:36:29 +03:00
FriendlyErrors . enable!
2018-11-03 02:07:56 +03:00
yield
rescue SignalException
raise
2019-04-14 09:01:35 +03:00
rescue Exception = > e # rubocop:disable Lint/RescueException
2020-12-08 10:36:29 +03:00
raise if FriendlyErrors . disabled?
2018-11-03 02:07:56 +03:00
FriendlyErrors . log_error ( e )
exit FriendlyErrors . exit_status ( e )
end
end