From 9bc5897f086fe986aa5db1eca7a3f4af36bf47d1 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Tue, 15 Dec 2015 18:03:50 -0800 Subject: [FriendlyErrors] Split apart logging and exiting --- lib/bundler/friendly_errors.rb | 175 ++++++++++++++++++----------------- spec/bundler/friendly_errors_spec.rb | 4 +- 2 files changed, 92 insertions(+), 87 deletions(-) diff --git a/lib/bundler/friendly_errors.rb b/lib/bundler/friendly_errors.rb index 5721807a90..7f4ac4f085 100644 --- a/lib/bundler/friendly_errors.rb +++ b/lib/bundler/friendly_errors.rb @@ -3,93 +3,98 @@ require "cgi" require "bundler/vendored_thor" module Bundler + module FriendlyErrors + module_function + + def log_error(error) + case error + when YamlSyntaxError + Bundler.ui.error error.message + Bundler.ui.trace error.orig_exception + when Dsl::DSLError + Bundler.ui.error error.message + when GemRequireError + Bundler.ui.error error.message + Bundler.ui.trace error.orig_exception, nil, true + when BundlerError + Bundler.ui.error error.message, :wrap => true + Bundler.ui.trace error + when Thor::Error + Bundler.ui.error error.message + when LoadError + raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/ + Bundler.ui.error "\nCould not load OpenSSL." + Bundler.ui.warn <<-WARN, :wrap => true + You must recompile Ruby with OpenSSL support or change the sources in your \ + Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \ + using RVM are available at http://rvm.io/packages/openssl. + WARN + Bundler.ui.trace error + when Interrupt + Bundler.ui.error "\nQuitting..." + Bundler.ui.trace error + when SystemExit + 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) + Bundler.ui.info <<-EOS.gsub(/^ {8}/, "") + --- ERROR REPORT TEMPLATE ------------------------------------------------------- + - What did you do? + + I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}` + + - What did you expect to happen? + + I expected Bundler to... + + - What happened instead? + + Instead, what actually happened was... + + + Error details + + #{e.class}: #{e.message} + #{e.backtrace.join("\n ")} + + #{Bundler::Env.new.report(:print_gemfile => false, :print_gemspecs => false).gsub(/\n/, "\n ").strip} + --- TEMPLATE END ---------------------------------------------------------------- + + EOS + + Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue." + + Bundler.ui.warn <<-EOS.gsub(/^ {8}/, "") + + First, try this link to see if there are any existing issue reports for this error: + #{issues_url(e)} + + If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at: + https://github.com/bundler/bundler/issues/new + EOS + end + + def issues_url(exception) + "https://github.com/bundler/bundler/search?q=" \ + "#{CGI.escape(exception.message.lines.first.chomp)}&type=Issues" + end + end + def self.with_friendly_errors yield - rescue Bundler::YamlSyntaxError => e - Bundler.ui.error e.message - Bundler.ui.trace e.orig_exception - exit e.status_code - rescue Bundler::Dsl::DSLError => e - Bundler.ui.error e.message - exit e.status_code - rescue Bundler::GemRequireError => e - Bundler.ui.error e.message - Bundler.ui.trace e.orig_exception, nil, true - exit e.status_code - rescue Bundler::BundlerError => e - Bundler.ui.error e.message, :wrap => true - Bundler.ui.trace e - exit e.status_code - rescue Thor::AmbiguousTaskError => e - Bundler.ui.error e.message - exit 15 - rescue Thor::UndefinedTaskError => e - Bundler.ui.error e.message - exit 15 - rescue Thor::Error => e - Bundler.ui.error e.message - exit 1 - rescue LoadError => e - raise e unless e.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/ - Bundler.ui.error "\nCould not load OpenSSL." - Bundler.ui.warn <<-WARN, :wrap => true - You must recompile Ruby with OpenSSL support or change the sources in your \ - Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \ - using RVM are available at http://rvm.io/packages/openssl. - WARN - Bundler.ui.trace e - exit 1 - rescue Interrupt => e - Bundler.ui.error "\nQuitting..." - Bundler.ui.trace e - exit 1 - rescue SystemExit => e - exit e.status rescue Exception => e - request_issue_report_for(e) - exit 1 - end - - def self.request_issue_report_for(e) - Bundler.ui.info <<-EOS.gsub(/^ {6}/, "") - --- ERROR REPORT TEMPLATE ------------------------------------------------------- - - What did you do? - - I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}` - - - What did you expect to happen? - - I expected Bundler to... - - - What happened instead? - - Instead, what actually happened was... - - - Error details - - #{e.class}: #{e.message} - #{e.backtrace.join("\n ")} - - #{Bundler::Env.new.report(:print_gemfile => false, :print_gemspecs => false).gsub(/\n/, "\n ").strip} - --- TEMPLATE END ---------------------------------------------------------------- - - EOS - - Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue." - - Bundler.ui.warn <<-EOS.gsub(/^ {6}/, "") - - First, try this link to see if there are any existing issue reports for this error: - #{issues_url(e)} - - If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at: - https://github.com/bundler/bundler/issues/new - EOS - end - - def self.issues_url(exception) - "https://github.com/bundler/bundler/search?q=" \ - "#{CGI.escape(exception.message.lines.first.chomp)}&type=Issues" + FriendlyErrors.log_error(e) + exit FriendlyErrors.exit_status(e) end end diff --git a/spec/bundler/friendly_errors_spec.rb b/spec/bundler/friendly_errors_spec.rb index 83651dfdf7..e178170967 100644 --- a/spec/bundler/friendly_errors_spec.rb +++ b/spec/bundler/friendly_errors_spec.rb @@ -54,7 +54,7 @@ describe Bundler, "friendly errors" do it "generates a search URL for the exception message" do exception = Exception.new("Exception message") - expect(Bundler.issues_url(exception)).to eq("https://github.com/bundler/bundler/search?q=Exception+message&type=Issues") + expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/bundler/bundler/search?q=Exception+message&type=Issues") end it "generates a search URL for only the first line of a multi-line exception message" do @@ -63,7 +63,7 @@ First line of the exception message Second line of the exception message END - expect(Bundler.issues_url(exception)).to eq("https://github.com/bundler/bundler/search?q=First+line+of+the+exception+message&type=Issues") + expect(Bundler::FriendlyErrors.issues_url(exception)).to eq("https://github.com/bundler/bundler/search?q=First+line+of+the+exception+message&type=Issues") end end end -- cgit v1.2.1