Accepting request 617126 from home:darix:ruby

- rename the gem_packages template from opensuse.spec.erb to
  gem_packages.spec.erb
- add support for binary_map flag in gem2rpm.yml
  - This can be used to rename the _unversioned_ symlink of the
    binaries in /usr/bin/ to avoid conflicts with other packages
- gem_packages.spec.erb: sync with file in gem2rpm

OBS-URL: https://build.opensuse.org/request/show/617126
OBS-URL: https://build.opensuse.org/package/show/devel:languages:ruby/ruby-common?expand=0&rev=99
This commit is contained in:
Jordi Massaguer 2018-06-15 17:02:44 +00:00 committed by Git OBS Bridge
parent ea19926d07
commit bd28d977e1
4 changed files with 295 additions and 2 deletions

View File

@ -22,6 +22,7 @@ require 'tempfile'
require 'logger'
require 'rubygems'
require 'rubygems/package'
require 'yaml'
begin
require 'rubygems/format'
rescue LoadError => ex
@ -48,6 +49,7 @@ options.symlinkbinaries=false
options.verbose = false
options.rpmsourcedir = ENV['RPM_SOURCE_DIR'] || '/home/abuild/rpmbuild/SOURCES'
options.rpmbuildroot = ENV['RPM_BUILD_ROOT'] || '/home/abuild/rpmbuild/BUILDROOT/just-testing'
options.parsed_config = nil
GILogger = Logger.new(STDERR)
GILogger.level=Logger::DEBUG
@ -75,6 +77,20 @@ def patchfile(fname, needle, replace)
end
end
def map_executable(options, executable)
if not(options.parsed_config.nil? or
options.parsed_config[:binary_map].nil? or
options.parsed_config[:binary_map][executable].nil?)
executable=options.parsed_config[:binary_map][executable]
end
executable
end
def initialized_gem2rpm_config(options, name)
options.config = name
options.parsed_config = YAML.load_file(name)
end
opt_parser = OptionParser.new do |opts|
opts.banner = "Usage: gem_install.rb [options]"
@ -82,7 +98,7 @@ opt_parser = OptionParser.new do |opts|
opts.separator "Specific options:"
opts.on('--config [FILENAME]', 'path to gem2rpm.yml') do |name|
options.config = name
initialized_gem2rpm_config(options, name)
end
opts.on('--default-gem [FILENAME]', 'Which filename to use when we dont find another gem file.') do |fname|
@ -152,6 +168,13 @@ if options.gemfile.nil?
GILogger.info "Found gem #{options.gemfile}"
end
if options.config.nil?
name = File.join(options.rpmsourcedir, 'gem2rpm.yml')
if File.exist?(name)
initialized_gem2rpm_config(options, name)
end
end
package = Gem::Package.new(options.gemfile) rescue Gem::Format.from_file_by_path(options.gemfile)
spec = package.spec
gemdir = File.join(Gem.dir, 'gems', "#{options.gemname}-#{options.gemversion}")
@ -212,6 +235,7 @@ if options.symlinkbinaries && File.exists?(bindir)
full_versioned = "#{unversioned}#{options.rubysuffix}-#{spec.version}"
ruby_versioned = "#{unversioned}#{options.rubysuffix}"
gem_versioned = "#{unversioned}-#{spec.version}"
unversioned = map_executable(options, unversioned)
File.rename(default_path, full_versioned)
patchfile(full_versioned, />= 0(\.a)?/, "= #{options.gemversion}")
# unversioned

258
gem_packages.spec.erb Normal file
View File

