diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb index 7f058a31d..3f2d0e8f9 100644 --- a/lib/redmine/plugin.rb +++ b/lib/redmine/plugin.rb @@ -19,6 +19,7 @@ module Redmine #:nodoc: class PluginNotFound < StandardError; end class PluginRequirementError < StandardError; end + class PluginIdDuplicated < StandardError; end # Base class for Redmine plugins. # Plugins are registered using the register class method that acts as the public constructor. @@ -72,6 +73,9 @@ module Redmine #:nodoc: # Plugin constructor def self.register(id, &block) p = new(id) + if installed?(p.id) + raise PluginIdDuplicated.new("#{p.id} plugin was already registered.") + end p.instance_eval(&block) # Set a default name if it was not provided during registration @@ -152,7 +156,11 @@ module Redmine #:nodoc: end initializer = File.join(directory, "init.rb") if File.file?(initializer) - require initializer + begin + require initializer + rescue => e + Rails.logger.warn("plugin loading failed. skip loading. message: #{e.message}") + end end end end diff --git a/test/functional/settings_controller_test.rb b/test/functional/settings_controller_test.rb index 4c1019191..6331622bc 100644 --- a/test/functional/settings_controller_test.rb +++ b/test/functional/settings_controller_test.rb @@ -29,6 +29,7 @@ class SettingsControllerTest < Redmine::ControllerTest def teardown Setting.delete_all Setting.clear_cache + Redmine::Plugin.clear end def test_index diff --git a/test/unit/lib/redmine/plugin_test.rb b/test/unit/lib/redmine/plugin_test.rb index 51ae269be..3ccccf2de 100644 --- a/test/unit/lib/redmine/plugin_test.rb +++ b/test/unit/lib/redmine/plugin_test.rb @@ -52,6 +52,40 @@ class Redmine::PluginTest < ActiveSupport::TestCase assert_equal '0.0.1', plugin.version end + def test_register_fail + @klass.register :foo do + name 'Foo plugin' + url 'http://example.net/plugins/foo' + author 'John Smith' + author_url 'http://example.net/jsmith' + version '0.0.1' + end + + assert_equal 1, @klass.all.size + + assert_raise Redmine::PluginIdDuplicated do + @klass.register :foo do + name 'Yet Another Foo plugin' + url 'http://example.net/plugins/ya_foo' + author 'Joe Bloggs' + author_url 'http://example.net/jbloggs' + version '1.0.0' + end + end + assert_equal 1, @klass.all.size + + assert_nothing_raised do + @klass.register :ya_foo do + name 'Yet Another Foo plugin' + url 'http://example.net/plugins/ya_foo' + author 'Joe Bloggs' + author_url 'http://example.net/jbloggs' + version '1.0.0' + end + end + assert_equal 2, @klass.all.size + end + def test_installed @klass.register(:foo) {} assert_equal true, @klass.installed?(:foo)