class RGem2Rpm::Rpm

Attributes

description[RW]
group[RW]
installdir[RW]
license[RW]
name[RW]
packager[RW]
release[RW]
summary[RW]
version[RW]

Public Class Methods

new(args) click to toggle source
# File lib/rgem2rpm/rpm.rb, line 6
def initialize(args)
  @template = args[:template] || File.dirname(__FILE__) + '/../../conf/template.spec'
  @name = args[:installname]
  @rpmname = args[:rpmname] || args[:installname]
  @gemname = args[:name]
  @version = args[:version]
  @release = args[:release] || '1'
  @license = "See #{args[:homepage]}"
  @summary = args[:summary]
  @packager = args[:packager] || 'rgem2rpm'
  @group = args[:group] || 'System Environment/Libraries'
  @osuser = args[:osuser] || 'root'
  @osgroup = args[:osgroup] || 'root'
  @description = process_description(args[:description])
  @installdir = args[:installdir] || '/usr/share/gems'
  @arch = args[:architecture]
  @files = args[:files]
  @rubygem = args[:rubygem]
  @dependencies = args[:dependencies]
end

Public Instance Methods

buildarch() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 101
def buildarch
  @arch == 'all' ? 'noarch' : nil
end
changelog() click to toggle source

return changelog information

# File lib/rgem2rpm/rpm.rb, line 151
def changelog
  change_str = StringIO.new
  change_str << "* #{Time.now.strftime('%a %b %d %Y')} rgem2rpm <https://github.com/ptinovacao/rgem2rpm> #{@version}-#{@release}\n"
  change_str << "- Create rpm package\n"
  change_str.string
end
clean() click to toggle source

clean temporary files

# File lib/rgem2rpm/rpm.rb, line 159
def clean
  FileUtils.rm_rf "#{@name}-#{@version}.spec"
  FileUtils.rm_rf "./rpmtemp"
end
conflicts() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 130
def conflicts
  conflict_str = StringIO.new
  # set conflicts
  @dependencies.each {|d|
    d.requirement.requirements.each {|v|
      conflict_str << ', ' unless conflict_str.size == 0
      conflict_str << "rubygem(#{d.name}) #{v[0].gsub('!=', '=')} #{v[1].to_s}" if v[0] =~ /!=/
    }
  }
  # returns string with conflicts
  conflict_str.string
end
create() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 27
def create
  # create spec
  spec
  # build rpm
  build
