diff options
Diffstat (limited to 'omnibus.to_chunk')
-rwxr-xr-x | omnibus.to_chunk | 152 |
1 files changed, 6 insertions, 146 deletions
diff --git a/omnibus.to_chunk b/omnibus.to_chunk index 1189199..5e527a9 100755 --- a/omnibus.to_chunk +++ b/omnibus.to_chunk @@ -1,6 +1,6 @@ #!/usr/bin/env ruby # -# Create a chunk morphology to integrate Omnibus software in Baserock +# Create a chunk morphology to build Omnibus software in Baserock # # Copyright (C) 2014 Codethink Limited # @@ -17,15 +17,8 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -require 'bundler' -require 'omnibus' - -require 'optparse' -require 'rubygems/commands/build_command' -require 'rubygems/commands/install_command' -require 'shellwords' - require_relative 'importer_base' +require_relative 'importer_omnibus_extensions' BANNER = "Usage: omnibus.to_chunk PROJECT_DIR PROJECT_NAME SOURCE_DIR SOFTWARE_NAME" @@ -33,82 +26,7 @@ DESCRIPTION = <<-END Generate a .morph file for a given Omnibus software component. END -class Omnibus::Builder - # It's possible to use `gem install` in build commands, which is a great - # way of subverting the dependency tracking Omnibus provides. It's done - # in `omnibus-chef/config/software/chefdk.rb`, for example. - # - # To handle this, here we extend the class that executes the build commands - # to detect when `gem install` is run. It uses the Gem library to turn the - # commandline back into a Bundler::Dependency object that we can use. - # - # We also trap `gem build` so we know when a software component is a RubyGem - # that should be handled by 'rubygems.to_chunk'. - - class GemBuildCommandParser < Gem::Commands::BuildCommand - def gemspec_path(args) - handle_options args - if options[:args].length != 1 - raise Exception, "Invalid `gem build` commandline: 1 argument " + - "expected, got #{options[:args]}." - end - options[:args][0] - end - end - - class GemInstallCommandParser < Gem::Commands::InstallCommand - def dependency_list_from_commandline(args) - handle_options args - - # `gem install foo*` is sometimes used when installing a locally built - # Gem, to avoid needing to know the exact version number that was built. - # We only care about remote Gems being installed, so anything with a '*' - # in its name can be ignored. - gem_names = options[:args].delete_if { |name| name.include?('*') } - - gem_names.collect do |gem_name| - Bundler::Dependency.new(gem_name, options[:version]) - end - end - end - - def gem(command, options = {}) - # This function re-implements the 'gem' function in the build-commands DSL. - if command.start_with? 'build' - parser = GemBuildCommandParser.new - args = Shellwords.split(command).drop(1) - if built_gemspec != nil - raise Exception, "More than one `gem build` command was run as part " + - "of the build process. The 'rubygems.to_chunk' " + - "program currently supports only one .gemspec " + - "build per chunk, so this can't be processed " + - "automatically." - end - @built_gemspec = parser.gemspec_path(args) - elsif command.start_with? 'install' - parser = GemInstallCommandParser.new - args = Shellwords.split(command).drop(1) - args_without_build_flags = args.take_while { |item| item != '--' } - gems = parser.dependency_list_from_commandline(args_without_build_flags) - manually_installed_rubygems.concat gems - end - end - - def built_gemspec - @built_gemspec - end - - def manually_installed_rubygems - @manually_installed_rubygems ||= [] - end -end - class OmnibusChunkMorphologyGenerator < Importer::Base - def initialize - local_data = YAML.load_file(local_data_path("omnibus.yaml")) - @dependency_blacklist = local_data['dependency-blacklist'] - end - def parse_options(arguments) opts = create_option_parser(BANNER, DESCRIPTION) @@ -133,6 +51,7 @@ class OmnibusChunkMorphologyGenerator < Importer::Base end def run_tool_capture_output(tool_name, *args) + scripts_dir = local_data_path('.') tool_path = local_data_path(tool_name) # FIXME: something breaks when we try to share this FD, it's not @@ -171,24 +90,6 @@ class OmnibusChunkMorphologyGenerator < Importer::Base exit 1 end - def resolve_rubygems_deps(requirements) - return {} if requirements.empty? - - log.info('Resolving RubyGem requirements with Bundler') - - fake_gemfile = Bundler::Dsl.new - fake_gemfile.source('https://rubygems.org') - - requirements.each do |dep| - fake_gemfile.gem(dep.name, dep.requirement) - end - - definition = fake_gemfile.to_definition('Gemfile.lock', true) - resolved_specs = definition.resolve_remotely! - - Hash[resolved_specs.collect { |spec| [spec.name, spec.version.to_s]}] - end - def generate_chunk_morph_for_software(project, software, source_dir) if software.builder.built_gemspec != nil morphology = generate_chunk_morph_for_rubygems_software(software, @@ -201,49 +102,9 @@ class OmnibusChunkMorphologyGenerator < Importer::Base } end - omnibus_deps = {} - rubygems_deps = {} - - software.dependencies.each do |name| - software = Omnibus::Software.load(project, name) - if @dependency_blacklist.member? name - log.info( - "Not adding #{name} as a dependency as it is marked to be ignored.") - elsif software.fetcher.instance_of?(Omnibus::PathFetcher) - log.info( - "Not adding #{name} as a dependency: it's installed from " + - "a path which probably means that it is package configuration, not " + - "a 3rd-party component to be imported.") - elsif software.fetcher.instance_of?(Omnibus::NullFetcher) - if software.builder.built_gemspec - log.info( - "Adding #{name} as a RubyGem dependency because it builds " + - "#{software.builder.built_gemspec}") - rubygems_deps[name] = software.version - else - log.info( - "Not adding #{name} as a dependency: no sources listed.") - end - else - omnibus_deps[name] = software.version - end - end - - gem_requirements = software.builder.manually_installed_rubygems - rubygems_deps = resolve_rubygems_deps(gem_requirements) - - morphology.update({ - # Possibly this tool should look at software.build and - # generate suitable configure, build and install-commands. - # For now: don't bother! - - # FIXME: are these build or runtime dependencies? We'll assume both. - "x-build-dependencies-omnibus" => omnibus_deps, - "x-runtime-dependencies-omnibus" => omnibus_deps, - - "x-build-dependencies-rubygems" => {}, - "x-runtime-dependencies-rubygems" => rubygems_deps, - }) + # Possibly this tool should look at software.build and + # generate suitable configure, build and install-commands. + # For now: don't bother! if software.description morphology['description'] = software.description + '\n\n' + @@ -266,7 +127,6 @@ class OmnibusChunkMorphologyGenerator < Importer::Base software = Omnibus::Software.load(@project, software_name) morph = generate_chunk_morph_for_software(project, software, source_dir) - write_morph(STDOUT, morph) end end |