rgem2rpm 1.3.3 → 1.4.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/bin/rgem2rpm +5 -5
- data/conf/template.spec +14 -16
- data/lib/rgem2rpm/argumentparse.rb +19 -21
- data/lib/rgem2rpm/converter.rb +23 -355
- data/lib/rgem2rpm/gem.rb +140 -0
- data/lib/rgem2rpm/rpm.rb +152 -0
- data/lib/rgem2rpm/version.rb +1 -1
- data/lib/rgem2rpm.rb +3 -3
- data/rgem2rpm.gemspec +6 -4
- metadata +6 -14
data/bin/rgem2rpm
CHANGED
@@ -8,13 +8,13 @@ require 'rgem2rpm'
|
|
8
8
|
|
9
9
|
begin
|
10
10
|
# parse arguments
|
11
|
-
|
11
|
+
options = RGem2Rpm::ArgumentParse.parse(ARGV)
|
12
12
|
# check arguments
|
13
13
|
raise "Missing argument: gemfilename" unless ARGV.size == 1
|
14
|
-
#
|
15
|
-
|
16
|
-
#
|
17
|
-
|
14
|
+
# get filename
|
15
|
+
filename = ARGV[0]
|
16
|
+
# convert gem to rpm
|
17
|
+
RGem2Rpm::Converter.process(options, filename)
|
18
18
|
rescue => e
|
19
19
|
puts e.message
|
20
20
|
exit
|
data/conf/template.spec
CHANGED
@@ -7,22 +7,23 @@
|
|
7
7
|
|
8
8
|
%define distnum %{expand:%%(/usr/lib/rpm/redhat/dist.sh --distnum)}
|
9
9
|
%define disttype %{expand:%%(/usr/lib/rpm/redhat/dist.sh --disttype)}
|
10
|
-
%define name <%=
|
10
|
+
%define name <%=name%>
|
11
11
|
%define version <%=version%>
|
12
|
-
%define release <%=
|
12
|
+
%define release <%=release%>.%{disttype}%{distnum}
|
13
13
|
|
14
14
|
Name: %{name}
|
15
15
|
Version: %{version}
|
16
16
|
Release: %{release}
|
17
|
-
License:
|
17
|
+
License: <%=license%>
|
18
18
|
Summary: <%=summary%>
|
19
|
-
Group: <%=
|
19
|
+
Group: <%=group%>
|
20
20
|
Source: %{name}-%{version}.tar.gz
|
21
|
-
Prefix: <%=
|
21
|
+
Prefix: <%=installdir%>
|
22
22
|
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
23
|
-
<%="BuildArch: noarch"
|
24
|
-
<%="Requires: #{requires}" unless requires
|
25
|
-
<%="Provides: #{provides}" unless provides
|
23
|
+
<%="BuildArch: noarch" unless buildarch.nil?%>
|
24
|
+
<%="Requires: #{requires}" unless requires == ""%>
|
25
|
+
<%="Provides: #{provides}" unless provides == ""%>
|
26
|
+
|
26
27
|
%description
|
27
28
|
<%=description%>
|
28
29
|
|
@@ -30,13 +31,10 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
|
30
31
|
%setup -q
|
31
32
|
|
32
33
|
%install
|
33
|
-
<%=
|
34
|
-
|
35
|
-
<%="%post\n#{rpm_post}" unless rpm_post.nil?%>
|
36
|
-
|
37
|
-
%postun
|
38
|
-
rm -rf %{prefix}/gems/%{name}-%{version}
|
34
|
+
<%=installlist%>
|
39
35
|
|
40
36
|
%files
|
41
|
-
|
42
|
-
|
37
|
+
<%=filelist%>
|
38
|
+
|
39
|
+
%changelog
|
40
|
+
<%=changelog%>
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'optparse'
|
2
|
-
require 'ostruct'
|
3
2
|
|
4
3
|
class RGem2Rpm::ArgumentParse
|
5
4
|
#
|
@@ -8,46 +7,45 @@ class RGem2Rpm::ArgumentParse
|
|
8
7
|
def self.parse(args)
|
9
8
|
# The options specified on the command line will be collected in *options*.
|
10
9
|
# We set default values here.
|
11
|
-
options =
|
12
|
-
options.spec_template = File.expand_path('../../../conf/template.spec', __FILE__)
|
13
|
-
options.rpm_release = '1'
|
14
|
-
options.rpm_group = 'Ruby/Gems'
|
15
|
-
options.os_user = 'root'
|
16
|
-
options.os_group = 'root'
|
17
|
-
options.os_install_dir = '/opt/ruby'
|
10
|
+
options = {}
|
18
11
|
|
19
12
|
opts = OptionParser.new do |opt|
|
20
13
|
opt.banner = "Usage: rgem2rpm [options] [gemfilename]"
|
21
14
|
opt.separator "options:"
|
22
15
|
|
23
16
|
# Template argument
|
24
|
-
opt.on("--template
|
25
|
-
options
|
17
|
+
opt.on("--template TEMPLATE", "RPM spec template.") do |template|
|
18
|
+
options[:template] = template
|
26
19
|
end
|
27
20
|
|
28
21
|
# Release name
|
29
|
-
opt.on("--release
|
30
|
-
options
|
22
|
+
opt.on("--release RELEASE", "RPM spec release.") do |release|
|
23
|
+
options[:release] = release
|
31
24
|
end
|
32
25
|
|
33
26
|
# rpm group
|
34
|
-
opt.on("--
|
35
|
-
options
|
27
|
+
opt.on("--group GROUP", "RPM spec group.") do |group|
|
28
|
+
options[:group] = group
|
36
29
|
end
|
37
30
|
|
38
31
|
# operating system install user
|
39
|
-
opt.on("--osuser
|
40
|
-
options
|
32
|
+
opt.on("--osuser OSUSER", "OS install user.") do |osuser|
|
33
|
+
options[:osuser] = osuser
|
41
34
|
end
|
42
35
|
|
43
36
|
# operating system install group
|
44
|
-
opt.on("--osgroup
|
45
|
-
options
|
37
|
+
opt.on("--osgroup OSGROUP", "OS install group.") do |osgroup|
|
38
|
+
options[:osgroup] = osgroup
|
46
39
|
end
|
47
40
|
|
48
41
|
# operating system install dir
|
49
|
-
opt.on("--
|
50
|
-
options
|
42
|
+
opt.on("--installdir INSTALLDIR", "OS install directory.") do |installdir|
|
43
|
+
options[:installdir] = installdir
|
44
|
+
end
|
45
|
+
|
46
|
+
# jruby gem
|
47
|
+
opt.on("--jruby", "Build RPM to jruby platform (only when gem has executables).") do
|
48
|
+
options[:platform] = 'jruby'
|
51
49
|
end
|
52
50
|
|
53
51
|
# No argument, shows at tail. This will print an options summary.
|
@@ -59,7 +57,7 @@ class RGem2Rpm::ArgumentParse
|
|
59
57
|
|
60
58
|
# Another typical switch to print the version.
|
61
59
|
opt.on_tail("--version", "Show version.") do
|
62
|
-
puts RGem2Rpm::VERSION
|
60
|
+
puts RGem2Rpm::VERSION
|
63
61
|
exit
|
64
62
|
end
|
65
63
|
end
|
data/lib/rgem2rpm/converter.rb
CHANGED
@@ -1,358 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
# :rpm_top_dir:: path used by rpmbuild to generate rpms
|
14
|
-
def initialize(options_parse, gem)
|
15
|
-
# set spectemplate
|
16
|
-
@spec_template = options_parse.spec_template
|
17
|
-
# set rpm release
|
18
|
-
@rpm_release = options_parse.rpm_release
|
19
|
-
# set rpm group
|
20
|
-
@rpm_group = options_parse.rpm_group
|
21
|
-
# set rpm no arch
|
22
|
-
@rpm_no_arch = true
|
23
|
-
# set os user
|
24
|
-
@os_user = options_parse.os_user
|
25
|
-
# set os group
|
26
|
-
@os_group = options_parse.os_group
|
27
|
-
# set os installation dir
|
28
|
-
@os_install_dir = options_parse.os_install_dir
|
29
|
-
# initialize rpm_top_dir
|
30
|
-
@rpm_top_dir = "#{Dir.pwd}/rpmbuild"
|
31
|
-
# set defaul options
|
32
|
-
super(gem)
|
33
|
-
# load spec
|
34
|
-
self.spec
|
35
|
-
# initialize temp dir
|
36
|
-
@rpm_tmp_dir = "#{@rpm_top_dir}/tmp/#{full_name}"
|
37
|
-
# initialize unpack dir
|
38
|
-
@rpm_unpack_dir = "#{@rpm_tmp_dir}/#{full_name}"
|
39
|
-
# initialize gemspec filename
|
40
|
-
@gemspec_filename = "#{@rpm_tmp_dir}/#{full_name}.gemspec"
|
41
|
-
# initialize bin dir
|
42
|
-
@bin_dir = "#{@rpm_tmp_dir}/bin"
|
43
|
-
# create rpm build environment
|
44
|
-
create_rpm_env
|
45
|
-
end
|
46
|
-
|
47
|
-
def prefix
|
48
|
-
"rubygem"
|
49
|
-
end
|
50
|
-
|
51
|
-
def prefix_name
|
52
|
-
"#{prefix}-#{name}"
|
53
|
-
end
|
54
|
-
|
55
|
-
# return gem name
|
56
|
-
def name
|
57
|
-
name = @spec.name
|
58
|
-
name = "#{name}_#{@spec.platform}" if @spec.platform.to_s == 'java'
|
59
|
-
name
|
60
|
-
end
|
61
|
-
|
62
|
-
# return gem version
|
63
|
-
def version
|
64
|
-
@spec.version
|
65
|
-
end
|
66
|
-
|
67
|
-
def full_name
|
68
|
-
"#{prefix_name}-#{version}"
|
69
|
-
end
|
70
|
-
|
71
|
-
# return rpm release
|
72
|
-
def rpm_release
|
73
|
-
@rpm_release
|
74
|
-
end
|
75
|
-
|
76
|
-
# return rpm group
|
77
|
-
def rpm_group
|
78
|
-
@rpm_group
|
79
|
-
end
|
80
|
-
|
81
|
-
# return rpm no arch value
|
82
|
-
def rpm_no_arch
|
83
|
-
@rpm_no_arch
|
84
|
-
end
|
85
|
-
|
86
|
-
# return os installation user
|
87
|
-
def os_user
|
88
|
-
@os_user
|
89
|
-
end
|
90
|
-
|
91
|
-
# return os installation group
|
92
|
-
def os_group
|
93
|
-
@os_group
|
94
|
-
end
|
95
|
-
|
96
|
-
# return os installation group
|
97
|
-
def os_install_dir
|
98
|
-
@os_install_dir
|
99
|
-
end
|
100
|
-
|
101
|
-
# return gem homepage
|
102
|
-
def homepage
|
103
|
-
@spec.homepage
|
104
|
-
end
|
105
|
-
|
106
|
-
# return summary
|
107
|
-
def summary
|
108
|
-
@spec.summary
|
109
|
-
end
|
110
|
-
|
111
|
-
# return rpm install bin
|
112
|
-
def rpm_install
|
113
|
-
@rpm_install
|
114
|
-
end
|
115
|
-
|
116
|
-
# return rpm post
|
117
|
-
def rpm_post
|
118
|
-
@rpm_post
|
119
|
-
end
|
120
|
-
|
121
|
-
##
|
122
|
-
# Converts gem into rpm using rpmbuild command
|
123
|
-
def create_rpm
|
124
|
-
# unpack gem software
|
125
|
-
unpack @rpm_unpack_dir
|
126
|
-
# check if gem has extensions
|
127
|
-
unless @spec.extensions.empty?
|
128
|
-
# set rpm arch
|
129
|
-
@rpm_no_arch = false
|
130
|
-
# build extensions
|
131
|
-
build_extensions
|
132
|
-
# clean build
|
133
|
-
build_clean
|
134
|
-
end
|
135
|
-
# create file list with build files
|
136
|
-
generate_file_list
|
137
|
-
# generate install
|
138
|
-
generate_install
|
139
|
-
# generate executable files
|
140
|
-
generate_bin
|
141
|
-
# create gemspec file
|
142
|
-
File.open(@gemspec_filename, 'w') { |f|
|
143
|
-
f.write(@spec.to_ruby)
|
144
|
-
}
|
145
|
-
# create rpm spec file
|
146
|
-
write_rpm_spec_from_template
|
147
|
-
# create rpm source file
|
148
|
-
create_rpm_source("#{@rpm_top_dir}/tmp")
|
149
|
-
# create rpm
|
150
|
-
rpmbuild
|
151
|
-
# clean temp directory
|
152
|
-
FileUtils.rm_rf "#{@rpm_tmp_dir}"
|
153
|
-
end
|
154
|
-
|
155
|
-
# return gem runtime dependencies
|
156
|
-
def requires
|
157
|
-
req_str = StringIO.new
|
158
|
-
# set ruby dependency for native gems
|
159
|
-
unless @spec.extensions.empty?
|
160
|
-
req_str << "ruby(abi)"
|
161
|
-
req_str << " #{@spec.required_ruby_version}" unless @spec.required_ruby_version.nil?
|
162
|
-
end
|
163
|
-
# set rubygems dependency
|
164
|
-
req_str << ", " unless req_str.size == 0
|
165
|
-
req_str << "rubygems #{@spec.required_rubygems_version}" unless @spec.required_rubygems_version.nil?
|
166
|
-
# set runtime dependencies
|
167
|
-
@spec.runtime_dependencies.each { |d|
|
168
|
-
req_str << ', ' unless req_str.size == 0
|
169
|
-
req_str << "#{prefix}-#{d.name} #{d.requirement.to_s.gsub('~>', '>=')}"
|
170
|
-
if d.requirement.to_s =~ /~>/
|
171
|
-
version = d.requirement.to_s.delete('~>').strip.split('.')
|
172
|
-
version[version.size - 1] = "0"
|
173
|
-
version[version.size - 2] = (version[version.size - 2].to_i + 1).to_s
|
174
|
-
req_str << ", #{prefix}-#{d.name} < #{version.join('.')}"
|
175
|
-
end
|
176
|
-
}
|
177
|
-
# return string with dependencies
|
178
|
-
req_str.string
|
179
|
-
end
|
180
|
-
|
181
|
-
# return gem provides clause
|
182
|
-
def provides
|
183
|
-
str = StringIO.new
|
184
|
-
str << "#{prefix}(#{name}) = #{version}"
|
185
|
-
str << ", #{prefix}(#{@spec.name}) = #{version}" if @spec.platform.to_s == 'java'
|
186
|
-
str.string
|
187
|
-
end
|
188
|
-
|
189
|
-
# return gem description
|
190
|
-
def description
|
191
|
-
@spec.description
|
192
|
-
end
|
193
|
-
|
194
|
-
# return gem files
|
195
|
-
def files
|
196
|
-
@files
|
197
|
-
end
|
198
|
-
|
199
|
-
private
|
200
|
-
##
|
201
|
-
# Get list of files generated during build operation
|
202
|
-
def generate_file_list
|
203
|
-
# check if gem has native extensions
|
204
|
-
if @spec.extensions.empty?
|
205
|
-
# use gemspec file list
|
206
|
-
@file_list = @spec.files
|
207
|
-
else
|
208
|
-
# initialize build files array
|
209
|
-
build_files = Array.new
|
210
|
-
# get required path
|
211
|
-
first_element = @spec.require_paths.first
|
212
|
-
require_path = if first_element.kind_of? Array then first_element.join("/") else first_element end
|
213
|
-
# start building make command
|
214
|
-
Dir.chdir("#{@rpm_tmp_dir}/#{full_name}/#{require_path}") do |path|
|
215
|
-
Dir.glob("**/*") do |file|
|
216
|
-
build_files << "#{require_path}/#{file}" unless File.directory?("#{path}/#{file}")
|
217
|
-
end
|
218
|
-
end
|
219
|
-
# include build files in the list of files
|
220
|
-
@file_list = @spec.files + build_files
|
221
|
-
# delete duplicate values
|
222
|
-
@file_list.uniq!
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
##
|
227
|
-
# Create install string.
|
228
|
-
def generate_install
|
229
|
-
files_str = StringIO.new
|
230
|
-
install_str = StringIO.new
|
231
|
-
install_str << "rm -rf %{buildroot}\n"
|
232
|
-
install_str << "mkdir -p %{buildroot}%{prefix}/bin\n"
|
233
|
-
install_str << "mkdir -p %{buildroot}%{prefix}/specifications\n"
|
234
|
-
install_str << "mkdir -p %{buildroot}%{prefix}/gems/%{name}-%{version}\n"
|
235
|
-
install_str << "install -p -m 644 %{name}-%{version}.gemspec %{buildroot}%{prefix}/specifications"
|
236
|
-
files_str << "%{prefix}/specifications/%{name}-%{version}.gemspec"
|
237
|
-
# get files list
|
238
|
-
@file_list.each { |file|
|
239
|
-
if File.file? "#{@rpm_unpack_dir}/#{file}"
|
240
|
-
install_str << "\ninstall -p -D -m 644 %{name}-%{version}/\"#{file}\" %{buildroot}%{prefix}/gems/%{name}-%{version}/\"#{file}\""
|
241
|
-
files_str << "\n\"%{prefix}/gems/%{name}-%{version}/#{file}\""
|
242
|
-
elsif File.directory? "#{@rpm_unpack_dir}/#{file}"
|
243
|
-
install_str << "\nmkdir -p %{buildroot}%{prefix}/gems/%{name}-%{version}/\"#{file}\""
|
244
|
-
end
|
245
|
-
}
|
246
|
-
# get executable file list
|
247
|
-
@spec.executables.each { |file|
|
248
|
-
install_str << "\ninstall -p -m 0755 bin/#{file} %{buildroot}%{prefix}/bin"
|
249
|
-
files_str << "\n%{prefix}/bin/#{file}"
|
250
|
-
}
|
251
|
-
@rpm_install = install_str.string
|
252
|
-
@files = files_str.string
|
253
|
-
end
|
254
|
-
|
255
|
-
def generate_bin
|
256
|
-
return if @spec.executables.nil? or @spec.executables.empty?
|
257
|
-
|
258
|
-
# If the user has asked for the gem to be installed in a directory that is
|
259
|
-
# the system gem directory, then use the system bin directory, else create
|
260
|
-
# (or use) a new bin dir under the gem_home.
|
261
|
-
bindir = @bin_dir ? @bin_dir : Gem.bindir(@gem_home)
|
262
|
-
|
263
|
-
Dir.mkdir bindir unless File.exist? bindir
|
264
|
-
raise Gem::FilePermissionError.new(bindir) unless File.writable? bindir
|
265
|
-
|
266
|
-
@spec.executables.each do |filename|
|
267
|
-
filename.untaint
|
268
|
-
bin_path = File.expand_path "#{@spec.bindir}/#{filename}", @gem_dir
|
269
|
-
if File.exist?(bin_path)
|
270
|
-
mode = File.stat(bin_path).mode | 0111
|
271
|
-
File.chmod mode, bin_path
|
272
|
-
end
|
273
|
-
generate_bin_script filename, bindir
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def generate_bin_script(filename, bindir)
|
278
|
-
@rpm_install = "#{@rpm_install}\nsed -i \"1i $(if (ruby -v 1>/dev/null 2>&1); then echo '\#\!/usr/bin/env ruby'; else echo '\#\!/usr/bin/env jruby'; fi;)\" %{buildroot}%{prefix}/bin/#{filename}"
|
279
|
-
bin_script_path = File.join bindir, formatted_program_filename(filename)
|
280
|
-
|
281
|
-
File.open bin_script_path, 'wb', 0755 do |file|
|
282
|
-
file.print app_script_text(filename)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
##
|
287
|
-
# Return the text for an application file.
|
288
|
-
|
289
|
-
def app_script_text(bin_file_name)
|
290
|
-
<<-TEXT
|
291
|
-
#
|
292
|
-
# This file was generated by RubyGems.
|
293
|
-
#
|
294
|
-
# The application '#{@spec.name}' is installed as part of a gem, and
|
295
|
-
# this file is here to facilitate running it.
|
296
|
-
#
|
297
|
-
|
298
|
-
require 'rubygems'
|
299
|
-
|
300
|
-
version = "#{Gem::Requirement.default}"
|
301
|
-
|
302
|
-
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
|
303
|
-
version = $1
|
304
|
-
ARGV.shift
|
305
|
-
end
|
306
|
-
|
307
|
-
gem '#{@spec.name}', version
|
308
|
-
load Gem.bin_path('#{@spec.name}', '#{bin_file_name}', version)
|
309
|
-
TEXT
|
310
|
-
end
|
311
|
-
|
312
|
-
def build_clean
|
313
|
-
# clean each build
|
314
|
-
@spec.extensions.each do |extension|
|
315
|
-
Dir.chdir(File.dirname("#{@rpm_tmp_dir}/#{full_name}/#{extension}")) do |path|
|
316
|
-
# delete intermediate build files
|
317
|
-
system "make clean"
|
318
|
-
# delete makefile
|
319
|
-
FileUtils.rm_rf("#{path}/Makefile")
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
def create_rpm_env
|
325
|
-
FileUtils.mkdir_p "#{@rpm_top_dir}/SPECS" unless File.exists?("#{@rpm_top_dir}/SPECS")
|
326
|
-
FileUtils.mkdir_p "#{@rpm_top_dir}/BUILD" unless File.exists?("#{@rpm_top_dir}/BUILD")
|
327
|
-
FileUtils.mkdir_p "#{@rpm_top_dir}/RPMS" unless File.exists?("#{@rpm_top_dir}/RPMS")
|
328
|
-
FileUtils.mkdir_p "#{@rpm_top_dir}/SRPMS" unless File.exists?("#{@rpm_top_dir}/SRPMS")
|
329
|
-
FileUtils.mkdir_p "#{@rpm_top_dir}/SOURCES" unless File.exists?("#{@rpm_top_dir}/SOURCES")
|
330
|
-
end
|
331
|
-
|
332
|
-
def write_rpm_spec_from_template
|
333
|
-
template = ERB.new(File.read(@spec_template))
|
334
|
-
# write rpm spec file file
|
335
|
-
rpmspec_filename = "#{@rpm_top_dir}/SPECS/#{full_name}.spec"
|
336
|
-
File.open(rpmspec_filename, 'w') {|f|
|
337
|
-
f.write(template.result(binding))
|
1
|
+
class RGem2Rpm::Converter
|
2
|
+
class << self
|
3
|
+
def process(options, filename)
|
4
|
+
objects = []
|
5
|
+
# execute gemfile installation
|
6
|
+
gem = RGem2Rpm::Gem.new :filename => filename, :platform => options[:platform]
|
7
|
+
objects << gem
|
8
|
+
gem.install
|
9
|
+
# build args to rpm
|
10
|
+
args = gem.spec
|
11
|
+
[:template, :release, :group, :osuser, :osgroup, :installdir].each {|key|
|
12
|
+
args[key] = options[key] unless options[key].nil?
|
338
13
|
}
|
14
|
+
# build rpm
|
15
|
+
rpm = RGem2Rpm::Rpm.new args
|
16
|
+
objects << rpm
|
17
|
+
rpm.create
|
18
|
+
rescue => e
|
19
|
+
# clean temporary files
|
20
|
+
objects.each { |obj| obj.clean }
|
21
|
+
# write error message
|
22
|
+
puts e.message
|
23
|
+
exit
|
339
24
|
end
|
340
|
-
|
341
|
-
def create_rpm_source(orig)
|
342
|
-
# create tar.gz source file
|
343
|
-
tgz = Zlib::GzipWriter.new(File.open("#{@rpm_top_dir}/SOURCES/#{full_name}.tar.gz", 'wb'))
|
344
|
-
# Warning: tgz will be closed!
|
345
|
-
FileUtils.cd "#{orig}"
|
346
|
-
Minitar.pack("#{full_name}", tgz)
|
347
|
-
FileUtils.cd "#{@rpm_top_dir}"
|
348
|
-
end
|
349
|
-
|
350
|
-
def rpmbuild
|
351
|
-
# define rpm build args
|
352
|
-
options = "-bb --rmspec --rmsource"
|
353
|
-
define = "--define \"_topdir #{@rpm_top_dir}\" --define \"_tmppath #{@rpm_top_dir}/tmp\""
|
354
|
-
specfile = "#{@rpm_top_dir}/SPECS/#{full_name}.spec"
|
355
|
-
# create rpm
|
356
|
-
system "rpmbuild #{options} #{define} #{specfile}"
|
357
|
-
end
|
25
|
+
end
|
358
26
|
end
|
data/lib/rgem2rpm/gem.rb
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rubygems/installer'
|
4
|
+
require 'rubygems/remote_fetcher'
|
5
|
+
|
6
|
+
class RGem2Rpm::Gem
|
7
|
+
# define accessors
|
8
|
+
attr_accessor :spec
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
# initialize paramters
|
12
|
+
@filename = args[:filename]
|
13
|
+
@platform = args[:platform] || 'ruby'
|
14
|
+
end
|
15
|
+
|
16
|
+
# install gem to pwd
|
17
|
+
def install
|
18
|
+
# get spec information
|
19
|
+
@spec = compute_spec
|
20
|
+
# define name and platform
|
21
|
+
@spec[:installname] = name_and_platform(@spec[:name])
|
22
|
+
# set install dir
|
23
|
+
@installdir = "#{@spec[:installname]}-#{@spec[:version]}"
|
24
|
+
# install gem
|
25
|
+
Gem::Installer.new(@filename, :env_shebang => true, :ignore_dependencies => true, :install_dir => @installdir, :bin_dir => "#{@installdir}/bin", :wrappers => true).install
|
26
|
+
# clean build if gem has extensions
|
27
|
+
@spec[:extensions].each do |extension|
|
28
|
+
Dir.chdir(File.dirname("#{@installdir}/gems/#{@filename[0, @filename.size-4]}/#{extension}")) do |path|
|
29
|
+
# delete intermediate build files
|
30
|
+
system "make clean"
|
31
|
+
# delete makefile
|
32
|
+
FileUtils.rm_rf("#{path}/Makefile")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
# delete directories
|
36
|
+
Dir["#{@installdir}/*"].each {|name| FileUtils.rm_rf(name) unless name =~ /bin|gems|specifications/ }
|
37
|
+
# get file list
|
38
|
+
files
|
39
|
+
# alter executables first line
|
40
|
+
shebang
|
41
|
+
# build tar.gz
|
42
|
+
build_source
|
43
|
+
end
|
44
|
+
|
45
|
+
# clean temporary files
|
46
|
+
def clean
|
47
|
+
return if @installdir.nil?
|
48
|
+
FileUtils.rm_rf @installdir
|
49
|
+
FileUtils.rm_rf "#{@installdir}.tar.gz"
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
# get information from specification
|
54
|
+
def compute_spec
|
55
|
+
specinfo = {}
|
56
|
+
File.open(@filename, 'r') do |f|
|
57
|
+
Gem::Package.open(f, 'r') do |gem|
|
58
|
+
# spec info
|
59
|
+
metadata = gem.metadata
|
60
|
+
# name
|
61
|
+
specinfo[:name] = metadata.name
|
62
|
+
# version
|
63
|
+
specinfo[:version] = metadata.version
|
64
|
+
# summary
|
65
|
+
specinfo[:summary] = metadata.summary
|
66
|
+
# homepage
|
67
|
+
specinfo[:homepage] = metadata.homepage
|
68
|
+
# platform
|
69
|
+
specinfo[:platform] = metadata.platform
|
70
|
+
# description
|
71
|
+
specinfo[:description] = metadata.description
|
72
|
+
# if the gemspec has extensions defined, then this should be a 'native' arch.
|
73
|
+
specinfo[:architecture] = metadata.extensions.empty? ? 'all' : 'native'
|
74
|
+
# rubygem required version
|
75
|
+
specinfo[:rubygem] = metadata.required_rubygems_version
|
76
|
+
# dependencies
|
77
|
+
specinfo[:dependencies] = metadata.runtime_dependencies
|
78
|
+
# extensions
|
79
|
+
specinfo[:extensions] = metadata.extensions
|
80
|
+
# executables
|
81
|
+
specinfo[:executables] = metadata.executables
|
82
|
+
end
|
83
|
+
end
|
84
|
+
specinfo
|
85
|
+
end
|
86
|
+
|
87
|
+
# define name and platform
|
88
|
+
def name_and_platform(gemname)
|
89
|
+
name = gemname
|
90
|
+
if gemname =~ /jruby|jars|java/ or @spec[:platform] == 'java'
|
91
|
+
@platform = 'jruby'
|
92
|
+
name = "jruby-#{gemname}" unless gemname =~ /jruby/
|
93
|
+
elsif @platform == 'jruby' and !@spec[:executables].nil? and !@spec[:executables].empty?
|
94
|
+
name = "jruby-#{gemname}"
|
95
|
+
end
|
96
|
+
"rubygem-#{name}"
|
97
|
+
end
|
98
|
+
|
99
|
+
# return hash with list of files and directories
|
100
|
+
def files
|
101
|
+
@spec[:files] = {:directories => [], :files => [], :executables => []}
|
102
|
+
Dir.chdir(@installdir) do
|
103
|
+
# create gem directory structure
|
104
|
+
@spec[:files][:directories] << 'gems'
|
105
|
+
@spec[:files][:directories] << 'specifications'
|
106
|
+
@spec[:files][:directories] << 'bin'
|
107
|
+
# get files and directories
|
108
|
+
%w(gems specifications).each do |path|
|
109
|
+
Dir.glob("#{path}/**/*") do |file|
|
110
|
+
key = File.directory?(file) ? :directories : :files
|
111
|
+
@spec[:files][key] << file
|
112
|
+
end
|
113
|
+
end
|
114
|
+
# get executable files
|
115
|
+
Dir.glob("bin/*") do |file|
|
116
|
+
@spec[:files][:executables] << file
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def shebang
|
122
|
+
# check if gem has executables
|
123
|
+
return if @spec[:executables].nil? or @spec[:executables].empty?
|
124
|
+
# alter first line of all executables
|
125
|
+
@spec[:executables].each do |file|
|
126
|
+
file_arr = File.readlines("#{@installdir}/bin/#{file}")
|
127
|
+
file_arr[0] = "#!/usr/bin/env #{@platform}\n"
|
128
|
+
File.open("#{@installdir}/bin/#{file}", 'w') { |f| f.write(file_arr.join) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def build_source
|
133
|
+
# create tar.gz
|
134
|
+
res = system "tar czf #{@installdir}.tar.gz #{@installdir}"
|
135
|
+
# check errors
|
136
|
+
raise "Error creating archive #{@installdir}.tar.gz" unless res
|
137
|
+
# clean temporary files
|
138
|
+
FileUtils.rm_rf @installdir
|
139
|
+
end
|
140
|
+
end
|
data/lib/rgem2rpm/rpm.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
class RGem2Rpm::Rpm
|
4
|
+
attr_accessor :name, :version, :release, :license, :summary, :group, :description, :installdir
|
5
|
+
|
6
|
+
def initialize(args)
|
7
|
+
@template = args[:template] || File.dirname(__FILE__) + '/../../conf/template.spec'
|
8
|
+
@name = args[:installname]
|
9
|
+
@gemname = args[:name]
|
10
|
+
@version = args[:version]
|
11
|
+
@release = args[:release] || '1'
|
12
|
+
@license = "See #{args[:homepage]}"
|
13
|
+
@summary = args[:summary]
|
14
|
+
@group = args[:group] || 'Ruby/Gems'
|
15
|
+
@osuser = args[:osuser] || 'root'
|
16
|
+
@osgroup = args[:osgroup] || 'root'
|
17
|
+
@description = args[:description]
|
18
|
+
@installdir = args[:installdir] || '/opt/ruby'
|
19
|
+
@arch = args[:architecture]
|
20
|
+
@files = args[:files]
|
21
|
+
@rubygem = args[:rubygem]
|
22
|
+
@dependencies = args[:dependencies]
|
23
|
+
end
|
24
|
+
|
25
|
+
def create
|
26
|
+
# create spec
|
27
|
+
spec
|
28
|
+
# build rpm
|
29
|
+
build
|
30
|
+
end
|
31
|
+
|
32
|
+
def installlist
|
33
|
+
install_str = StringIO.new
|
34
|
+
install_str << "rm -rf %{buildroot}\n"
|
35
|
+
# get directories
|
36
|
+
@files[:directories].each { |directory|
|
37
|
+
install_str << "install -d #{directory} %{buildroot}%{prefix}/#{directory}\n"
|
38
|
+
}
|
39
|
+
# get files
|
40
|
+
@files[:files].each { |file|
|
41
|
+
install_str << "install -m 644 \"#{file}\" %{buildroot}%{prefix}/\"#{file}\"\n"
|
42
|
+
}
|
43
|
+
# get executables
|
44
|
+
@files[:executables].each { |executable|
|
45
|
+
install_str << "install -m 0755 #{executable} %{buildroot}%{prefix}/#{executable}\n"
|
46
|
+
}
|
47
|
+
# return install string
|
48
|
+
install_str.string
|
49
|
+
end
|
50
|
+
|
51
|
+
def filelist
|
52
|
+
files_str = StringIO.new
|
53
|
+
files_str << "%defattr(0644,#{@osuser},#{@osgroup},0755)\n"
|
54
|
+
files_str << "%dir %{prefix}\n"
|
55
|
+
# get directories
|
56
|
+
@files[:directories].each { |directory|
|
57
|
+
files_str << "%dir %{prefix}/#{directory}\n"
|
58
|
+
}
|
59
|
+
# get files
|
60
|
+
@files[:files].each { |file|
|
61
|
+
files_str << "%{prefix}/#{file}\n"
|
62
|
+
}
|
63
|
+
# get executables
|
64
|
+
@files[:executables].each { |executable|
|
65
|
+
files_str << "%attr(0755,#{@osuser},#{@osgroup}) %{prefix}/#{executable}\n"
|
66
|
+
}
|
67
|
+
# return file string
|
68
|
+
files_str.string
|
69
|
+
end
|
70
|
+
|
71
|
+
def buildarch
|
72
|
+
@arch == 'all' ? 'noarch' : nil
|
73
|
+
end
|
74
|
+
|
75
|
+
def requires
|
76
|
+
req_str = StringIO.new
|
77
|
+
req_str << "rubygems #{@rubygem}" unless @rubygem.nil?
|
78
|
+
# set runtime dependencies
|
79
|
+
@dependencies.each { |d|
|
80
|
+
req_str << ', ' unless req_str.size == 0
|
81
|
+
req_str << "rubygem(#{d.name}) #{d.requirement.to_s.gsub('~>', '>=')}"
|
82
|
+
if d.requirement.to_s =~ /~>/
|
83
|
+
version = d.requirement.to_s.delete('~>').strip.split('.')
|
84
|
+
version[version.size - 1] = "0"
|
85
|
+
version[version.size - 2] = (version[version.size - 2].to_i + 1).to_s
|
86
|
+
req_str << ", rubygem(#{d.name}) < #{version.join('.')}"
|
87
|
+
end
|
88
|
+
}
|
89
|
+
# return string with dependencies
|
90
|
+
req_str.string
|
91
|
+
end
|
92
|
+
|
93
|
+
# return gem provides clause
|
94
|
+
def provides
|
95
|
+
prv_str = StringIO.new
|
96
|
+
prv_str << "rubygem(#{@gemname}) = #{@version}"
|
97
|
+
prv_str.string
|
98
|
+
end
|
99
|
+
|
100
|
+
# return changelog information
|
101
|
+
def changelog
|
102
|
+
change_str = StringIO.new
|
103
|
+
change_str << "* #{Time.now.strftime('%a %b %d %Y')} rgem2rpm <https://github.com/jppeixoto/rgem2rpm> #{@version}-#{@release}\n"
|
104
|
+
change_str << "- Create rpm package\n"
|
105
|
+
change_str.string
|
106
|
+
end
|
107
|
+
|
108
|
+
# clean temporary files
|
109
|
+
def clean
|
110
|
+
FileUtils.rm_rf "#{@name}-#{@version}.spec"
|
111
|
+
FileUtils.rm_rf "./rpmtemp"
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
def spec
|
116
|
+
template = ERB.new(File.read(@template))
|
117
|
+
# write rpm spec file file
|
118
|
+
File.open("#{@name}-#{@version}.spec", 'w') { |f|
|
119
|
+
f.write(template.result(binding))
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
def build
|
124
|
+
create_rpm_env
|
125
|
+
# move to rpmbuild path
|
126
|
+
FileUtils.mv "#{@name}-#{@version}.spec", "rpmtemp/rpmbuild/SPECS"
|
127
|
+
# move sources to rpmbuild
|
128
|
+
FileUtils.mv "#{@name}-#{@version}.tar.gz", "rpmtemp/rpmbuild/SOURCES"
|
129
|
+
# define rpm build args
|
130
|
+
options = "-bb --rmspec --rmsource"
|
131
|
+
define = "--define \"_topdir #{Dir.pwd}/rpmtemp/rpmbuild\" --define \"_tmppath #{Dir.pwd}/rpmtemp/rpmbuild/tmp\""
|
132
|
+
specfile = "#{Dir.pwd}/rpmtemp/rpmbuild/SPECS/#{@name}-#{@version}.spec"
|
133
|
+
# create rpm
|
134
|
+
res = system "rpmbuild #{options} #{define} #{specfile}"
|
135
|
+
# check errors
|
136
|
+
raise "Error creating rpm" unless res
|
137
|
+
# clean temporary files
|
138
|
+
Dir.glob("rpmtemp/rpmbuild/RPMS/**/*.rpm") do |file|
|
139
|
+
FileUtils.mv file, "./"
|
140
|
+
end
|
141
|
+
clean
|
142
|
+
end
|
143
|
+
|
144
|
+
def create_rpm_env
|
145
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/SPECS"
|
146
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/BUILD"
|
147
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/RPMS"
|
148
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/SRPMS"
|
149
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/SOURCES"
|
150
|
+
FileUtils.mkdir_p "rpmtemp/rpmbuild/tmp"
|
151
|
+
end
|
152
|
+
end
|
data/lib/rgem2rpm/version.rb
CHANGED
data/lib/rgem2rpm.rb
CHANGED
data/rgem2rpm.gemspec
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
+
require 'lib/rgem2rpm/version'
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = %q{rgem2rpm}
|
3
|
-
s.version =
|
5
|
+
s.version = RGem2Rpm::VERSION
|
4
6
|
s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
|
5
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.4.2") if s.respond_to?(:required_rubygems_version=)
|
6
|
-
s.date = %
|
8
|
+
s.date = Time.now.strftime("%Y-%m-%d")
|
7
9
|
s.authors = ["Joao Peixoto"]
|
8
10
|
s.email = %q{peixoto.joao@gmail.com}
|
9
11
|
s.summary = %q{Convert ruby gems into rpm}
|
10
12
|
s.homepage = %q{https://github.com/jppeixoto/rgem2rpm}
|
11
13
|
s.description = %q{Application that enables conversion of rubygems to rpms.}
|
12
|
-
s.platform = Gem::Platform::RUBY
|
13
14
|
s.bindir = 'bin'
|
14
15
|
s.executables = 'rgem2rpm'
|
15
16
|
s.files = ["Rakefile",
|
@@ -18,7 +19,8 @@ Gem::Specification.new do |s|
|
|
18
19
|
"lib/rgem2rpm.rb",
|
19
20
|
"lib/rgem2rpm/argumentparse.rb",
|
20
21
|
"lib/rgem2rpm/converter.rb",
|
22
|
+
"lib/rgem2rpm/gem.rb",
|
23
|
+
"lib/rgem2rpm/rpm.rb",
|
21
24
|
"lib/rgem2rpm/version.rb",
|
22
25
|
"conf/template.spec"]
|
23
|
-
s.add_dependency 'minitar', '>= 0.5.3'
|
24
26
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rgem2rpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.4.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Joao Peixoto
|
@@ -10,19 +10,9 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: minitar
|
17
|
-
prerelease: false
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.5.3
|
24
|
-
type: :runtime
|
25
|
-
version_requirements: *id001
|
13
|
+
date: 2012-02-14 00:00:00 Z
|
14
|
+
dependencies: []
|
15
|
+
|
26
16
|
description: Application that enables conversion of rubygems to rpms.
|
27
17
|
email: peixoto.joao@gmail.com
|
28
18
|
executables:
|
@@ -38,6 +28,8 @@ files:
|
|
38
28
|
- lib/rgem2rpm.rb
|
39
29
|
- lib/rgem2rpm/argumentparse.rb
|
40
30
|
- lib/rgem2rpm/converter.rb
|
31
|
+
- lib/rgem2rpm/gem.rb
|
32
|
+
- lib/rgem2rpm/rpm.rb
|
41
33
|
- lib/rgem2rpm/version.rb
|
42
34
|
- conf/template.spec
|
43
35
|
homepage: https://github.com/jppeixoto/rgem2rpm
|