# File lib/bundler/plugin/index.rb, line 23 def initialize @plugin_paths = {} @commands = {} @sources = {} @hooks = {} @load_paths = {} load_index(global_index_file, true) load_index(local_index_file) if SharedHelpers.in_bundle? end
Fetch the name of plugin handling the command
# File lib/bundler/plugin/index.rb, line 88 def command_plugin(command) @commands[command] end
Path where the global index file is stored
# File lib/bundler/plugin/index.rb, line 70 def global_index_file Plugin.global_root.join("index") end
Returns the list of plugin names handling the passed event
# File lib/bundler/plugin/index.rb, line 105 def hook_plugins(event) @hooks[event] || [] end
Path of default index file
# File lib/bundler/plugin/index.rb, line 65 def index_file Plugin.root.join("index") end
# File lib/bundler/plugin/index.rb, line 92 def installed?(name) @plugin_paths[name] end
# File lib/bundler/plugin/index.rb, line 83 def load_paths(name) @load_paths[name] end
Path where the local index file is stored
# File lib/bundler/plugin/index.rb, line 75 def local_index_file Plugin.local_root.join("index") end
# File lib/bundler/plugin/index.rb, line 79 def plugin_path(name) Pathname.new @plugin_paths[name] end
This function is to be called when a new plugin is installed. This function shall add the functions of the plugin to existing maps and also the name to source location.
@param [String] name of the plugin to be registered @param [String] path where the plugin is installed @param [Array<String>] #load_paths for the plugin @param [Array<String>] commands that are handled by the plugin @param [Array<String>] sources that are handled by the plugin
# File lib/bundler/plugin/index.rb, line 43 def register_plugin(name, path, load_paths, commands, sources, hooks) old_commands = @commands.dup common = commands & @commands.keys raise CommandConflict.new(name, common) unless common.empty? commands.each {|c| @commands[c] = name } common = sources & @sources.keys raise SourceConflict.new(name, common) unless common.empty? sources.each {|k| @sources[k] = name } hooks.each {|e| (@hooks[e] ||= []) << name } @plugin_paths[name] = path @load_paths[name] = load_paths save_index rescue @commands = old_commands raise end
# File lib/bundler/plugin/index.rb, line 96 def source?(source) @sources.key? source end
# File lib/bundler/plugin/index.rb, line 100 def source_plugin(name) @sources[name] end
Reads the index file from the directory and initializes the instance variables.
It skips the sources if the second param is true @param [Pathname] index file path @param [Boolean] is the index file global index
# File lib/bundler/plugin/index.rb, line 117 def load_index(index_file, global = false) SharedHelpers.filesystem_access(index_file, :read) do |index_f| valid_file = index_f && index_f.exist? && !index_f.size.zero? break unless valid_file data = index_f.read require "bundler/yaml_serializer" index = YAMLSerializer.load(data) @commands.merge!(index["commands"]) @hooks.merge!(index["hooks"]) @load_paths.merge!(index["load_paths"]) @plugin_paths.merge!(index["plugin_paths"]) @sources.merge!(index["sources"]) unless global end end
Should be called when any of the instance variables change. Stores the instance variables in YAML format. (The instance variables are supposed to be only String key value pairs)
# File lib/bundler/plugin/index.rb, line 138 def save_index index = { "commands" => @commands, "hooks" => @hooks, "load_paths" => @load_paths, "plugin_paths" => @plugin_paths, "sources" => @sources, } require "bundler/yaml_serializer" SharedHelpers.filesystem_access(index_file) do |index_f| FileUtils.mkdir_p(index_f.dirname) File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) } end end