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 CHANGED
@@ -8,13 +8,13 @@ require 'rgem2rpm'
8
8
 
9
9
  begin
10
10
  # parse arguments
11
- options_parse = RGem2Rpm::ArgumentParse.parse(ARGV)
11
+ options = RGem2Rpm::ArgumentParse.parse(ARGV)
12
12
  # check arguments
13
13
  raise "Missing argument: gemfilename" unless ARGV.size == 1
14
- # initialize gem2rpm
15
- gem2rpm = RGem2Rpm::Converter.new options_parse, ARGV[0]
16
- # build rpm
17
- gem2rpm.create_rpm
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 <%=prefix_name%>
10
+ %define name <%=name%>
11
11
  %define version <%=version%>
12
- %define release <%=rpm_release%>.%{disttype}%{distnum}
12
+ %define release <%=release%>.%{disttype}%{distnum}
13
13
 
14
14
  Name: %{name}
15
15
  Version: %{version}
16
16
  Release: %{release}
17
- License: See <%=homepage%>
17
+ License: <%=license%>
18
18
  Summary: <%=summary%>
19
- Group: <%=rpm_group%>
19
+ Group: <%=group%>
20
20
  Source: %{name}-%{version}.tar.gz
21
- Prefix: <%=os_install_dir%>
21
+ Prefix: <%=installdir%>
22
22
  BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
23
- <%="BuildArch: noarch" if rpm_no_arch%>
24
- <%="Requires: #{requires}" unless requires.nil?%>
25
- <%="Provides: #{provides}" unless provides.nil?%>
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
- <%=rpm_install%>
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
- %defattr(-,<%=os_user%>,<%=os_group%>)
42
- <%=files%>
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 = OpenStruct.new
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 SPECTEMPLATE", "Define new rpm spec template.") do |spec_template|
25
- options.spec_template = spec_template
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 RPMRELEASE", "Define rpm spec release.") do |rpm_release|
30
- options.rpm_release = rpm_release
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("--rpmgroup RPMGROUPNAME", "Define rpm spec group.") do |rpm_group|
35
- options.rpm_group = rpm_group
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 USERNAME", "Define rpm spec os install user.") do |os_user|
40
- options.os_user = os_user
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 GROUPNAME", "Define rpm spec os install group.") do |os_group|
45
- options.os_group = os_group
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("--osinstalldir INSTALLDIR", "Define rpm spec os install directory.") do |os_install_dir|
50
- options.os_install_dir = os_install_dir
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
@@ -1,358 +1,26 @@
1
- require 'rubygems/installer'
2
- require 'fileutils'
3
- require 'zlib'
4
- require 'archive/tar/minitar'
5
- require 'erb'
6
- include Archive::Tar
7
-
8
- class RGem2Rpm::Converter < Gem::Installer
9
- ##
10
- # Constructs an Installer instance that will install the gem located at
11
- # +gem+. +options+ is a Hash with the following keys:
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
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module RGem2Rpm
2
- VERSION = '1.1.0'
2
+ VERSION = '1.4.0'
3
3
  end
data/lib/rgem2rpm.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # initialize module RGem2Rpm
2
- module RGem2Rpm; end
3
-
2
+ require 'rgem2rpm/version'
4
3
  require 'rgem2rpm/argumentparse'
5
4
  require 'rgem2rpm/converter'
6
- require 'rgem2rpm/version'
5
+ require 'rgem2rpm/gem'
6
+ require 'rgem2rpm/rpm'
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 = "1.3.3"
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 = %q{2012-01-24}
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.3.3
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-01-24 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
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