DEV: Add a plugin incompatibility message (#8151)

* DEV: Add a plugin incompatibility message

* Extract the plugin_initialization_guard
This commit is contained in:
Jarek Radosz 2019-10-06 20:47:33 +02:00 committed by GitHub
parent be85bc9dac
commit 87be6fe98c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 2 deletions

View File

@ -21,6 +21,7 @@ require 'action_mailer/railtie'
require 'sprockets/railtie' require 'sprockets/railtie'
# Plugin related stuff # Plugin related stuff
require_relative '../lib/plugin_initialization_guard'
require_relative '../lib/discourse_event' require_relative '../lib/discourse_event'
require_relative '../lib/discourse_plugin' require_relative '../lib/discourse_plugin'
require_relative '../lib/discourse_plugin_registry' require_relative '../lib/discourse_plugin_registry'
@ -266,8 +267,10 @@ module Discourse
Discourse.activate_plugins! Discourse.activate_plugins!
end end
else else
plugin_initialization_guard do
Discourse.activate_plugins! Discourse.activate_plugins!
end end
end
Discourse.find_plugin_js_assets(include_disabled: true).each do |file| Discourse.find_plugin_js_assets(include_disabled: true).each do |file|
config.assets.precompile << "#{file}.js" config.assets.precompile << "#{file}.js"
@ -301,7 +304,9 @@ module Discourse
OpenID::Util.logger = Rails.logger OpenID::Util.logger = Rails.logger
# Load plugins # Load plugins
plugin_initialization_guard do
Discourse.plugins.each(&:notify_after_initialize) Discourse.plugins.each(&:notify_after_initialize)
end
# we got to clear the pool in case plugins connect # we got to clear the pool in case plugins connect
ActiveRecord::Base.connection_handler.clear_active_connections! ActiveRecord::Base.connection_handler.clear_active_connections!

View File

@ -0,0 +1,38 @@
# frozen_string_literal: true
def plugin_initialization_guard(&block)
begin
block.call
rescue => error
plugins_directory = Rails.root + 'plugins'
plugin_path = error.backtrace_locations.lazy.map do |location|
Pathname.new(location.absolute_path)
.ascend
.lazy
.find { |path| path.parent == plugins_directory }
end.next
raise unless plugin_path
stack_trace = error.backtrace.each_with_index.inject([]) do |messages, (line, index)|
if index == 0
messages << "#{line}: #{error} (#{error.class})"
else
messages << "\t#{index}: from #{line}"
end
end.reverse.join("\n")
STDERR.puts <<~MESSAGE
#{stack_trace}
** INCOMPATIBLE PLUGIN **
You are unable to build Discourse due to errors in the plugin at
#{plugin_path}
Please try removing this plugin and rebuilding again!
MESSAGE
exit 1
end
end