polisher 0.9.1 → 0.10.1
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.
- checksums.yaml +4 -4
- data/bin/gem_dependency_checker.rb +55 -25
- data/bin/git_gem_updater.rb +18 -7
- data/lib/polisher/bodhi.rb +11 -10
- data/lib/polisher/component.rb +43 -0
- data/lib/polisher/config.rb +32 -0
- data/lib/polisher/core.rb +59 -34
- data/lib/polisher/errata.rb +56 -56
- data/lib/polisher/fedora.rb +33 -33
- data/lib/polisher/gem.rb +316 -281
- data/lib/polisher/gem_state.rb +86 -0
- data/lib/polisher/gemfile.rb +85 -87
- data/lib/polisher/git/pkg.rb +232 -175
- data/lib/polisher/git/repo.rb +74 -61
- data/lib/polisher/koji.rb +136 -83
- data/lib/polisher/logger.rb +23 -0
- data/lib/polisher/rhn.rb +6 -5
- data/lib/polisher/rpm/requirement.rb +186 -177
- data/lib/polisher/rpm/spec.rb +420 -356
- data/lib/polisher/tag_mapper.rb +27 -0
- data/lib/polisher/version.rb +1 -1
- data/lib/polisher/version_checker.rb +86 -17
- data/lib/polisher/yum.rb +26 -19
- data/spec/component_spec.rb +53 -0
- data/spec/core_spec.rb +6 -0
- data/spec/gem_spec.rb +230 -47
- data/spec/git_spec.rb +63 -27
- data/spec/koji_spec.rb +60 -3
- data/spec/rpm/spec_spec.rb +7 -3
- data/spec/spec_helper.rb +2 -1
- data/spec/version_checker_spec.rb +97 -0
- data/spec/yum_spec.rb +5 -0
- metadata +34 -28
- data/lib/polisher/missing.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5357e407b962cb5b7f70b9c9d6ab2b5f99fa5c89
|
4
|
+
data.tar.gz: 4c76786d10e7fe1d61fef4a0f7894ff9d136c5f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d3c78d82e8f5e7bcfe74b5880f4081b039405c79bcb4afba9c195cd0a85d50847b7716b11c0866665cb7515377575638fde0f4dfbbf012843efa92e8e349549
|
7
|
+
data.tar.gz: 0d7b15ce8b04c18e291811054e41ec2111173899b4c8459d969360140a640c8ab084c35045fa446062b86a6a6cccc56d33c26d4c6dbeb81c21eebc54b4508cd8
|
@@ -18,24 +18,26 @@ require 'optparse'
|
|
18
18
|
require 'colored'
|
19
19
|
require 'polisher/gem'
|
20
20
|
require 'polisher/gemfile'
|
21
|
+
require 'polisher/core'
|
21
22
|
|
22
23
|
##########################################################
|
23
24
|
|
24
|
-
conf = {:format
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
25
|
+
conf = {:format => nil,
|
26
|
+
:log_level => :info,
|
27
|
+
:gemfile => './Gemfile',
|
28
|
+
:gemspec => nil,
|
29
|
+
:gemname => nil,
|
30
|
+
:prefix => nil,
|
31
|
+
:groups => [],
|
32
|
+
:devel_deps => false,
|
33
|
+
:check_fedora => false,
|
34
|
+
:check_git => false,
|
35
|
+
:check_koji => false,
|
36
|
+
:check_rhn => false,
|
37
|
+
:check_yum => false,
|
38
|
+
:check_bugzilla => false,
|
39
|
+
:check_errata => false,
|
40
|
+
:check_bodhi => false}
|
39
41
|
|
40
42
|
optparse = OptionParser.new do |opts|
|
41
43
|
opts.on('-h', '--help', 'Display this help screen') do
|
@@ -47,6 +49,10 @@ optparse = OptionParser.new do |opts|
|
|
47
49
|
conf[:format] = f
|
48
50
|
end
|
49
51
|
|
52
|
+
opts.on("--log-level level", "Log verbosity") do |l|
|
53
|
+
conf[:log_level] = l.to_sym
|
54
|
+
end
|
55
|
+
|
50
56
|
opts.on('--gemfile file', 'Location of the gemfile to parse') do |g|
|
51
57
|
conf[:gemfile] = g
|
52
58
|
end
|
@@ -63,12 +69,12 @@ optparse = OptionParser.new do |opts|
|
|
63
69
|
conf[:gemname] = g
|
64
70
|
end
|
65
71
|
|
66
|
-
opts.on('
|
67
|
-
conf[:
|
72
|
+
opts.on('-p', '--prefix prefix', 'Prefix to append to gem name') do |p|
|
73
|
+
conf[:prefix] = p
|
68
74
|
end
|
69
75
|
|
70
|
-
opts.on('
|
71
|
-
conf[:
|
76
|
+
opts.on('--[no-]devel', 'Include development dependencies') do |d|
|
77
|
+
conf[:devel_deps] = d
|
72
78
|
end
|
73
79
|
|
74
80
|
opts.on('-f', '--[no-]fedora', 'Check fedora for packages') do |f|
|
@@ -80,7 +86,7 @@ optparse = OptionParser.new do |opts|
|
|
80
86
|
end
|
81
87
|
|
82
88
|
opts.on('-k', '--koji [url]', 'Check koji for packages') do |k|
|
83
|
-
conf[:check_koji] = k ||
|
89
|
+
conf[:check_koji] = k || true
|
84
90
|
end
|
85
91
|
|
86
92
|
opts.on('-t', '--koji-tag tag', 'Koji tag to query') do |t|
|
@@ -122,6 +128,9 @@ if conf[:gemfile].nil? &&
|
|
122
128
|
end
|
123
129
|
end
|
124
130
|
|
131
|
+
Polisher::Logging.level = conf[:log_level]
|
132
|
+
Polisher::Config.set
|
133
|
+
|
125
134
|
targets = []
|
126
135
|
targets << Polisher::VersionChecker::GEM_TARGET if conf[:check_gem]
|
127
136
|
targets << Polisher::VersionChecker::KOJI_TARGET if conf[:check_koji]
|
@@ -132,6 +141,13 @@ targets << Polisher::VersionChecker::BODHI_TARGET if conf[:check_bodhi]
|
|
132
141
|
targets = Polisher::VersionChecker::ALL_TARGETS if targets.empty?
|
133
142
|
Polisher::VersionChecker.check targets
|
134
143
|
|
144
|
+
if conf[:check_koji]
|
145
|
+
require 'polisher/koji'
|
146
|
+
Polisher::Koji.koji_url conf[:check_koji] if conf[:koji_url].is_a?(String)
|
147
|
+
Polisher::Koji.koji_tag conf[:koji_tag] if conf[:koji_tag]
|
148
|
+
Polisher::Koji.package_prefix conf[:prefix] if conf[:prefix]
|
149
|
+
end
|
150
|
+
|
135
151
|
@format = conf[:format]
|
136
152
|
|
137
153
|
def format_dep(dep)
|
@@ -164,6 +180,14 @@ def format_tgt(tgt)
|
|
164
180
|
end
|
165
181
|
end
|
166
182
|
|
183
|
+
def format_unknown_tgt(tgt)
|
184
|
+
if @format.nil?
|
185
|
+
"#{tgt.to_s.red.bold}: " + "unknown".yellow
|
186
|
+
else
|
187
|
+
format_tgt("#{tgt} (unknown)")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
167
191
|
def format_tgt_with_versions(tgt, versions)
|
168
192
|
if @format.nil?
|
169
193
|
"#{tgt.to_s.green.bold}: #{versions.join(', ').yellow} "
|
@@ -199,9 +223,12 @@ def print_dep(tgt, dep, versions)
|
|
199
223
|
@last_dep = dep
|
200
224
|
end
|
201
225
|
|
202
|
-
if versions.
|
203
|
-
versions.size == 1 && versions[0].nil?
|
226
|
+
if versions.blank? || (versions.size == 1 && versions.first.blank?)
|
204
227
|
print format_tgt(tgt)
|
228
|
+
|
229
|
+
elsif versions.size == 1 && versions.first == :unknown
|
230
|
+
print format_unknown_tgt(tgt)
|
231
|
+
|
205
232
|
else
|
206
233
|
print format_tgt_with_versions(tgt, versions)
|
207
234
|
end
|
@@ -211,13 +238,15 @@ print_header
|
|
211
238
|
|
212
239
|
if conf[:gemname]
|
213
240
|
gem = Polisher::Gem.retrieve(conf[:gemname])
|
214
|
-
gem.versions(:recursive => true,
|
241
|
+
gem.versions(:recursive => true,
|
242
|
+
:dev_deps => conf[:devel_deps]) do |tgt, dep, versions|
|
215
243
|
print_dep(tgt, dep, versions)
|
216
244
|
end
|
217
245
|
|
218
246
|
elsif conf[:gemspec]
|
219
247
|
gem = Polisher::Gem.from_gemspec(conf[:gemspec])
|
220
|
-
gem.versions(:recursive => true,
|
248
|
+
gem.versions(:recursive => true,
|
249
|
+
:dev_deps => conf[:devel_deps]) do |tgt, dep, versions|
|
221
250
|
print_dep(tgt, dep, versions)
|
222
251
|
end
|
223
252
|
|
@@ -231,7 +260,8 @@ elsif conf[:gemfile]
|
|
231
260
|
exit 1
|
232
261
|
end
|
233
262
|
|
234
|
-
gemfile.dependency_versions
|
263
|
+
gemfile.dependency_versions :recursive => true,
|
264
|
+
:dev_deps => conf[:devel_deps] do |tgt, dep, versions|
|
235
265
|
print_dep(tgt, dep, versions)
|
236
266
|
end
|
237
267
|
end
|
data/bin/git_gem_updater.rb
CHANGED
@@ -11,13 +11,11 @@
|
|
11
11
|
# Copyright (C) 2013-2014 Red Hat, Inc.
|
12
12
|
|
13
13
|
require 'colored'
|
14
|
-
require 'curb'
|
15
|
-
require 'json'
|
16
14
|
require 'optparse'
|
17
|
-
require 'nokogiri'
|
18
15
|
|
19
16
|
require 'polisher/git'
|
20
17
|
require 'polisher/gem'
|
18
|
+
require 'polisher/core'
|
21
19
|
|
22
20
|
ORIG_DIR = Dir.pwd
|
23
21
|
|
@@ -45,9 +43,18 @@ optparse = OptionParser.new do|opts|
|
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
48
|
-
|
46
|
+
optparse.parse!
|
49
47
|
|
50
|
-
|
48
|
+
Polisher::Config.set
|
49
|
+
|
50
|
+
unless conf[:user].nil?
|
51
|
+
begin
|
52
|
+
conf[:gems] += Polisher::Fedora.gems_owned_by(conf[:user])
|
53
|
+
rescue
|
54
|
+
puts "Could not retrieve gems owned by #{conf[:user]}".red
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
end
|
51
58
|
|
52
59
|
if conf[:gems].empty?
|
53
60
|
puts "must specify a gem name or user name!".red
|
@@ -61,7 +68,7 @@ Dir.chdir conf[:dir]
|
|
61
68
|
conf[:gems].each do |gem_name|
|
62
69
|
pkg =
|
63
70
|
begin
|
64
|
-
Polisher::Git::Pkg.new(:name => gem_name).
|
71
|
+
Polisher::Git::Pkg.new(:name => gem_name).fetch
|
65
72
|
rescue => e
|
66
73
|
puts "Problem Cloning Package, Skipping: #{e}"
|
67
74
|
next
|
@@ -71,7 +78,11 @@ conf[:gems].each do |gem_name|
|
|
71
78
|
pkg.update_to(gem)
|
72
79
|
# TODO append gem dependencies to conf[:gems] list
|
73
80
|
|
74
|
-
|
81
|
+
begin
|
82
|
+
pkg.build
|
83
|
+
rescue => e
|
84
|
+
puts "Warning: scratch build failed: #{e}".bold.red
|
85
|
+
end
|
75
86
|
|
76
87
|
unless pkg.spec.has_check?
|
77
88
|
puts "Warning: no %check section in spec, "\
|
data/lib/polisher/bodhi.rb
CHANGED
@@ -5,18 +5,19 @@
|
|
5
5
|
|
6
6
|
# XXX issue w/ retreiving packages from pkgwat causing sporadic issues:
|
7
7
|
# https://github.com/fedora-infra/fedora-packages/issues/55
|
8
|
-
|
9
|
-
# fedora pkgwat provides a frontend to bodhi
|
10
|
-
require 'pkgwat'
|
8
|
+
require 'polisher/component'
|
11
9
|
|
12
10
|
module Polisher
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
# fedora pkgwat provides a frontend to bodhi
|
12
|
+
Component.verify("Bodhi", "pkgwat") do
|
13
|
+
class Bodhi
|
14
|
+
def self.versions_for(name, &bl)
|
15
|
+
versions = Pkgwat.get_updates("rubygem-#{name}", 'all', 'all').
|
16
|
+
select { |update| update['stable_version'] != 'None' }.
|
17
|
+
collect { |update| update['stable_version'] }
|
18
|
+
bl.call(:bodhi, name, versions) unless(bl.nil?)
|
19
|
+
versions
|
20
|
+
end
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Polisher Components & Component Helpers
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2014 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'active_support'
|
7
|
+
require 'active_support/core_ext'
|
8
|
+
|
9
|
+
module Polisher
|
10
|
+
module Component
|
11
|
+
class Missing
|
12
|
+
def initialize(*args)
|
13
|
+
raise "polisher is missing a dependency - cannot instantiate"
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method_id, *args, &bl)
|
17
|
+
raise "polisher is missing a dependency - cannot invoke #{method_id} on #{self}"
|
18
|
+
end
|
19
|
+
end # class MissingComponent
|
20
|
+
|
21
|
+
def self.verify(polisher_klass, *dependencies)
|
22
|
+
all_required = dependencies.all? do |dep|
|
23
|
+
require_dependency(polisher_klass, dep)
|
24
|
+
end
|
25
|
+
|
26
|
+
yield if all_required
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.require_dependency(polisher_klass, dependency)
|
30
|
+
require dependency
|
31
|
+
true
|
32
|
+
rescue LoadError
|
33
|
+
klasses = polisher_klass.split("::")
|
34
|
+
desired_namespace = Polisher
|
35
|
+
|
36
|
+
klasses.each do |k|
|
37
|
+
desired_namespace.const_set(k, Missing) unless desired_namespace.const_defined?(k)
|
38
|
+
desired_namespace = "#{desired_namespace.name}::#{k}".constantize
|
39
|
+
end
|
40
|
+
warn "Failed to require #{dependency}. Added runtime exception in Polisher::#{polisher_klass}"
|
41
|
+
end
|
42
|
+
end # module Component
|
43
|
+
end # module Polisher
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Polisher Config Operations
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'yaml'
|
7
|
+
require 'active_support'
|
8
|
+
require 'active_support/core_ext'
|
9
|
+
|
10
|
+
module Polisher
|
11
|
+
class Config
|
12
|
+
CONF = "#{ENV['HOME']}/.polisher/config"
|
13
|
+
TARGETS = [['koji', 'polisher/koji', 'Koji'],
|
14
|
+
['distgit', 'polisher/git/pkg', 'Git::Pkg'],
|
15
|
+
['rpm', 'polisher/rpm/spec', 'RPM::Requirement'],
|
16
|
+
['tags', 'polisher/tag_mapper', 'TagMapper']]
|
17
|
+
|
18
|
+
def self.opts
|
19
|
+
@opts ||= File.exist?(CONF) ? YAML.load_file(CONF) : {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.set
|
23
|
+
TARGETS.each do |target, req, polisher_class|
|
24
|
+
if opts[target]
|
25
|
+
require req
|
26
|
+
target_class = "Polisher::#{polisher_class}".constantize
|
27
|
+
opts[target].each { |k, v| target_class.send(k.intern, v) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end # class Config
|
32
|
+
end # module Polisher
|
data/lib/polisher/core.rb
CHANGED
@@ -3,38 +3,58 @@
|
|
3
3
|
# Licensed under the MIT license
|
4
4
|
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
5
|
|
6
|
+
require 'polisher/config'
|
7
|
+
|
6
8
|
module ConfHelpers
|
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
|
-
|
9
|
+
module ClassMethods
|
10
|
+
# Defines a 'config attribute' or attribute on the class
|
11
|
+
# which this is defined in. Accessors to the single shared
|
12
|
+
# attribute will be added to the class as well as instances
|
13
|
+
# of the class. Specify the default value with the attr name
|
14
|
+
# or via an env variable
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# class Custom
|
18
|
+
# extend ConfHelpers
|
19
|
+
# conf_attr :data_dir, '/etc/'
|
20
|
+
# end
|
21
|
+
# Custom.data_dir # => '/etc/'
|
22
|
+
# ENV['POLISHER_DATA_DIR'] = '/usr/'
|
23
|
+
# Custom.data_dir # => '/usr/'
|
24
|
+
# Custom.data_dir == Custom.new.data_dir # => true
|
25
|
+
#
|
26
|
+
def conf_attr(name, default=nil)
|
27
|
+
self.send(:define_singleton_method, name) do |*args|
|
28
|
+
nvar = "@#{name}".intern
|
29
|
+
current = self.instance_variable_get(nvar)
|
30
|
+
envk = "POLISHER_#{name.to_s.upcase}"
|
31
|
+
instance_variable_set(nvar, default) unless current
|
32
|
+
instance_variable_set(nvar, ENV[envk]) if ENV.key?(envk)
|
33
|
+
# TODO also allow vars to be able to be set from a conf file
|
34
|
+
self.instance_variable_set(nvar, args.first) unless args.empty?
|
35
|
+
self.instance_variable_get(nvar)
|
36
|
+
end
|
37
|
+
|
38
|
+
self.send(:define_method, name) do
|
39
|
+
self.class.send(name)
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
|
-
|
36
|
-
|
43
|
+
def cmd_available?(cmd)
|
44
|
+
File.exist?(cmd) && File.executable?(cmd)
|
37
45
|
end
|
46
|
+
|
47
|
+
def require_cmd!(cmd)
|
48
|
+
raise "command #{cmd} not available" unless cmd_available?(cmd)
|
49
|
+
end # module ClassMethods
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.included(base)
|
53
|
+
base.extend(ClassMethods)
|
54
|
+
end
|
55
|
+
|
56
|
+
def require_cmd!(cmd)
|
57
|
+
self.class.require_cmd!(cmd)
|
38
58
|
end
|
39
59
|
end
|
40
60
|
|
@@ -59,10 +79,10 @@ class String
|
|
59
79
|
# simply be removed
|
60
80
|
def unrpmize
|
61
81
|
require 'polisher/rpm/spec'
|
62
|
-
|
63
|
-
|
64
|
-
f =
|
65
|
-
f =
|
82
|
+
matchers = Polisher::RPM::Spec::FILE_MACRO_MATCHERS
|
83
|
+
replacements = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS
|
84
|
+
f = matchers.inject(self) { |file, matcher| file.gsub(matcher, '') }
|
85
|
+
f = replacements.keys.inject(f) { |file, r| file.gsub(Regexp.new(r), replacements[r]) }
|
66
86
|
f
|
67
87
|
end
|
68
88
|
|
@@ -70,7 +90,12 @@ class String
|
|
70
90
|
# with their macro correspondences
|
71
91
|
def rpmize
|
72
92
|
require 'polisher/rpm/spec'
|
73
|
-
|
74
|
-
|
93
|
+
matchers = Polisher::RPM::Spec::FILE_MACRO_MATCHERS
|
94
|
+
replacements = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS.invert
|
95
|
+
f = replacements.keys.inject(self) { |file, r| file.gsub(r, replacements[r]) }
|
96
|
+
|
97
|
+
special = (matchers + replacements.values).any? { |matcher| f =~ /^#{matcher}.*/ }
|
98
|
+
f = special ? f : "%{gem_instdir}/#{f}"
|
99
|
+
f
|
75
100
|
end
|
76
101
|
end
|