@ -0,0 +1,258 @@
<%
begin
require 'rbconfigpackagingsupport'
rescue LoadError => ex
end
def self.patch_mod_full_name(path, mod_full_name)
path.gsub(/\/-/, "/#{mod_full_name}")
end
def self.patch_libdir(path)
# path ? path.gsub(/\/usr\/lib(64)?/, '%{_libdir}') : path
path
end
def self.get_extension_doc_dir(gem_spec)
return nil unless Gem.ruby_engine == 'ruby' && Gem::Requirement.new("~> 2.1.0").satisfied_by?(Gem.ruby_version)
if gem_spec.respond_to?(:extensions_dir)
rp = gem_spec.extensions_dir.rpartition(gem_spec.base_dir)
return File.join(rp[1], 'doc', rp[2])
end
return nil
end
def self.get_mod_weight(spec)
versions=spec.version.to_s.split('.')
begin v1=Integer(versions[0]) rescue v1=1 end
begin v2=Integer(versions[1]) rescue v2=0 end
begin v3=Integer(versions[2]) rescue v3=0 end
weight=v1*10000+v2*100+v3
end
def self.map_executable(config, executable)
if not(config[:binary_map].nil? or
config[:binary_map][executable].nil?)
executable=config[:binary_map][executable]
end
executable
end
def self.filecontent_or_value(path)
(path and File.exists?(path)) ? File.read(path) : path
end
def self.parse_custom_pkgs(env_value)
custom_pkgs = {}
if env_value
list = env_value.split(/\s+/)
list.each do |element|
pkg_name,filelist_path, preamble, description = element.split(/\|/, 4)
filelist = filecontent_or_value(filelist_path)
preamble = filecontent_or_value(preamble)
description = filecontent_or_value(description)
custom_pkgs[pkg_name] = {
"filelist" => filelist,
"preamble" => preamble,
"description" => description,
}
end
end
custom_pkgs
end
rb_suffix = RbConfig::CONFIG['ruby_install_name'].gsub(/^ruby/, '')
rb_pkgname = RbConfig::CONFIG['ruby_install_name'].gsub(/^ruby\./, '')
if rb_suffix =~ /\A\d+\.\d+\z/
rb_suffix = '.ruby' + rb_suffix
end
pkg_basename = rb_pkgname + '-rubygem-' + spec.name
mod_full_name = "#{spec.name}-#{spec.version}"
mod_weight = get_mod_weight(spec)
gem_platform = Gem::Platform.new(RbConfig::CONFIG["arch"]).to_s
rb_bindir = RbConfig::CONFIG['bindir']
rb_sysconfdir = RbConfig::CONFIG['sysconfdir']
docdir = '/usr/share/doc/packages'
gem_spec = Gem::Specification.new
gem_base_dir = patch_libdir(gem_spec.base_dir)
gem_cache_dir = patch_libdir(gem_spec.cache_dir)
gem_gems_dir = patch_libdir(gem_spec.gems_dir)
gem_spec_dir = patch_libdir(gem_spec.spec_dir)
gem_bin_dir = patch_libdir(patch_mod_full_name(gem_spec.bin_dir , mod_full_name ))
gem_doc_dir = patch_libdir(patch_mod_full_name(gem_spec.doc_dir, mod_full_name ))
gem_gem_dir = patch_libdir(patch_mod_full_name(gem_spec.gem_dir, mod_full_name ))
gem_ri_dir = patch_libdir(patch_mod_full_name(gem_spec.ri_dir, mod_full_name ))
#ruby2.1
gem_extensions_dir = gem_spec.respond_to?(:extensions_dir) ? patch_libdir(gem_spec.extensions_dir) : nil
gem_extension_dir = gem_spec.respond_to?(:extension_dir) ? patch_libdir(patch_mod_full_name(gem_spec.extension_dir, mod_full_name)) : nil
gem_extension_doc = patch_libdir(get_extension_doc_dir(gem_spec))
#/ruby2.1
%>
%package -n <%= pkg_basename %><%= config[:version_suffix] %>
# MANUAL
<% if config[:main] && config[:main][:preamble] -%>
<%= config[:main][:preamble] %>
<% end -%>
# /MANUAL
Summary: <%= config[:summary] or spec.summary %>
Group: Development/Languages/Ruby
<% unless spec.executables.empty? -%>
PreReq: update-alternatives
<% end -%>
Enhances: <%= rb_pkgname %>
%description -n <%= pkg_basename %><%= config[:version_suffix] %>
<%= config[:description] or spec.description -%>
<% if spec.has_rdoc && !(config[:disable_docs]) -%>
%package -n <%= pkg_basename %>-doc<%= config[:version_suffix] %>
Summary: RDoc documentation for <%= spec.name %>
Group: Development/Languages/Ruby
Requires: <%= pkg_basename %><%= config[:version_suffix] %> = <%= spec.version %>
%description -n <%= pkg_basename %>-doc<%= config[:version_suffix] %>
Documentation generated at gem installation time.
Usually in RDoc and RI formats.
<% end -%>
<% test_frameworks = Hash.new
docdirfiles = []
format.file_entries.each do |entry|
# new rubygems version has it different
if entry.kind_of?(Array)
path=entry[0]['path']
else
path=entry
end
path.gsub!(%r{^\./}, '')
%w(test spec).each { |framework|
test_frameworks[framework] = 1 if path.index(framework + "/") == 0
}
%w(changes
copying
history
legal
licence
license
license-mit
mit-license
changelog
news
release_notes
readme
).each { |file|
bpath = path.downcase.gsub(%r{\.rdoc$}, '').gsub(%r{\.txt$}, '').gsub(%r{\.md$}, '').gsub(%r{\.markdown$}, '')
#$stderr.puts "PATH #{path} #{bpath} #{file}"
docdirfiles << path if bpath == file
}
end
test_frameworks = test_frameworks.keys.sort
-%>
<% unless test_frameworks.empty? -%>
%package -n <%= pkg_basename %>-testsuite<%= config[:version_suffix] %>
Summary: Test suite for <%= spec.name %>
Group: Development/Languages/Ruby
Requires: <%= pkg_basename %><%= config[:version_suffix] %> = <%= spec.version %>
%description -n <%= pkg_basename %>-testsuite<%= config[:version_suffix] %>
Test::Unit or RSpec files, useful for developers.
<% end -%>
<% unless spec.executables.empty? -%>
%post -n <%= pkg_basename %><%= config[:version_suffix] %>
<% spec.executables.each do |executable| -%>
/usr/sbin/update-alternatives --install \
<%= rb_bindir %>/<%= map_executable(config, executable) %> <%= map_executable(config, executable) %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %> <%= mod_weight %>
/usr/sbin/update-alternatives --install \
<%= rb_bindir %>/<%= "#{executable}-#{spec.version}" %> <%= "#{executable}-#{spec.version}" %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %> <%= mod_weight %>
/usr/sbin/update-alternatives --install \
<%= rb_bindir %>/<%= "#{executable}#{rb_suffix}" %> <%= "#{executable}#{rb_suffix}" %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %> <%= mod_weight %>
<% end -%>
%preun -n <%= pkg_basename %><%= config[:version_suffix] %>
if [ "$1" = 0 ] ; then
<% spec.executables.each do |executable| -%>
/usr/sbin/update-alternatives --remove <%= map_executable(config, executable) %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %>
/usr/sbin/update-alternatives --remove <%= "#{executable}-#{spec.version}" %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %>
/usr/sbin/update-alternatives --remove <%= "#{executable}#{rb_suffix}" %> <%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %>
<% end -%>
fi
<% end -%>
%files -n <%= pkg_basename %><%= config[:version_suffix] %>
%defattr(-,root,root,-)
# MANUAL
<% if config[:main] && config[:main][:filelist] -%>
<%= config[:main][:filelist] -%>
<% end -%>
# /MANUAL
<% unless docdirfiles.empty? -%>
<%= docdir %>/<%= pkg_basename %><%= config[:version_suffix] %>
<% end -%>
<% spec.executables.each do |executable| -%>
<%= rb_bindir %>/<%= "#{executable}#{rb_suffix}-#{spec.version}" %>
<%= rb_bindir %>/<%= "#{executable}#{rb_suffix}" %>
<%= rb_bindir %>/<%= "#{executable}-#{spec.version}" %>
<%= rb_bindir %>/<%= map_executable(config, executable) %>
%ghost <%= rb_sysconfdir %>/alternatives/<%= map_executable(config, executable) %>
%ghost <%= rb_sysconfdir %>/alternatives/<%= "#{executable}#{rb_suffix}" %>
%ghost <%= rb_sysconfdir %>/alternatives/<%= "#{executable}-#{spec.version}" %>
<% end -%>
# cache file
<%= gem_cache_dir %>/<%= mod_full_name %>.gem
<%= gem_gem_dir %>
<% unless spec.extensions.empty? or gem_extension_dir.nil? -%>
<%= gem_extension_dir %>
<% end -%>
<% test_frameworks.each do |framework| -%>
%exclude <%= File.join gem_gem_dir, framework %>
<% end -%>
<%= gem_spec_dir %>/<%= mod_full_name -%>.gemspec
<% if spec.has_rdoc && !(config[:disable_docs]) -%>
%files -n <%= pkg_basename %>-doc<%= config[:version_suffix] %>
%defattr(-,root,root,-)
%doc <%= gem_doc_dir %>
<% unless spec.extensions.empty? or gem_extension_doc.nil? -%>
%doc <%= gem_extension_doc %>
<% end -%>
<% end -%>
<% unless test_frameworks.empty? -%>
%files -n <%= pkg_basename %>-testsuite<%= config[:version_suffix] %>
%defattr(-,root,root,-)
<% test_frameworks.each do |framework| -%>
<%= File.join gem_gem_dir, framework %>
<% end -%>
<% end -%>
<%
if config[:custom_pkgs_ruby_versioned]
config[:custom_pkgs_ruby_versioned].each do |custom_pkg_name, data|
-%>
%package -n <%= pkg_basename %>-<%= custom_pkg_name %><%= config[:version_suffix] %>
<% if data[:preamble] and data[:preamble] != '' -%>
<%= data[:preamble] %>
<% else %>
Summary: <%= custom_pkg_name %> sub package for <%= spec.name %>
Group: Development/Languages/Ruby
<% end %>
Requires: <%= pkg_basename %><%= config[:version_suffix] %> = <%= spec.version %>
%description -n <%= pkg_basename %>-<%= custom_pkg_name %><%= config[:version_suffix] %>
<% if data[:description] and data[:description] != '' -%>
<%= data[:description] %>
<% else %>
<%= spec.description -%>
This package holds the <%= custom_pkg_name %> sub package for <%= spec.name -%>
<% end %>
%files -n <%= pkg_basename %>-<%= custom_pkg_name %><%= config[:version_suffix] %>
%defattr(-,root,root,-)
<%= data['filelist'] -%>
<%
end
end
-%>

View File

@ -1,3 +1,14 @@
-------------------------------------------------------------------
Wed Jun 6 15:11:27 UTC 2018 - mrueckert@suse.de
- rename the gem_packages template from opensuse.spec.erb to
gem_packages.spec.erb
- add support for binary_map flag in gem2rpm.yml
- This can be used to rename the _unversioned_ symlink of the
binaries in /usr/bin/ to avoid conflicts with other packages
- gem_packages.spec.erb: sync with file in gem2rpm
-------------------------------------------------------------------
Wed Jan 24 16:13:42 UTC 2018 - lnussel@suse.de

View File

@ -36,7 +36,7 @@ Source7: generate_buildrequires.sh
Source8: ruby-common.macros
Source9: ruby.rpm-macros
Source10: gem_packages.sh
Source11: opensuse.spec.erb
Source11: gem_packages.spec.erb
Source12: ruby-find-versioned
Source13: gemfile.attr
Source14: gemfile.rb