diff options
Diffstat (limited to 'exts/omnibus.to_chunk')
-rwxr-xr-x | exts/omnibus.to_chunk | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/exts/omnibus.to_chunk b/exts/omnibus.to_chunk new file mode 100755 index 0000000..5e527a9 --- /dev/null +++ b/exts/omnibus.to_chunk @@ -0,0 +1,134 @@ +#!/usr/bin/env ruby +# +# Create a chunk morphology to build Omnibus software in Baserock +# +# Copyright (C) 2014 Codethink Limited +# +# 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; version 2 of the License. +# +# 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. + +require_relative 'importer_base' +require_relative 'importer_omnibus_extensions' + +BANNER = "Usage: omnibus.to_chunk PROJECT_DIR PROJECT_NAME SOURCE_DIR SOFTWARE_NAME" + +DESCRIPTION = <<-END +Generate a .morph file for a given Omnibus software component. +END + +class OmnibusChunkMorphologyGenerator < Importer::Base + def parse_options(arguments) + opts = create_option_parser(BANNER, DESCRIPTION) + + parsed_arguments = opts.parse!(arguments) + + if parsed_arguments.length != 4 and parsed_arguments.length != 5 + STDERR.puts "Expected 4 or 5 arguments, got #{parsed_arguments}." + opts.parse(['-?']) + exit 255 + end + + project_dir, project_name, source_dir, software_name, expected_version = \ + parsed_arguments + # Not yet implemented + #if expected_version != nil + # expected_version = Gem::Version.new(expected_version) + #end + [project_dir, project_name, source_dir, software_name, expected_version] + end + + class SubprocessError < RuntimeError + 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 + # ideal that the subprocess doesn't log anything, though. + env_changes = {'MORPH_LOG_FD' => nil} + + command = [[tool_path, tool_name], *args] + log.info("Running #{command.join(' ')} in #{scripts_dir}") + + text = IO.popen( + env_changes, command, :chdir => scripts_dir, :err => [:child, :out] + ) do |io| + io.read + end + + if $? == 0 + text + else + raise SubprocessError, text + end + end + + def generate_chunk_morph_for_rubygems_software(software, source_dir) + # This is a better heuristic for getting the name of the Gem + # than the software name, it seems ... + gem_name = software.relative_path + + text = run_tool_capture_output('rubygems.to_chunk', source_dir, gem_name) + log.debug("Text from output: #{text}, result #{$?}") + + morphology = YAML::load(text) + return morphology + rescue SubprocessError => e + error "Tried to import #{software.name} as a RubyGem, got the " \ + "following error from rubygems.to_chunk: #{e.message}" + exit 1 + 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, + source_dir) + else + morphology = { + "name" => software.name, + "kind" => "chunk", + "description" => "Automatically generated by omnibus.to_chunk" + } + end + + # 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' + + morphology['description'] + end + + morphology + end + + def run + project_dir, project_name, source_dir, software_name = parse_options(ARGV) + + log.info("Creating chunk morph for #{software_name} from project " + + "#{project_name}, defined in #{project_dir}") + + Dir.chdir(project_dir) + + project = Omnibus::Project.load(project_name) + + software = Omnibus::Software.load(@project, software_name) + + morph = generate_chunk_morph_for_software(project, software, source_dir) + write_morph(STDOUT, morph) + end +end + +OmnibusChunkMorphologyGenerator.new.run |