From bd28d977e1335d693a87c8da809a19b729ff6b8a890b42d6903386fcf71da784 Mon Sep 17 00:00:00 2001 From: Jordi Massaguer Date: Fri, 15 Jun 2018 17:02:44 +0000 Subject: [PATCH] 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 --- gem_install.sh | 26 ++++- gem_packages.spec.erb | 258 ++++++++++++++++++++++++++++++++++++++++++ ruby-common.changes | 11 ++ ruby-common.spec | 2 +- 4 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 gem_packages.spec.erb diff --git a/gem_install.sh b/gem_install.sh index 55765d9..9b5d221 100644 --- a/gem_install.sh +++ b/gem_install.sh @@ -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 diff --git a/gem_packages.spec.erb b/gem_packages.spec.erb new file mode 100644 index 0000000..308d294 --- /dev/null +++ b/gem_packages.spec.erb @@ -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 +-%> diff --git a/ruby-common.changes b/ruby-common.changes index aed6cab..d147ee7 100644 --- a/ruby-common.changes +++ b/ruby-common.changes @@ -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 diff --git a/ruby-common.spec b/ruby-common.spec index ec57d35..00bf8a7 100644 --- a/ruby-common.spec +++ b/ruby-common.spec @@ -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