gem2rpm 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +13 -2
- data/bin/gem2rpm +32 -4
- data/lib/gem2rpm/distro.rb +37 -1
- data/lib/gem2rpm.rb +8 -2
- data/templates/fedora-17-rawhide.spec.erb +130 -0
- data/templates/fedora.spec.erb +1 -1
- metadata +8 -7
data/README
CHANGED
@@ -17,14 +17,25 @@ Usage
|
|
17
17
|
|
18
18
|
Run 'gem2rpm --help' for options
|
19
19
|
|
20
|
-
At its simplest, download a gem (let's call
|
21
|
-
|
20
|
+
At its simplest, download a gem (let's call it GEM) in its latest
|
21
|
+
version (e.g. 1.2.3):
|
22
|
+
|
23
|
+
$ gem fetch GEM
|
24
|
+
|
25
|
+
and run gem2rpm above the downloaded file:
|
26
|
+
|
27
|
+
$ gem2rpm GEM-1.2.3.gem
|
28
|
+
|
29
|
+
You can also use the --fetch flag to fetch the (latest) gem before generating the spec file, achieving the same effect as running 'gem fetch GEM' plus 'gem2rpm GEM-1.2.3.gem':
|
30
|
+
|
31
|
+
$ gem2rpm --fetch GEM
|
22
32
|
|
23
33
|
This will print an rpm spec file based on the information contained in the
|
24
34
|
gem's spec file. In general, it is necessary to edit the generated spec
|
25
35
|
file because the gem is missing some important information that is
|
26
36
|
customarily provided in rpm's, most notably the license and the changelog.
|
27
37
|
|
38
|
+
|
28
39
|
Rather than editing the generated specfile, edit the template from which
|
29
40
|
the specfile is generated. This will make it easier to update the RPM when
|
30
41
|
a new version of the Gem becomes available.
|
data/bin/gem2rpm
CHANGED
@@ -7,8 +7,10 @@ require 'gem2rpm'
|
|
7
7
|
require 'optparse'
|
8
8
|
require 'rubygems/format'
|
9
9
|
require 'fileutils'
|
10
|
+
require 'open-uri'
|
11
|
+
require 'uri'
|
10
12
|
|
11
|
-
opts = OptionParser.new("#{$0} [OPTIONS]
|
13
|
+
opts = OptionParser.new("Usage: #{$0} [OPTIONS] GEM")
|
12
14
|
opts.separator(" Convert ruby Gems to source RPMs and specfiles")
|
13
15
|
opts.separator(" Uses a template to generate the RPM specfile")
|
14
16
|
opts.separator(" from the Gem spec")
|
@@ -21,7 +23,10 @@ srpm = false
|
|
21
23
|
deps = false
|
22
24
|
nongem = false
|
23
25
|
doc_subpackage = true
|
26
|
+
fetch = false
|
24
27
|
|
28
|
+
opts.separator("")
|
29
|
+
opts.separator(" Options:")
|
25
30
|
opts.on("-T", "--current-template", "Print the current template") do |val|
|
26
31
|
print_template_file = true
|
27
32
|
end
|
@@ -51,6 +56,15 @@ end
|
|
51
56
|
opts.on("--no-doc", "Disable document subpackage") do |val|
|
52
57
|
doc_subpackage = false
|
53
58
|
end
|
59
|
+
opts.on("--fetch", "Fetch the gem from rubygems.org") do |val|
|
60
|
+
fetch = true
|
61
|
+
end
|
62
|
+
opts.separator("")
|
63
|
+
opts.separator(" Arguments:")
|
64
|
+
opts.separator(" GEM the path to locally stored gem package file or the name")
|
65
|
+
opts.separator(" of the gem when using --fetch.")
|
66
|
+
opts.separator("")
|
67
|
+
|
54
68
|
rest = opts.permute(ARGV)
|
55
69
|
|
56
70
|
template = nil
|
@@ -58,7 +72,8 @@ if template_file.nil?
|
|
58
72
|
template = Gem2Rpm::TEMPLATE
|
59
73
|
else
|
60
74
|
begin
|
61
|
-
f = open(template_file, "r")
|
75
|
+
f = open(template_file, "r") if File.exists?(template_file)
|
76
|
+
f = open(File.join(Gem2Rpm.template_dir, template_file + '.spec.erb'), "r") unless f
|
62
77
|
rescue Errno::ENOENT
|
63
78
|
$stderr.puts "Could not open template #{template_file}. Aborting"
|
64
79
|
exit(1)
|
@@ -79,6 +94,17 @@ if rest.size != 1
|
|
79
94
|
end
|
80
95
|
gemfile = rest[0]
|
81
96
|
|
97
|
+
if fetch
|
98
|
+
gem_uri = ''
|
99
|
+
open("http://rubygems.org/api/v1/gems/#{gemfile}.json") do |f|
|
100
|
+
gem_uri = f.read.match(/"gem_uri":\s*"(.*?)",/m)[1]
|
101
|
+
gemfile = URI.parse(gem_uri).path.split('/').last
|
102
|
+
open(gemfile, 'w') do |gf|
|
103
|
+
gf.write(open(gem_uri).read)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
82
108
|
srpmdir = nil
|
83
109
|
gemname = nil
|
84
110
|
srpmdir = nil
|
@@ -115,7 +141,9 @@ if srpm
|
|
115
141
|
end
|
116
142
|
|
117
143
|
if deps
|
118
|
-
|
119
|
-
|
144
|
+
Gem::Format.from_file_by_path(gemfile).spec.dependencies.each do |dep|
|
145
|
+
Gem2Rpm::Dependency.new(dep).requirement.each do |r|
|
146
|
+
puts "rubygem(#{dep.name}) #{r}"
|
120
147
|
end
|
148
|
+
end
|
121
149
|
end
|
data/lib/gem2rpm/distro.rb
CHANGED
@@ -6,7 +6,20 @@ module Gem2Rpm
|
|
6
6
|
|
7
7
|
def self.nature
|
8
8
|
if !release_files.grep(/fedora/).empty?
|
9
|
-
|
9
|
+
versions = []
|
10
|
+
|
11
|
+
release_files.each do |file|
|
12
|
+
/\d+/ =~ File.open(file).readline
|
13
|
+
versions << Regexp.last_match.to_s.to_i if Regexp.last_match
|
14
|
+
end
|
15
|
+
|
16
|
+
versions.uniq!
|
17
|
+
|
18
|
+
if versions.length == 1
|
19
|
+
template_by_os_version(FEDORA, versions.first) || FEDORA
|
20
|
+
else # no version or more versions (=> don't know what to do)
|
21
|
+
FEDORA
|
22
|
+
end
|
10
23
|
elsif !release_files.grep(/SuSe/).empty?
|
11
24
|
OPENSUSE
|
12
25
|
else
|
@@ -17,6 +30,29 @@ module Gem2Rpm
|
|
17
30
|
def self.release_files
|
18
31
|
@@release_files ||= Dir.glob '/etc/*{_version,-release}*'
|
19
32
|
end
|
33
|
+
|
34
|
+
def self.template_by_os_version(os, version)
|
35
|
+
Dir.new(Gem2Rpm::template_dir).each do |file|
|
36
|
+
/#{os}-([\w-]+).spec.erb/ =~ file
|
37
|
+
return file.gsub('.spec.erb', '') if Regexp.last_match and in_range?(version, Regexp.last_match[1].to_s.split('-'))
|
38
|
+
end
|
39
|
+
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.in_range?(version, range)
|
44
|
+
return nil unless range
|
45
|
+
|
46
|
+
if range.length == 1
|
47
|
+
return true if range.first.to_i == version
|
48
|
+
else # range: [xx, yy]
|
49
|
+
if range[0].to_i <= version
|
50
|
+
return true if range[1] == 'rawhide' or version <= range[1].to_i
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
false
|
55
|
+
end
|
20
56
|
end
|
21
57
|
end
|
22
58
|
|
data/lib/gem2rpm.rb
CHANGED
@@ -15,7 +15,7 @@ if HAS_REMOTE_INSTALLER
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module Gem2Rpm
|
18
|
-
Gem2Rpm::VERSION = "0.
|
18
|
+
Gem2Rpm::VERSION = "0.8.0"
|
19
19
|
|
20
20
|
if HAS_REMOTE_INSTALLER
|
21
21
|
def self.find_download_url(name, version)
|
@@ -50,6 +50,8 @@ module Gem2Rpm
|
|
50
50
|
end
|
51
51
|
template = ERB.new(template, 0, '-')
|
52
52
|
out.puts template.result(binding)
|
53
|
+
rescue Gem::Exception => e
|
54
|
+
puts e
|
53
55
|
end
|
54
56
|
|
55
57
|
# Returns the email address of the packager (i.e., the person running
|
@@ -69,7 +71,11 @@ module Gem2Rpm
|
|
69
71
|
packager
|
70
72
|
end
|
71
73
|
|
72
|
-
|
74
|
+
def Gem2Rpm.template_dir
|
75
|
+
File.join(File.dirname(__FILE__), '..', 'templates')
|
76
|
+
end
|
77
|
+
|
78
|
+
TEMPLATE = File.read File.join(template_dir, "#{Distro.nature.to_s}.spec.erb")
|
73
79
|
end
|
74
80
|
|
75
81
|
# Local Variables:
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# Generated from <%= File::basename(format.gem_path) %> by gem2rpm -*- rpm-spec -*-
|
2
|
+
%global gem_name <%= spec.name %>
|
3
|
+
%global rubyabi 1.9.1
|
4
|
+
|
5
|
+
Summary: <%= spec.summary.gsub(/\.$/, "") %>
|
6
|
+
Name: rubygem-%{gem_name}
|
7
|
+
Version: <%= spec.version %>
|
8
|
+
Release: 1%{?dist}
|
9
|
+
Group: Development/Languages
|
10
|
+
License: <%= spec.licenses.empty? ? "GPLv2+ or Ruby" : spec.licenses.join(" and ") %>
|
11
|
+
<% if spec.homepage -%>
|
12
|
+
URL: <%= spec.homepage %>
|
13
|
+
<% end -%>
|
14
|
+
Source0: <%= download_path %>%{gem_name}-%{version}.gem
|
15
|
+
Requires: ruby(abi) = %{rubyabi}
|
16
|
+
<% for req in spec.required_rubygems_version -%>
|
17
|
+
Requires: ruby(rubygems) <%= req %>
|
18
|
+
<% end -%>
|
19
|
+
<%# TODO: Unfortunatelly this do not match with ruby(abi) yet -%>
|
20
|
+
<% for req in spec.required_ruby_version -%>
|
21
|
+
Requires: ruby <%= req %>
|
22
|
+
<% end -%>
|
23
|
+
<% for d in spec.runtime_dependencies -%>
|
24
|
+
<% for req in d.requirement -%>
|
25
|
+
Requires: rubygem(<%= d.name %>) <%= req %>
|
26
|
+
<% end -%>
|
27
|
+
<% end -%>
|
28
|
+
BuildRequires: ruby(abi) = %{rubyabi}
|
29
|
+
<% for req in spec.required_rubygems_version -%>
|
30
|
+
BuildRequires: ruby(rubygems) <%= req %>
|
31
|
+
<% end -%>
|
32
|
+
<%# TODO: Unfortunatelly this do not match with ruby(abi) yet -%>
|
33
|
+
<% for req in spec.required_ruby_version -%>
|
34
|
+
BuildRequires: ruby <%= req %>
|
35
|
+
<% end -%>
|
36
|
+
<% if spec.extensions.empty? -%>
|
37
|
+
BuildArch: noarch
|
38
|
+
<% end -%>
|
39
|
+
Provides: rubygem(%{gem_name}) = %{version}
|
40
|
+
|
41
|
+
%description
|
42
|
+
<%= spec.description %>
|
43
|
+
|
44
|
+
<% if doc_subpackage -%>
|
45
|
+
%package doc
|
46
|
+
Summary: Documentation for %{name}
|
47
|
+
Group: Documentation
|
48
|
+
Requires: %{name} = %{version}-%{release}
|
49
|
+
BuildArch: noarch
|
50
|
+
|
51
|
+
%description doc
|
52
|
+
Documentation for %{name}
|
53
|
+
<% end # if doc_subpackage -%>
|
54
|
+
|
55
|
+
%prep
|
56
|
+
%setup -q -c -T
|
57
|
+
mkdir -p .%{gem_dir}
|
58
|
+
<% unless spec.extensions.empty? -%>
|
59
|
+
export CONFIGURE_ARGS="--with-cflags='%{optflags}'"
|
60
|
+
<% end -%>
|
61
|
+
gem install --local --install-dir .%{gem_dir} \
|
62
|
+
<% unless spec.executables.nil? or spec.executables.empty? -%>
|
63
|
+
--bindir .%{_bindir} \
|
64
|
+
<% end -%>
|
65
|
+
<% unless spec.extensions.empty? -%>
|
66
|
+
-V \
|
67
|
+
<% end -%>
|
68
|
+
--force %{SOURCE0}
|
69
|
+
|
70
|
+
%build
|
71
|
+
|
72
|
+
%install
|
73
|
+
mkdir -p %{buildroot}%{gem_dir}
|
74
|
+
cp -a .%{gem_dir}/* \
|
75
|
+
%{buildroot}%{gem_dir}/
|
76
|
+
|
77
|
+
<% unless spec.extensions.empty? -%>
|
78
|
+
mkdir -p %{buildroot}%{gem_extdir}/<%= spec.require_paths.first %>
|
79
|
+
# TODO: move the extensions
|
80
|
+
##mv %{buildroot}%{gem_instdir}/<%= spec.require_paths.first %>/shared_object.so %{buildroot}%{gem_extdir}/<%= spec.require_paths.first %>/
|
81
|
+
<% end -%>
|
82
|
+
|
83
|
+
<% unless spec.executables.nil? or spec.executables.empty? -%>
|
84
|
+
mkdir -p %{buildroot}%{_bindir}
|
85
|
+
cp -a .%{_bindir}/* \
|
86
|
+
%{buildroot}%{_bindir}/
|
87
|
+
<% end -%>
|
88
|
+
|
89
|
+
<% unless spec.executables.empty? -%>
|
90
|
+
find %{buildroot}%{gem_instdir}/bin -type f | xargs chmod a+x
|
91
|
+
<% end -%>
|
92
|
+
|
93
|
+
<% unless spec.extensions.empty? -%>
|
94
|
+
<%# TODO: Is it possible to delete the folder specified by the spec.extensions? -%>
|
95
|
+
# Remove the binary extension sources and build leftovers.
|
96
|
+
rm -rf %{buildroot}%{geminstdir}/ext
|
97
|
+
<% end -%>
|
98
|
+
|
99
|
+
%files
|
100
|
+
%dir %{gem_instdir}
|
101
|
+
<% unless spec.executables.nil? or spec.executables.empty? -%>
|
102
|
+
<% for f in spec.executables -%>
|
103
|
+
%{_bindir}/<%= f %>
|
104
|
+
<% end -%>
|
105
|
+
%{gem_instdir}/bin
|
106
|
+
<% end -%>
|
107
|
+
%{gem_libdir}
|
108
|
+
<% unless spec.extensions.empty? -%>
|
109
|
+
%{gem_extdir}
|
110
|
+
<% end -%>
|
111
|
+
<% unless doc_subpackage -%>
|
112
|
+
%doc %{gem_docdir}
|
113
|
+
<% for f in spec.extra_rdoc_files -%>
|
114
|
+
%doc %{gem_instdir}/<%= f %>
|
115
|
+
<% end -%>
|
116
|
+
<% end -%>
|
117
|
+
%exclude %{gem_cache}
|
118
|
+
%{gem_spec}
|
119
|
+
|
120
|
+
<% if doc_subpackage -%>
|
121
|
+
%files doc
|
122
|
+
%doc %{gem_docdir}
|
123
|
+
<% for f in spec.extra_rdoc_files -%>
|
124
|
+
%doc %{gem_instdir}/<%= f %>
|
125
|
+
<% end -%>
|
126
|
+
<% end # if doc_subpackage -%>
|
127
|
+
|
128
|
+
%changelog
|
129
|
+
* <%= Time.now.strftime("%a %b %d %Y") %> <%= packager %> - <%= spec.version %>-1
|
130
|
+
- Initial package
|
data/templates/fedora.spec.erb
CHANGED
@@ -128,7 +128,7 @@ rm -rf %{buildroot}%{geminstdir}/ext
|
|
128
128
|
%doc %{geminstdir}/<%= f %>
|
129
129
|
<% end -%>
|
130
130
|
<% end -%>
|
131
|
-
%{gemdir}/cache/%{gemname}-%{version}.gem
|
131
|
+
%exclude %{gemdir}/cache/%{gemname}-%{version}.gem
|
132
132
|
%{gemdir}/specifications/%{gemname}-%{version}.gemspec
|
133
133
|
|
134
134
|
<% if doc_subpackage -%>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem2rpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Lutterkort
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2012-01-23 00:00:00 Z
|
20
20
|
dependencies: []
|
21
21
|
|
22
22
|
description: " Generate source rpms and rpm spec files from a Ruby Gem. \n The spec file tries to follow the gem as closely as possible\n"
|
@@ -31,14 +31,15 @@ extra_rdoc_files:
|
|
31
31
|
- LICENSE
|
32
32
|
files:
|
33
33
|
- bin/gem2rpm
|
34
|
-
- lib/gem2rpm/distro.rb
|
35
34
|
- lib/gem2rpm/specification.rb
|
36
35
|
- lib/gem2rpm/helpers.rb
|
37
36
|
- lib/gem2rpm/dependency.rb
|
37
|
+
- lib/gem2rpm/distro.rb
|
38
38
|
- lib/gem2rpm.rb
|
39
39
|
- templates/fedora.spec.erb
|
40
40
|
- templates/opensuse.spec.erb
|
41
41
|
- templates/default.spec.erb
|
42
|
+
- templates/fedora-17-rawhide.spec.erb
|
42
43
|
- LICENSE
|
43
44
|
- README
|
44
45
|
- AUTHORS
|
@@ -71,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
72
|
requirements: []
|
72
73
|
|
73
74
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.
|
75
|
+
rubygems_version: 1.8.11
|
75
76
|
signing_key:
|
76
77
|
specification_version: 3
|
77
78
|
summary: Generate rpm specfiles from gems
|