-
Notifications
You must be signed in to change notification settings - Fork 45
/
gem2rpm.rb
98 lines (78 loc) · 2.74 KB
/
gem2rpm.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
require 'erb'
require 'socket'
require 'gem2rpm/package'
require 'gem2rpm/distro'
require 'gem2rpm/format'
require 'gem2rpm/spec_fetcher'
require 'gem2rpm/specification'
require 'gem2rpm/template_helpers'
require 'gem2rpm/template'
module Gem2Rpm
extend Gem2Rpm::TemplateHelpers
Gem2Rpm::VERSION = "0.11.2"
class Exception < RuntimeError; end
class DownloadUrlError < Exception; end
OPEN_MODE = # :nodoc:
if Object.const_defined? :Encoding
'r:UTF-8'
else
'r'
end
def self.find_download_url(name, version)
dep = Gem::Dependency.new(name, "=#{version}")
fetcher = Gem2Rpm::SpecFetcher.new(Gem::SpecFetcher.fetcher)
spec_and_source, errors = fetcher.spec_for_dependency(dep, false)
raise DownloadUrlError.new(errors.first.error.message) unless errors.empty?
spec, source = spec_and_source.first
if source && source.uri
download_path = source.uri.to_s
download_path += "gems/"
end
download_path
end
def Gem2Rpm.convert(fname, template, out=$stdout, nongem=true, local=false,
doc_subpackage = true)
package = Gem2Rpm::Package.new(fname)
# Deprecate, kept just for backward compatibility.
format = Gem2Rpm::Format.new(package)
spec = Gem2Rpm::Specification.new(package.spec)
config = Gem2Rpm::Configuration.instance.to_default
download_path = ""
unless local
begin
download_path = find_download_url(spec.name, spec.version)
rescue DownloadUrlError => e
$stderr.puts "Warning: Could not retrieve full URL for #{spec.name}\nWarning: Edit the specfile and enter the full download URL as 'Source0' manually"
$stderr.puts e.inspect
end
end
erb = ERB.new(template.read, 0, '-')
out.puts erb.result(binding)
rescue Gem::Exception => e
puts e
end
# Returns the email address of the packager (i.e., the person running
# gem2spec). Taken from RPM macros if present, constructed from system
# username and hostname otherwise.
def Gem2Rpm.packager()
packager = `rpmdev-packager 2> /dev/null`.chomp rescue ''
if packager.empty?
packager = `rpm --eval '%{packager}' 2> /dev/null`.chomp rescue ''
end
if packager.empty? or packager == '%{packager}'
passwd_entry = Etc::getpwnam(Etc::getlogin)
packager = "#{(passwd_entry && passwd_entry.gecos) || Etc::getlogin } <#{Etc::getlogin}@#{Socket::gethostname}>"
end
packager
end
def self.rubygem_template
Template.new(File.join(Template::default_location, "#{Distro.nature.to_s}.spec.erb"))
end
def self.vagrant_plugin_template
file = File.join(Template::default_location, "#{Distro.nature.to_s}-vagrant-plugin.spec.erb")
Template.new(file)
end
end
# Local Variables:
# ruby-indent-level: 2
# End: