# frozen_string_literal: true module Plugin def self.initialization_guard(&block) begin block.call rescue => error plugins_directory = Rails.root + 'plugins' if error.backtrace && error.backtrace_locations 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 <<~TEXT #{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! TEXT else STDERR.puts <<~TEXT ** PLUGIN FAILURE ** You are unable to build Discourse due to this error during plugin initialization: #{error} #{error.backtrace.join("\n")} TEXT end exit 1 end end end