summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2015-12-15 18:03:50 -0800
committerSamuel Giddins <segiddins@segiddins.me>2015-12-19 12:28:55 -0800
commit9bc5897f086fe986aa5db1eca7a3f4af36bf47d1 (patch)
tree732f5e04b4c790921fa0d7d286bc91047a6ab4de
parent56f5876c54356069a540f0fece33362b14ce1979 (diff)
downloadbundler-9bc5897f086fe986aa5db1eca7a3f4af36bf47d1.tar.gz
[FriendlyErrors] Split apart logging and exitingseg-refactor-friendly-errors
-rw-r--r--lib/bundler/friendly_errors.rb175
-rw-r--r--spec/bundler/friendly_errors_spec.rb4
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