class Revamp::Persister::Rpm::Builder

A builder for RPM's packages

Constants

ATTRS
RPMS
SELFDIR
SOURCES
SPECS

Attributes

produced[R]
produced?[R]

Public Class Methods

new(model, dir, options) click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 40
def initialize(model, dir, options)
  @options  = options
  @name     = "puppetmodule_#{model.slugname}"
  @release  = options[:release]
  assign_model(model)
  @filename = "#{name}-#{version}-#{release}.noarch.rpm"
  @rpm      = "#{name}-#{version}"
  @specfile = rpm + '.spec'
  @tmpdir   = dir
  @produced = false
  @log      = Revamp.logger
  @requirements = configure_rpm_requirements_line
  @log.debug("Target file: #{target}")
end

Public Instance Methods

cleanup() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 91
def cleanup
  arch = RbConfig::CONFIG['arch'].gsub('-linux', '')
  cleanup_files [
    sources_tgz_path, specfile_path, tmpdir.join('BUILD').join(rpm),
    tmpdir.join('BUILDROOT').join("#{rpm}-#{release}.#{arch}")
  ]
end
make_structure() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 66
def make_structure
  return unless needs_to_write?
  FileUtils.mkdir_p(tmpdir.join(SOURCES))
  FileUtils.mkdir_p(tmpdir.join(SPECS))
end
produce() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 55
def produce
  if needs_to_write?
    @log.info("Converting to RPM package #{target}...")
    cmd = "rpmbuild -ba #{SPECS}/#{specfile}"
    verbose = options[:verbose]
    ret = Revamp::Persister::Rpm::CommandLine.execute(cmd, tmpdir, verbose)
    fail "RPM Build failed with retcode = #{ret.exitstatus}" unless ret.success?
  end
  move_produced
end
write_sources() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 76
def write_sources
  return unless needs_to_write?
  pathsufix = Pathname.new(rpm)
  File.open(sources_tgz_path, 'wb') do |tgz|
    Zlib::GzipWriter.wrap(tgz) do |gz|
      Gem::Package::TarWriter.new(gz) do |tar|
        model.files.each do |file, content|
          full = pathsufix.join(file).to_s
          tar.add_file_simple(full, 0644, content.length) { |io| io.write(content) }
        end
      end
    end
  end
end
write_spec() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 72
def write_spec
  File.open(specfile_path, 'w') { |file| file.write(generate_spec) } if needs_to_write?
end

Protected Instance Methods

generate_spec() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 101
def generate_spec
  tpl = SELFDIR.join('rpm-spec.erb')
  values = Hash[ATTRS.map { |key| [key, send(key)] }]
  erbize(tpl.read, values)
end

Private Instance Methods

assign_model(model) click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 109
def assign_model(model)
  @model            = model
  @filenames        = model.files.keys
  @version          = model.version
  @has_requirements = model.dependencies.any?
end
move_produced() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 128
def move_produced
  produced = tmpdir.join(RPMS).join('noarch').join(filename)
  @log.debug("Produced RPM in build dir: #{produced}")
  if needs_to_write?
    FileUtils.mv(produced, target)
    @produced = true
  end
  target
end
needs_to_write?() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 138
def needs_to_write?
  !File.exist?(target) || options[:clobber]
end
sources_tgz_path() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 116
def sources_tgz_path
  tmpdir.join(SOURCES).join("#{rpm}.tar.gz")
end
specfile_path() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 120
def specfile_path
  tmpdir.join(SPECS).join(specfile)
end
target() click to toggle source
# File lib/revamp/persister/rpm/builder.rb, line 124
def target
  Pathname.new(options[:outdir]).join(filename)
end