simp-rake-helpers 4.1.1 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/lib/simp/rake.rb +4 -19
- data/lib/simp/rake/build/auto.rb +241 -506
- data/lib/simp/rake/build/build.rb +22 -155
- data/lib/simp/rake/build/clean.rb +3 -11
- data/lib/simp/rake/build/constants.rb +16 -78
- data/lib/simp/rake/build/deps.rb +8 -1
- data/lib/simp/rake/build/iso.rb +8 -6
- data/lib/simp/rake/build/pkg.rb +372 -304
- data/lib/simp/rake/build/rpmdeps.rb +2 -2
- data/lib/simp/rake/build/spec.rb +2 -1
- data/lib/simp/rake/build/tar.rb +11 -13
- data/lib/simp/rake/build/unpack.rb +2 -1
- data/lib/simp/rake/build/upload.rb +2 -1
- data/lib/simp/rake/helpers.rb +23 -0
- data/lib/simp/rake/helpers/version.rb +1 -1
- data/lib/simp/rake/pkg.rb +177 -312
- data/lib/simp/rake/pupmod/helpers.rb +13 -10
- data/lib/simp/rpm.rb +348 -65
- data/lib/simp/yum.rb +209 -0
- data/spec/lib/simp/files/simp_build/src/{build → assets/simp/build}/simp.spec +0 -0
- data/spec/lib/simp/files/testpackage-1-0.el7.noarch.rpm +0 -0
- data/spec/lib/simp/files/testpackage-dist.spec +42 -0
- data/spec/lib/simp/files/testpackage-multi.spec +7 -5
- data/spec/lib/simp/rpm_spec.rb +289 -14
- data/spec/spec_helper.rb +3 -0
- metadata +6 -3
@@ -231,16 +231,19 @@ class Simp::Rake::Pupmod::Helpers < ::Rake::TaskLib
|
|
231
231
|
if files_changed.empty?
|
232
232
|
puts " No new tag required: No significant files have changed since '#{last_tag}' tag"
|
233
233
|
else
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
234
|
+
unless ignore_owner
|
235
|
+
# determine latest version from CHANGELOG, which will present
|
236
|
+
# for all SIMP Puppet modules
|
237
|
+
line = IO.readlines('CHANGELOG')[0]
|
238
|
+
match = line.match(/^\*\s+((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4})\s+(.+<.+>)(?:\s+|\s*-\s*)?(\d+\.\d+\.\d+)/)
|
239
|
+
unless match
|
240
|
+
fail("ERROR: Invalid CHANGELOG entry. Unable to extract version from '#{line}'")
|
241
|
+
end
|
242
|
+
|
243
|
+
changelog_version = match[3]
|
244
|
+
unless module_version == changelog_version
|
245
|
+
fail("ERROR: Version mismatch. module version=#{module_version} changelog version=#{changelog_version}")
|
246
|
+
end
|
244
247
|
end
|
245
248
|
|
246
249
|
cmp_result = Puppet::Util::Package::versioncmp(module_version, last_tag)
|
data/lib/simp/rpm.rb
CHANGED
@@ -1,14 +1,19 @@
|
|
1
1
|
require 'securerandom'
|
2
|
+
require 'puppet/util'
|
2
3
|
|
3
4
|
module Simp
|
4
|
-
# Simp::RPM represents
|
5
|
+
# An Simp::RPM instance represents RPM metadata extracted from an
|
6
|
+
# RPM or an RPM spec file.
|
7
|
+
#
|
8
|
+
# Simp::RPM also contains class methods that are useful for
|
9
|
+
# processing RPMs in the SIMP build process.
|
5
10
|
class Simp::RPM
|
6
11
|
require 'expect'
|
7
12
|
require 'pty'
|
8
13
|
require 'rake'
|
9
14
|
|
10
15
|
@@gpg_keys = Hash.new
|
11
|
-
|
16
|
+
attr_reader :verbose, :packages
|
12
17
|
|
13
18
|
if Gem.loaded_specs['rake'].version >= Gem::Version.new('0.9')
|
14
19
|
def self.sh(args)
|
@@ -16,26 +21,224 @@ module Simp
|
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
19
|
-
# Constructs a new Simp::RPM object. Requires the path to the spec file
|
20
|
-
# from which information will be gathered.
|
24
|
+
# Constructs a new Simp::RPM object. Requires the path to the spec file, or
|
25
|
+
# RPM, from which information will be gathered.
|
26
|
+
#
|
27
|
+
# When the information is from a spec file, multiple
|
28
|
+
# packages may exist.
|
29
|
+
#
|
30
|
+
# The following information will be retrieved per package:
|
21
31
|
#
|
22
|
-
# The following information will be retreived:
|
23
32
|
# [basename] The name of the package (as it would be queried in yum)
|
24
33
|
# [version] The version of the package
|
25
34
|
# [release] The release version of the package
|
26
|
-
# * NOTE: If this is a 'spec' file, it will stop on the first '%'
|
27
|
-
# encountered!
|
28
35
|
# [full_version] The full version of the package: [version]-[release]
|
29
36
|
# [name] The full name of the package: [basename]-[full_version]
|
37
|
+
# [arch] The machine architecture of the package
|
38
|
+
# [signature] The signature key of the package, if it exists. Will not
|
39
|
+
# apply when +rpm_source+ is an RPM spec file.
|
40
|
+
# [rpm_name] The full name of the rpm
|
30
41
|
def initialize(rpm_source)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
42
|
+
update_rpmmacros
|
43
|
+
|
44
|
+
# Simp::RPM.get_info returns a Hash or an Array of Hashes.
|
45
|
+
# Steps below prevent single Hash from implicitly being converted
|
46
|
+
# to Array using Hash.to_a.
|
47
|
+
info_array = []
|
48
|
+
info_array << Simp::RPM.get_info(rpm_source)
|
49
|
+
info_array.flatten!
|
50
|
+
|
51
|
+
@info = {}
|
52
|
+
info_array.each do |package_info|
|
53
|
+
@info[package_info[:basename]] = package_info
|
54
|
+
end
|
55
|
+
|
56
|
+
@packages = @info.keys
|
57
|
+
end
|
58
|
+
|
59
|
+
# @returns The RPM '.dist' of the system. 'nil' will be will be returned if
|
60
|
+
# the dist is not found.
|
61
|
+
def self.system_dist
|
62
|
+
# We can only have one of these
|
63
|
+
unless defined?(@@system_dist)
|
64
|
+
dist = %x(rpm -E '%{dist}' 2> /dev/null).strip.split('.')
|
65
|
+
|
66
|
+
if dist.size > 1
|
67
|
+
@@system_dist = '.' + dist[1]
|
68
|
+
else
|
69
|
+
@@system_dist = nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
return @@system_dist
|
74
|
+
end
|
75
|
+
|
76
|
+
def system_dist
|
77
|
+
return Simp::RPM.system_dist
|
78
|
+
end
|
79
|
+
|
80
|
+
# Work around the silliness with 'centos' being tacked onto things via the
|
81
|
+
# 'dist' flag
|
82
|
+
def update_rpmmacros
|
83
|
+
unless defined?(@@macros_updated)
|
84
|
+
|
85
|
+
# Workaround for CentOS system builds
|
86
|
+
dist = system_dist
|
87
|
+
dist_macro = %(%dist #{dist})
|
88
|
+
|
89
|
+
rpmmacros = [dist_macro]
|
90
|
+
|
91
|
+
rpmmacros_file = File.join(ENV['HOME'], '.rpmmacros')
|
92
|
+
|
93
|
+
if File.exist?(rpmmacros_file)
|
94
|
+
rpmmacros = File.read(rpmmacros_file).split("\n")
|
95
|
+
|
96
|
+
dist_index = rpmmacros.each_index.select{|i| rpmmacros[i] =~ /^%dist\s+/}.first
|
97
|
+
|
98
|
+
if dist_index
|
99
|
+
rpmmacros[dist_index] = dist_macro
|
100
|
+
else
|
101
|
+
rpmmacros << dist_macro
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
File.open(rpmmacros_file, 'w') do |fh|
|
106
|
+
fh.puts rpmmacros.join("\n")
|
107
|
+
fh.flush
|
108
|
+
end
|
109
|
+
|
110
|
+
@@macros_updated = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# @returns The name of the package (as it would be queried in yum)
|
115
|
+
#
|
116
|
+
# @fails if package is invalid
|
117
|
+
def basename(package=@packages.first)
|
118
|
+
valid_package?(package)
|
119
|
+
@info[package][:basename]
|
120
|
+
end
|
121
|
+
|
122
|
+
# @returns The version of the package
|
123
|
+
#
|
124
|
+
# @fails if package is invalid
|
125
|
+
def version(package=@packages.first)
|
126
|
+
valid_package?(package)
|
127
|
+
@info[package][:version]
|
128
|
+
end
|
129
|
+
|
130
|
+
# @returns The release version of the package
|
131
|
+
#
|
132
|
+
# @fails if package is invalid
|
133
|
+
def release(package=@packages.first)
|
134
|
+
valid_package?(package)
|
135
|
+
@info[package][:release]
|
136
|
+
end
|
137
|
+
|
138
|
+
# @returns The full version of the package: [version]-[release]
|
139
|
+
#
|
140
|
+
# @fails if package is invalid
|
141
|
+
def full_version(package=@packages.first)
|
142
|
+
valid_package?(package)
|
143
|
+
@info[package][:full_version]
|
144
|
+
end
|
145
|
+
|
146
|
+
# @returns The full name of the package: [basename]-[full_version]
|
147
|
+
# @fails if package is invalid
|
148
|
+
def name(package=@packages.first)
|
149
|
+
valid_package?(package)
|
150
|
+
@info[package][:name]
|
151
|
+
end
|
152
|
+
|
153
|
+
# @returns The machine architecture of the package
|
154
|
+
#
|
155
|
+
# @fails if package is invalid
|
156
|
+
def arch(package=@packages.first)
|
157
|
+
valid_package?(package)
|
158
|
+
@info[package][:arch]
|
159
|
+
end
|
160
|
+
|
161
|
+
# @returns The signature key of the package, if it exists or nil
|
162
|
+
# otherwise. Will always be nil when the information for this
|
163
|
+
# object was derived from an RPM spec file.
|
164
|
+
#
|
165
|
+
# @fails if package is invalid
|
166
|
+
def signature(package=@packages.first)
|
167
|
+
valid_package?(package)
|
168
|
+
@info[package][:signature]
|
169
|
+
end
|
170
|
+
|
171
|
+
# @returns The full name of the RPM
|
172
|
+
#
|
173
|
+
# @fails if package is invalid
|
174
|
+
def rpm_name(package=@packages.first)
|
175
|
+
valid_package?(package)
|
176
|
+
@info[package][:rpm_name]
|
177
|
+
end
|
178
|
+
|
179
|
+
# @returns Whether or not the package has a `dist` tag
|
180
|
+
#
|
181
|
+
# @fails if package is invalid
|
182
|
+
def has_dist_tag?(package=@packages.first)
|
183
|
+
valid_package?(package)
|
184
|
+
@info[package][:has_dist_tag]
|
185
|
+
end
|
186
|
+
|
187
|
+
# @returns The `dist` of the package. If no `dist` is found, returns the
|
188
|
+
# `dist` of the OS itself. Logic should check both `has_dist_tag?` and
|
189
|
+
# `dist`
|
190
|
+
#
|
191
|
+
# @fails if package is invalid
|
192
|
+
def dist(package=@packages.first)
|
193
|
+
valid_package?(package)
|
194
|
+
@info[package][:dist]
|
195
|
+
end
|
196
|
+
|
197
|
+
# Returns whether or not the current RPM package is
|
198
|
+
# newer than the passed RPM.
|
199
|
+
#
|
200
|
+
# Uses the first package in the package list as the
|
201
|
+
# current RPM package.
|
202
|
+
def newer?(other_rpm)
|
203
|
+
package_newer?(@packages.first, other_rpm)
|
204
|
+
end
|
205
|
+
|
206
|
+
# Returns whether or not the current RPM sub-package is
|
207
|
+
# newer than the passed RPM.
|
208
|
+
def package_newer?(package, other_rpm)
|
209
|
+
valid_package?(package)
|
210
|
+
return true if other_rpm.nil? || other_rpm.empty?
|
211
|
+
|
212
|
+
unless other_rpm.match(%r(\.rpm$))
|
213
|
+
raise ArgumentError.new("You must pass valid RPM name! Got: '#{other_rpm}'")
|
214
|
+
end
|
215
|
+
|
216
|
+
if File.readable?(other_rpm)
|
217
|
+
other_full_version = Simp::RPM.get_info(other_rpm)[:full_version]
|
218
|
+
else
|
219
|
+
# determine RPM info in a hacky way, ASSUMING, the other RPM has the
|
220
|
+
# same basename and arch
|
221
|
+
other_full_version = other_rpm.gsub(/#{package}\-/,'').gsub(/.rpm$/,'')
|
222
|
+
package_arch = arch(package)
|
223
|
+
unless package_arch.nil? or package_arch.empty?
|
224
|
+
other_full_version.gsub!(/.#{package_arch}/,'')
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
begin
|
229
|
+
# Puppet::Util::Package::versioncmp can handle simp-doc-UNKNOWN-0.el7, whereas
|
230
|
+
# Gem::Version can't
|
231
|
+
return Puppet::Util::Package::versioncmp(full_version(package), other_full_version) > 0
|
232
|
+
|
233
|
+
rescue ArgumentError, NoMethodError
|
234
|
+
fail("Could not compare RPMs '#{rpm_name(package)}' and '#{other_rpm}'")
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def valid_package?(package)
|
239
|
+
unless @packages.include?(package)
|
240
|
+
raise ArgumentError.new("'#{package}' is not a valid sub-package")
|
241
|
+
end
|
39
242
|
end
|
40
243
|
|
41
244
|
# Copies specific content from one directory to another.
|
@@ -78,76 +281,156 @@ module Simp
|
|
78
281
|
FileUtils.rm_f([outfile, errfile])
|
79
282
|
end
|
80
283
|
|
81
|
-
# Parses information, such as the version, from the given specfile
|
82
|
-
# into a hash.
|
284
|
+
# Parses information, such as the version, from the given specfile
|
285
|
+
# or RPM into a hash.
|
83
286
|
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
# :
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
287
|
+
# If the information from only single RPM is extracted, returns a
|
288
|
+
# single Hash with the following possible keys:
|
289
|
+
# :has_dist_tag = a boolean indicating whether the RPM release
|
290
|
+
# has a distribution field; only evaluated when
|
291
|
+
# rpm_source is a spec file, otherwise false
|
292
|
+
# :basename = The name of the package (as it would be
|
293
|
+
# queried in yum)
|
294
|
+
# :version = The version of the package
|
295
|
+
# :release = The release version of the package
|
296
|
+
# :arch = The machine architecture of the package
|
297
|
+
# :full_version = The full version of the package:
|
298
|
+
# <version>-<release>
|
299
|
+
# :name = The full name of the package:
|
300
|
+
# <basename>-<full_version>
|
301
|
+
# :rpm_name = The full name of the RPM:
|
302
|
+
# <basename>-<full_version>.<arch>.rpm
|
303
|
+
# :signature = RPM signature key id; only present if
|
304
|
+
# rpm_source is an RPM and the RPM is signed
|
305
|
+
#
|
306
|
+
# If the information from more than one RPM is extracted, as is the case
|
307
|
+
# when a spec file specifies sub-packages, returns an Array of Hashes.
|
308
|
+
#
|
309
|
+
def self.get_info(rpm_source)
|
310
|
+
raise "Error: unable to read '#{rpm_source}'" unless File.readable?(rpm_source)
|
94
311
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
# * The RPM spec file has an invalid date in its %changelog.
|
101
|
-
# * The 'bogus date' warning message from rpmbuild
|
102
|
-
# is sent to stderr, while RPM name, version, and release
|
103
|
-
# info is sent to stdout.
|
104
|
-
# * mock combines stdout and stderr in the command run.
|
105
|
-
# * The 'bogus date' warning message is parsed to generate
|
106
|
-
# the RPM info, instead of the RPM info message.
|
107
|
-
rpm_cmd = mock_hash[:command] + ' ' + '"' + rpm_cmd + ' ' + mock_hash[:rpm_extras] + ' 2>/dev/null"'
|
108
|
-
end
|
312
|
+
info_array = []
|
313
|
+
common_info = {
|
314
|
+
:has_dist_tag => false,
|
315
|
+
:dist => system_dist
|
316
|
+
}
|
109
317
|
|
110
|
-
|
111
|
-
if File.read(rpm_source).include?('%{?dist}')
|
112
|
-
info[:has_dist_tag] = true
|
113
|
-
end
|
318
|
+
rpm_version_query = %(rpm -q --queryformat '%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n' 2>/dev/null)
|
114
319
|
|
115
|
-
|
116
|
-
results = execute("#{rpm_cmd} -p #{rpm_source}")
|
117
|
-
elsif mock_hash
|
118
|
-
results = execute("#{rpm_cmd}")
|
320
|
+
rpm_signature_query = %(rpm -q --queryformat '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|\n\')
|
119
321
|
|
120
|
-
|
121
|
-
|
322
|
+
source_is_rpm = rpm_source.split('.').last == 'rpm'
|
323
|
+
if source_is_rpm
|
324
|
+
dist_info = rpm_source.split('-').last.split('.')[1..-3]
|
122
325
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
results = execute("#{rpm_cmd} --specfile #{rpm_source}")
|
326
|
+
unless dist_info.empty?
|
327
|
+
common_info[:has_dist_tag] = true
|
328
|
+
common_info[:dist] = '.' + dist_info.first
|
127
329
|
end
|
128
330
|
|
129
|
-
|
130
|
-
|
331
|
+
elsif File.read(rpm_source).include?('%{?dist}')
|
332
|
+
common_info[:has_dist_tag] = true
|
333
|
+
end
|
334
|
+
|
335
|
+
if source_is_rpm
|
336
|
+
query_source = "-p #{rpm_source}"
|
337
|
+
version_results = execute("#{rpm_version_query} #{query_source}")
|
338
|
+
signature_results = execute("#{rpm_signature_query} #{query_source}")
|
339
|
+
else
|
340
|
+
query_source = "--specfile #{rpm_source}"
|
341
|
+
version_results = execute("#{rpm_version_query} #{query_source}")
|
342
|
+
signature_results = nil
|
343
|
+
end
|
344
|
+
|
345
|
+
if version_results[:exit_status] != 0
|
346
|
+
raise <<-EOE
|
131
347
|
#{indent('Error getting RPM info:', 2)}
|
132
|
-
#{indent(
|
133
|
-
#{indent("Run '#{
|
348
|
+
#{indent(version_results[:stderr].strip, 5)}
|
349
|
+
#{indent("Run '#{rpm_version_query.gsub("\n",'\\n')} #{query_source}' to recreate the issue.", 2)}
|
134
350
|
EOE
|
135
|
-
|
351
|
+
end
|
136
352
|
|
137
|
-
|
138
|
-
|
139
|
-
|
353
|
+
unless signature_results.nil?
|
354
|
+
if signature_results[:exit_status] != 0
|
355
|
+
raise <<-EOE
|
356
|
+
#{indent('Error getting RPM signature:', 2)}
|
357
|
+
#{indent(signature_results[:stderr].strip, 5)}
|
358
|
+
#{indent("Run '#{rpm_signature_query.gsub("\n",'\\n')} #{query_source}' to recreate the issue.", 2)}
|
359
|
+
EOE
|
360
|
+
else
|
361
|
+
signature = signature_results[:stdout].strip
|
362
|
+
end
|
140
363
|
end
|
141
364
|
|
142
|
-
|
365
|
+
version_results[:stdout].strip.lines.each do |line|
|
366
|
+
info = common_info.dup
|
367
|
+
parts = line.split(' ')
|
143
368
|
|
144
|
-
|
369
|
+
info[:basename], info[:version], info[:release], info[:arch] = parts
|
370
|
+
info[:signature] = signature unless signature.nil? or signature.include?('none')
|
371
|
+
info[:full_version] = "#{info[:version]}-#{info[:release]}"
|
372
|
+
info[:name] = "#{info[:basename]}-#{info[:full_version]}"
|
373
|
+
info[:rpm_name] = "#{info[:name]}.#{info[:arch]}.rpm"
|
374
|
+
|
375
|
+
info_array << info
|
376
|
+
end
|
377
|
+
|
378
|
+
if info_array.size == 1
|
379
|
+
return info_array[0]
|
380
|
+
else
|
381
|
+
# will only happen when source is spec file and that spec file
|
382
|
+
# specifies sub-packages
|
383
|
+
return info_array
|
384
|
+
end
|
145
385
|
end
|
146
386
|
|
147
387
|
def self.indent(message, indent_length)
|
148
388
|
message.split("\n").map {|line| ' '*indent_length + line }.join("\n")
|
149
389
|
end
|
150
390
|
|
391
|
+
def self.create_rpm_build_metadata(project_dir, srpms=nil, rpms=nil)
|
392
|
+
last_build = {
|
393
|
+
'git_hash' => %x(git rev-list --max-count=1 HEAD).chomp,
|
394
|
+
'srpms' => {},
|
395
|
+
'rpms' => {}
|
396
|
+
}
|
397
|
+
|
398
|
+
Dir.chdir(File.join(project_dir, 'dist')) do
|
399
|
+
if srpms.nil? or rpms.nil?
|
400
|
+
all_rpms = Dir.glob('*.rpm')
|
401
|
+
srpms = Dir.glob('src.rpm')
|
402
|
+
rpms = all_rpms - srpms
|
403
|
+
end
|
404
|
+
|
405
|
+
srpms.each do |srpm|
|
406
|
+
file_stat = File.stat(srpm)
|
407
|
+
|
408
|
+
last_build['srpms'][File.basename(srpm)] = {
|
409
|
+
'metadata' => Simp::RPM.get_info(srpm),
|
410
|
+
'size' => file_stat.size,
|
411
|
+
'timestamp' => file_stat.ctime,
|
412
|
+
'path' => File.absolute_path(srpm)
|
413
|
+
}
|
414
|
+
end
|
415
|
+
|
416
|
+
rpms.each do |rpm|
|
417
|
+
file_stat = File.stat(rpm)
|
418
|
+
|
419
|
+
last_build['rpms'][File.basename(rpm)] = {
|
420
|
+
'metadata' => Simp::RPM.get_info(rpm),
|
421
|
+
'size' => file_stat.size,
|
422
|
+
'timestamp' => file_stat.ctime,
|
423
|
+
'path' => File.absolute_path(rpm)
|
424
|
+
}
|
425
|
+
end
|
426
|
+
|
427
|
+
FileUtils.mkdir_p(File.join(project_dir, 'dist', 'logs'))
|
428
|
+
File.open('logs/last_rpm_build_metadata.yaml','w') do |fh|
|
429
|
+
fh.puts(last_build.to_yaml)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
151
434
|
# Loads metadata for a GPG key. The GPG key is to be used to sign RPMs. The
|
152
435
|
# value of gpg_key should be the full path of the directory where the key
|
153
436
|
# resides. If the metadata cannot be found, then the user will be prompted
|