end
filelist() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 70
def filelist
  files_str = StringIO.new
  files_str << "%defattr(0644,#{@osuser},#{@osgroup},0755)\n"

  files_str << "%dir %{prefix}\n"
  @files[:directories].each {|file|
    escaped_str = file.gsub(/%/, '?')
    files_str << "%dir \"%{prefix}/#{escaped_str}\"\n"
  }

  files_str << "%{prefix}/#{@files[:specification]}\n"
  @files[:files].each {|file|
    escaped_str = file.gsub(/%/, '?')
    files_str << "\"%{prefix}/#{escaped_str}\"\n"
  }

  # get executables
  @files[:executables].each {|executable|
    files_str << "%attr(0755,#{@osuser},#{@osgroup}) %{prefix}/#{executable}\n"
  }

  @files[:extensions].each {|file|
    suffix = file.sub(/.*?(?=#{@gemname}-#{@version})/, "")
    escaped_str = suffix.gsub(/%/, '?')
    files_str << "\"%{_libdir}/gems/ruby/#{escaped_str}\"\n"
  }

  # return file string
  files_str.string
end
installlist() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 34
def installlist
  install_str = StringIO.new
  install_str << "rm -rf %{buildroot}\n"
  # get directories
  @files[:directories].each {|directory|
    escaped_str = directory.gsub(/%/, '%%')
    install_str << "install -d \"#{escaped_str}\" %{buildroot}%{prefix}/\"#{escaped_str}\"\n"
  }
  # get files
  @files[:files].each {|file|
    escaped_str = file.gsub(/%/, '%%')
    install_str << "install -m 644 \"#{escaped_str}\" %{buildroot}%{prefix}/\"#{escaped_str}\"\n"
  }
  # get specification
  escaped_str = @files[:specification].gsub(/%/, '%%')
  install_str << "install -m 644 \"#{escaped_str}\" %{buildroot}%{prefix}/\"#{escaped_str}\"\n"
  # get executables
  @files[:executables].each {|executable|
    escaped_str = executable.gsub(/%/, '%%')
    install_str << "install -m 0755 \"#{escaped_str}\" %{buildroot}%{prefix}/\"#{escaped_str}\"\n"
  }

  #Extensions file get build into extensions/<ARCH>-linux/<Ruby Version>/GEM-VERSION/
  # We need to install this into /usr/lib64/gems/ruby/GEM-VERSION/
  # Ex. extensions/x86_64-linux/2.5.0/ffi-1.10.0/gem.build_complete => /usr/lib64/gems/ruby/ffi-1.10.0/gem.build_complete
  @files[:extensions].each {|extensions|
    #remove preceding chars until gem name-version is found (non greedy way)
    # ex. "extensions/x86_64-linux/2.5.0/ffi-1.10.0/gem.build_complete".sub(/.*?(?=ffi-1.10.0)/,"")
    suffix = extensions.sub(/.*?(?=#{@gemname}-#{@version})/, "")
    install_str << "install -D \"#{extensions}\" %{buildroot}%{_libdir}/gems/ruby/\"#{suffix}\"\n"
  }

  # return install string
  install_str.string
end
provides() click to toggle source

return gem provides clause

# File lib/rgem2rpm/rpm.rb, line 144
def provides
  prv_str = StringIO.new
  prv_str << "rubygem(#{@gemname}) = #{@version}"
  prv_str.string
end
requires() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 105
def requires
  req_str = StringIO.new
  # set rubygems dependency
  unless @rubygem.nil?
    req_str << "rubygems"
    req_str << " #{@rubygem}" unless @rubygem == '>= 0'
  end
  # set runtime dependencies
  @dependencies.each {|d|
    d.requirement.requirements.each {|v|
      req_str << ', ' unless req_str.size == 0
      req_str << "rubygem(#{d.name})"
      req_str << " #{v[0].gsub('~>', '>=')} #{v[1].to_s}" unless v[0] =~ /!=/
      if v[0] =~ /~>/
        version = v[1].to_s.strip.split('.')
        version[version.size - 1] = "0"
        version[version.size - 2] = (version[version.size - 2].to_i + 1).to_s
        req_str << ", rubygem(#{d.name}) < #{version.join('.')}"
      end
    }
  }
  # return string with dependencies
  req_str.string
end

Private Instance Methods

build() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 184
def build
  create_rpm_env
  # move to rpmbuild path
  FileUtils.mv "#{@name}-#{@version}.spec", "rpmtemp/rpmbuild/SPECS"
  # move sources to rpmbuild
  FileUtils.mv "#{@name}-#{@version}.tar.gz", "rpmtemp/rpmbuild/SOURCES"
  # define rpm build args
  options = "-bb --rmspec --rmsource"
  define = "--define \"_topdir #{Dir.pwd}/rpmtemp/rpmbuild\" --define \"_tmppath #{Dir.pwd}/rpmtemp/rpmbuild/tmp\""
  specfile = "#{Dir.pwd}/rpmtemp/rpmbuild/SPECS/#{@name}-#{@version}.spec"
  # create rpm
  res = system "rpmbuild #{options} #{define} #{specfile}"
  # check errors
  raise "Error creating rpm" unless res
  # clean temporary files
  Dir.glob("rpmtemp/rpmbuild/RPMS/**/*.rpm") do |file|
    FileUtils.mv file, "./"
  end
  clean
end
create_rpm_env() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 205
def create_rpm_env
  FileUtils.mkdir_p "rpmtemp/rpmbuild/SPECS"
  FileUtils.mkdir_p "rpmtemp/rpmbuild/BUILD"
  FileUtils.mkdir_p "rpmtemp/rpmbuild/RPMS"
  FileUtils.mkdir_p "rpmtemp/rpmbuild/SRPMS"
  FileUtils.mkdir_p "rpmtemp/rpmbuild/SOURCES"
  FileUtils.mkdir_p "rpmtemp/rpmbuild/tmp"
end
process_description(description) click to toggle source
# File lib/rgem2rpm/rpm.rb, line 174
def process_description(description)
  res = []
  str = description
  while str != nil
    res << "#{str[0, 80]}"
    str = str[80, str.size]
  end
  res.join "\n"
end
spec() click to toggle source
# File lib/rgem2rpm/rpm.rb, line 166
def spec
  template = ERB.new(File.read(@template))
  # write rpm spec file file
  File.open("#{@name}-#{@version}.spec", 'w') {|f|
    f.write(template.result(binding))
  }
end