mirror of
https://github.com/elastic/logstash.git
synced 2025-04-19 04:15:23 -04:00
63 lines
2.4 KiB
Ruby
63 lines
2.4 KiB
Ruby
# encoding: utf-8
|
|
require "pluginmanager/ui"
|
|
require "stud/temporary"
|
|
|
|
module LogStash module PluginManager
|
|
class CustomGemIndexer
|
|
GEMS_DIR = "gems"
|
|
|
|
class << self
|
|
# Copy the file to a specific format that `Gem::Indexer` can understand
|
|
# See `#update_in_memory_index`
|
|
def copy_to_local_source(temporary_directory)
|
|
local_source = Stud::Temporary.pathname
|
|
local_source_gems = ::File.join(local_source, GEMS_DIR)
|
|
|
|
FileUtils.mkdir_p(local_source_gems)
|
|
PluginManager.ui.debug("Creating the index structure format from #{temporary_directory} to #{local_source}")
|
|
|
|
Dir.glob(::File.join(temporary_directory, "**", "*.gem")).each do |file|
|
|
destination = ::File.join(local_source_gems, ::File.basename(file))
|
|
FileUtils.cp(file, destination)
|
|
end
|
|
|
|
local_source
|
|
end
|
|
|
|
# *WARNING*: Bundler need to not be activated at this point because it won't find anything that
|
|
# is not defined in the gemfile/lock combo
|
|
#
|
|
# This takes a folder with a special structure, will generate an index
|
|
# similar to what rubygems do and make them available in the local program,
|
|
# we use this **side effect** to validate theses gems with the current gemfile/lock.
|
|
# Bundler will assume they are system gems and will use them when doing resolution checks.
|
|
#
|
|
#.
|
|
# ├── gems
|
|
# │ ├── addressable-2.4.0.gem
|
|
# │ ├── cabin-0.9.0.gem
|
|
# │ ├── ffi-1.9.14-java.gem
|
|
# │ ├── gemoji-1.5.0.gem
|
|
# │ ├── launchy-2.4.3-java.gem
|
|
# │ ├── logstash-output-elasticsearch-5.2.0-java.gem
|
|
# │ ├── logstash-output-secret-0.1.0.gem
|
|
# │ ├── manticore-0.6.0-java.gem
|
|
# │ ├── spoon-0.0.6.gem
|
|
# │ └── stud-0.0.22.gem
|
|
#
|
|
# Right now this work fine, but I think we could also use Bundler's SourceList classes to handle the same thing
|
|
def update_in_memory_index!(local_source)
|
|
PluginManager.ui.debug("Generating indexes in #{local_source}")
|
|
indexer = ::Gem::Indexer.new(local_source, { :build_modern => true})
|
|
indexer.ui = ::Gem::SilentUI.new unless ENV["DEBUG"]
|
|
indexer.generate_index
|
|
end
|
|
|
|
def index(path)
|
|
local_source = copy_to_local_source(path)
|
|
update_in_memory_index!(local_source)
|
|
local_source
|
|
end
|
|
end
|
|
end
|
|
end end
|