| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2023-01-01 06:19:35 +00:00
										 |  |  | # Copyright (C) 2006-2023  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Redmine | 
					
						
							|  |  |  |   class PluginPath | 
					
						
							|  |  |  |     attr_reader :assets_dir, :initializer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize(dir) | 
					
						
							|  |  |  |       @dir = dir | 
					
						
							|  |  |  |       @assets_dir = File.join dir, 'assets' | 
					
						
							|  |  |  |       @initializer = File.join dir, 'init.rb' | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def run_initializer | 
					
						
							|  |  |  |       load initializer if has_initializer? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def to_s | 
					
						
							|  |  |  |       @dir | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def has_assets_dir? | 
					
						
							|  |  |  |       File.directory?(@assets_dir) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def has_initializer? | 
					
						
							|  |  |  |       File.file?(@initializer) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class PluginLoader | 
					
						
							|  |  |  |     # Absolute path to the directory where plugins are located | 
					
						
							|  |  |  |     cattr_accessor :directory | 
					
						
							| 
									
										
										
										
											2023-12-17 15:05:47 +00:00
										 |  |  |     self.directory = Rails.root.join Rails.application.config.redmine_plugins_directory | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-10 03:24:34 +00:00
										 |  |  |     # Absolute path to the public directory where plugins assets are copied | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  |     cattr_accessor :public_directory | 
					
						
							| 
									
										
										
										
											2022-06-14 13:40:46 +00:00
										 |  |  |     self.public_directory = Rails.public_path.join('plugin_assets') | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def self.load | 
					
						
							|  |  |  |       setup | 
					
						
							|  |  |  |       add_autoload_paths | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Rails.application.config.to_prepare do | 
					
						
							|  |  |  |         PluginLoader.directories.each(&:run_initializer) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Redmine::Hook.call_hook :after_plugins_loaded | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def self.setup | 
					
						
							|  |  |  |       @plugin_directories = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 06:01:10 +00:00
										 |  |  |       Dir.glob(File.join(directory, '*')).each do |directory| | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  |         next unless File.directory?(directory) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @plugin_directories << PluginPath.new(directory) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def self.add_autoload_paths | 
					
						
							|  |  |  |       directories.each do |directory| | 
					
						
							|  |  |  |         # Add the plugin directories to rails autoload paths | 
					
						
							|  |  |  |         engine_cfg = Rails::Engine::Configuration.new(directory.to_s) | 
					
						
							|  |  |  |         engine_cfg.paths.add 'lib', eager_load: true | 
					
						
							| 
									
										
										
										
											2023-12-10 03:10:39 +00:00
										 |  |  |         engine_cfg.all_eager_load_paths.each do |dir| | 
					
						
							| 
									
										
										
										
											2021-11-17 20:55:08 +00:00
										 |  |  |           Rails.autoloaders.main.push_dir dir | 
					
						
							| 
									
										
										
										
											2022-12-21 01:36:45 +00:00
										 |  |  |           Rails.application.config.watchable_dirs[dir] = [:rb] | 
					
						
							| 
									
										
										
										
											2021-11-17 20:55:08 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-11-17 20:36:53 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def self.directories | 
					
						
							|  |  |  |       @plugin_directories | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |