2018-11-02 19:07:56 -04:00
# frozen_string_literal: true
2019-06-01 05:49:40 -04:00
require_relative " vendored_thor "
2018-11-02 19:07:56 -04:00
module Bundler
module FriendlyErrors
2020-10-15 00:20:25 -04:00
module_function
2018-11-02 19:07:56 -04:00
2020-12-08 02:36:29 -05:00
def enable!
@disabled = false
end
def disabled?
@disabled
end
def disable!
@disabled = true
end
2018-11-02 19:07:56 -04: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 03:57:45 -05:00
Bundler . ui . trace error . orig_exception
2018-11-02 19:07:56 -04:00
when BundlerError
2022-06-25 15:40:34 -04:00
if Bundler . ui . debug?
Bundler . ui . trace error
else
Bundler . ui . error error . message , :wrap = > true
end
2018-11-02 19:07:56 -04:00
when Thor :: Error
Bundler . ui . error error . message
when LoadError
raise error unless error . message =~ / cannot load such file -- openssl|openssl.so|libcrypto.so /
2020-05-08 01:19:04 -04:00
Bundler . ui . error " \n Could not load OpenSSL. #{ error . class } : #{ error } \n #{ error . backtrace . join ( " \n " ) } "
2018-11-02 19:07:56 -04:00
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 )
2020-10-15 00:20:25 -04:00
Bundler . ui . error <<-EOS.gsub(/^ {8}/, ""), nil, nil
2018-11-02 19:07:56 -04:00
- - - ERROR REPORT TEMPLATE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
` ` `
2022-05-24 09:23:13 -04:00
#{exception_message(e)}
2018-11-02 19:07:56 -04:00
` ` `
#{Bundler::Env.report}
- - - TEMPLATE END - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EOS
Bundler . ui . error " Unfortunately, an unexpected error occurred, and Bundler cannot continue. "
2020-10-15 00:20:25 -04:00
Bundler . ui . error <<-EOS.gsub(/^ {8}/, ""), nil, :yellow
2018-11-02 19:07:56 -04:00
First , try this link to see if there are any existing issue reports for this error :
#{issues_url(e)}
2021-10-11 09:42:39 -04: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-02 19:07:56 -04:00
EOS
end
2022-05-24 09:23:13 -04: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 )
<<-EOS.gsub(/^ {8}/, "")
#{e.class}: #{e.message}
#{e.backtrace && e.backtrace.join("\n ").chomp}
EOS
end
2018-11-02 19:07:56 -04:00
def issues_url ( exception )
message = exception . message . lines . first . tr ( " : " , " " ) . chomp
message = message . split ( " - " ) . first if exception . is_a? ( Errno )
2019-12-14 05:49:16 -05:00
require " cgi "
2020-05-15 08:31:12 -04:00
" https://github.com/rubygems/rubygems/search?q= " \
2018-11-02 19:07:56 -04:00
" #{ CGI . escape ( message ) } &type=Issues "
end
2021-10-11 09:42:39 -04:00
def new_issue_url
" https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
end
2018-11-02 19:07:56 -04:00
end
def self . with_friendly_errors
2020-12-08 02:36:29 -05:00
FriendlyErrors . enable!
2018-11-02 19:07:56 -04:00
yield
rescue SignalException
raise
2019-04-14 02:01:35 -04:00
rescue Exception = > e # rubocop:disable Lint/RescueException
2020-12-08 02:36:29 -05:00
raise if FriendlyErrors . disabled?
2018-11-02 19:07:56 -04:00
FriendlyErrors . log_error ( e )
exit FriendlyErrors . exit_status ( e )
end
end