From 7f057e886e993f76c71a04bd77fc15086d82a324 Mon Sep 17 00:00:00 2001 From: Lucas Arnaud Date: Fri, 27 Jan 2017 16:16:23 -0200 Subject: [PATCH] Making possible to change plugins loading order --- config/additional_environment.rb.example | 11 +++++++++++ lib/redmine/plugin.rb | 20 ++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/config/additional_environment.rb.example b/config/additional_environment.rb.example index 2a317a3..9ec618e 100644 --- a/config/additional_environment.rb.example +++ b/config/additional_environment.rb.example @@ -7,4 +7,15 @@ # config.log_level = :debug # ... # +# Determine plugins loading priorities, least priorities will be loaded sooner +# , undefined priorities will default to 0 +# Loading priority relies that plugin directory name is equals to its id +# +# Ex: +# +# config.plugins_load_order = { +# plugin_1: -2, +# plugin_2: -1, +# plugin_3: 1 +# } diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb index 503c3db..4efee5e 100644 --- a/lib/redmine/plugin.rb +++ b/lib/redmine/plugin.rb @@ -143,6 +143,7 @@ module Redmine #:nodoc: end def self.load + plugins_initializers = [] Dir.glob(File.join(self.directory, '*')).sort.each do |directory| if File.directory?(directory) lib = File.join(directory, "lib") @@ -152,10 +153,14 @@ module Redmine #:nodoc: end initializer = File.join(directory, "init.rb") if File.file?(initializer) - require initializer + plugins_initializers << { id: File.basename(directory), initializer: initializer } end end end + + plugins_initializers.sort { |p1, p2| compare_with_load_order(p1[:id], p2[:id]) }.each do |plugin| + require plugin[:initializer] + end end def initialize(id) @@ -175,7 +180,18 @@ module Redmine #:nodoc: end def <=>(plugin) - self.id.to_s <=> plugin.id.to_s + self.class.compare_with_load_order(id, plugin.id) + end + + def self.compare_with_load_order(plugin1_id, plugin2_id) + p1 = Rails.application.config.plugins_load_order[plugin1_id.to_sym] || 0 + p2 = Rails.application.config.plugins_load_order[plugin2_id.to_sym] || 0 + + if p1 == p2 + return plugin1_id <=> plugin2_id + end + + p1 <=> p2 end # Sets a requirement on Redmine version -- 1.8.3.1