forked from discourse/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplugin.rb
67 lines (56 loc) · 1.62 KB
/
plugin.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 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|
resolved_path = location.absolute_path || location.path
next if resolved_path.nil?
Pathname
.new(resolved_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 start 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 start Discourse due to this error during plugin
initialization:
#{error}
#{error.backtrace.join("\n")}
TEXT
end
exit 1
end
end
end