polisher 0.4 → 0.5.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 +7 -0
- data/LICENSE +20 -661
- data/README.md +39 -0
- data/Rakefile +11 -88
- data/bin/binary_gem_resolver.rb +95 -0
- data/bin/gem_dependency_checker.rb +165 -0
- data/bin/git_gem_updater.rb +86 -0
- data/bin/ruby_rpm_spec_updater.rb +29 -0
- data/lib/polisher.rb +19 -0
- data/lib/polisher/apt.rb +12 -0
- data/lib/polisher/bodhi.rb +21 -0
- data/lib/polisher/bugzilla.rb +9 -0
- data/lib/polisher/core.rb +33 -0
- data/lib/polisher/errata.rb +43 -0
- data/lib/polisher/fedora.rb +43 -0
- data/lib/polisher/gem.rb +155 -0
- data/lib/polisher/gemfile.rb +72 -0
- data/lib/polisher/gemspec.rb +32 -0
- data/lib/polisher/git.rb +135 -0
- data/lib/polisher/koji.rb +54 -0
- data/lib/polisher/rhn.rb +14 -0
- data/lib/polisher/rpmspec.rb +254 -0
- data/lib/polisher/upstream.rb +29 -0
- data/lib/polisher/vendor.rb +9 -0
- data/lib/polisher/version_checker.rb +100 -0
- data/lib/polisher/yum.rb +28 -0
- data/spec/core_spec.rb +64 -0
- data/spec/fedora_spec.rb +14 -0
- data/spec/gem_spec.rb +82 -0
- data/spec/gemfile_spec.rb +45 -0
- data/spec/git_spec.rb +74 -0
- data/spec/rpmspec_spec.rb +105 -0
- data/spec/spec_helper.rb +50 -37
- data/spec/upstream_spec.rb +39 -0
- metadata +173 -179
- data/COPYING +0 -8
- data/README.rdoc +0 -105
- data/TODO +0 -7
- data/bin/server +0 -4
- data/config.ru +0 -25
- data/config/database.yml +0 -13
- data/config/polisher.yml +0 -5
- data/db/connection.rb +0 -52
- data/db/migrations/001_create_projects.rb +0 -23
- data/db/migrations/002_create_sources.rb +0 -25
- data/db/migrations/003_create_project_source_versions.rb +0 -28
- data/db/migrations/004_create_events.rb +0 -27
- data/db/migrations/005_create_project_dependencies.rb +0 -28
- data/db/models/event.rb +0 -87
- data/db/models/project.rb +0 -110
- data/db/models/project_dependency.rb +0 -27
- data/db/models/project_source_version.rb +0 -31
- data/db/models/source.rb +0 -101
- data/lib/common.rb +0 -71
- data/lib/dsl.rb +0 -292
- data/lib/event_handlers.rb +0 -166
- data/lib/gem_adapter.rb +0 -94
- data/lib/sinatra/url_for.rb +0 -40
- data/polisher.rb +0 -372
- data/public/stylesheets/style.css +0 -67
- data/spec/common_spec.rb +0 -28
- data/spec/dsl_spec.rb +0 -357
- data/spec/event_handlers_spec.rb +0 -300
- data/spec/gem_adapter_spec.rb +0 -89
- data/spec/models_spec.rb +0 -721
- data/spec/polisher_spec.rb +0 -573
- data/views/layout.haml +0 -22
- data/views/projects/index.haml +0 -42
- data/views/projects/index.html.haml +0 -38
- data/views/result.haml +0 -9
- data/views/sources/index.haml +0 -24
- data/views/sources/index.html.haml +0 -26
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Ruby RPM Spec Updater
|
3
|
+
#
|
4
|
+
# Simple tool to update the rpm spec of a packaged gem
|
5
|
+
# or ruby app.
|
6
|
+
#
|
7
|
+
# User should specify the location of the rpm spec to
|
8
|
+
# manipulate. Script takes an additional option to specify
|
9
|
+
# the version of the gem to update to or the location of
|
10
|
+
# the gem/gemspec/gemfile source which parse and use.
|
11
|
+
#
|
12
|
+
# Usage:
|
13
|
+
# ruby_rpm_spec_updater.rb <path-to-spec> <optional-source-or-version>
|
14
|
+
#
|
15
|
+
# Licensed under the MIT License
|
16
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
17
|
+
|
18
|
+
require 'colored'
|
19
|
+
require 'polisher'
|
20
|
+
|
21
|
+
spec_file = ARGV.shift
|
22
|
+
source = ARGV.shift
|
23
|
+
rpmspec = Polisher::RPMSpec.parse File.read(spec_file)
|
24
|
+
source = source.nil? ?
|
25
|
+
Polisher::Gem.retrieve(rpmspec.gem_name) :
|
26
|
+
Polisher::Upstream.parse(source)
|
27
|
+
|
28
|
+
rpmspec.update_to(source)
|
29
|
+
puts rpmspec.to_string.yellow.bold
|
data/lib/polisher.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Ruby Polisher
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'polisher/core'
|
7
|
+
require 'polisher/rpmspec'
|
8
|
+
require 'polisher/gem'
|
9
|
+
require 'polisher/upstream'
|
10
|
+
require 'polisher/gemfile'
|
11
|
+
require 'polisher/git'
|
12
|
+
require 'polisher/apt'
|
13
|
+
require 'polisher/yum'
|
14
|
+
require 'polisher/bodhi'
|
15
|
+
require 'polisher/rhn'
|
16
|
+
require 'polisher/bugzilla'
|
17
|
+
require 'polisher/koji'
|
18
|
+
require 'polisher/fedora'
|
19
|
+
require 'polisher/version_checker'
|
data/lib/polisher/apt.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Polisher Bodhi Operations
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'pkgwat'
|
7
|
+
|
8
|
+
module Polisher
|
9
|
+
class Bodhi
|
10
|
+
def self.versions_for(name, &bl)
|
11
|
+
# fedora pkgwat provides a frontend to bodhi
|
12
|
+
updates = Pkgwat.get_updates("rubygem-#{name}", 'all', 'all') # TODO set timeout
|
13
|
+
updates.reject! { |u|
|
14
|
+
u['stable_version'] == 'None' && u['testing_version'] == "None"
|
15
|
+
}
|
16
|
+
versions = updates.collect { |u| u['stable_version'] }
|
17
|
+
bl.call(:bodhi, name, versions) unless(bl.nil?)
|
18
|
+
versions
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Polisher Core Ruby Extensions
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'polisher/rpmspec'
|
7
|
+
|
8
|
+
class String
|
9
|
+
def gem?
|
10
|
+
File.extname(self) == ".gem"
|
11
|
+
end
|
12
|
+
|
13
|
+
def gemspec?
|
14
|
+
File.extname(self) == ".gemspec"
|
15
|
+
end
|
16
|
+
|
17
|
+
def gemfile?
|
18
|
+
File.basename(self) == "Gemfile"
|
19
|
+
end
|
20
|
+
|
21
|
+
def unrpmize
|
22
|
+
fmm = Polisher::RPMSpec::FILE_MACRO_MATCHERS
|
23
|
+
fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS
|
24
|
+
f = fmm.inject(self) { |file, matcher| file.gsub(matcher, '') }
|
25
|
+
f = fmr.keys.inject(f) { |file, r| file.gsub(Regexp.new(r), fmr[r]) }
|
26
|
+
f
|
27
|
+
end
|
28
|
+
|
29
|
+
def rpmize
|
30
|
+
fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS.invert
|
31
|
+
fmr.keys.inject(self) { |file, r| file.gsub(r, fmr[r]) }
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Polisher Errata Operations
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'curb'
|
7
|
+
|
8
|
+
module Polisher
|
9
|
+
class Errata
|
10
|
+
def self.client(url)
|
11
|
+
@curl ||= begin
|
12
|
+
c = Curl::Easy.new
|
13
|
+
c.ssl_verify_peer = false
|
14
|
+
c.ssl_verify_host = false
|
15
|
+
c.http_auth_types = :negotiate
|
16
|
+
c.userpwd = ':'
|
17
|
+
c.get
|
18
|
+
end
|
19
|
+
|
20
|
+
@curl.url = url
|
21
|
+
@curl
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.versions_for(advisory_url, name, &bl)
|
25
|
+
url = "#{advisory_url}/builds"
|
26
|
+
result = self.client(url).get
|
27
|
+
json = JSON.parse result.body_str
|
28
|
+
versions =
|
29
|
+
json.collect { |tag, builds|
|
30
|
+
builds.collect { |build|
|
31
|
+
pkg,meta = *build.flatten
|
32
|
+
if pkg =~ /^rubygem-#{name}-([^-]*)-.*$/
|
33
|
+
$1
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
}
|
38
|
+
}.flatten.compact
|
39
|
+
bl.call(:errata, name, versions) unless(bl.nil?)
|
40
|
+
versions
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Polisher Fedora Operations
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'curb'
|
7
|
+
require 'pkgwat'
|
8
|
+
|
9
|
+
module Polisher
|
10
|
+
class Fedora
|
11
|
+
PACKAGE_LIST = 'https://admin.fedoraproject.org/pkgdb/users/packages/'
|
12
|
+
|
13
|
+
# Retrieve list of gems owned by the specified user
|
14
|
+
#
|
15
|
+
# @param [String] user Fedora username to lookup
|
16
|
+
# @return [Array<String>] list of gems which the user owns/has access to
|
17
|
+
def self.gems_owned_by(user)
|
18
|
+
curl = Curl::Easy.new("#{PACKAGE_LIST}}#{user}")
|
19
|
+
curl.http_get
|
20
|
+
packages = curl.body_str
|
21
|
+
# TODO instantiate Polisher::Gem instances & return
|
22
|
+
Nokogiri::HTML(packages).xpath("//a[@class='PackageName']").
|
23
|
+
select { |i| i.text =~ /rubygem-.*/ }.
|
24
|
+
collect { |i| i.text.gsub(/rubygem-/, '') }
|
25
|
+
end
|
26
|
+
|
27
|
+
# Retrieve list of the versions of the specified package in the various
|
28
|
+
# Fedora releases.
|
29
|
+
#
|
30
|
+
# @param [String] name name of the package to lookup
|
31
|
+
# @param [Callable] bl optional callback to invoke with versions retrieved
|
32
|
+
# @return [Array<String>] list of versions in Fedora
|
33
|
+
def self.versions_for(name, &bl)
|
34
|
+
# XXX bug w/ python-pkgwat, some html content
|
35
|
+
# is being returned w/ versions, need to look into
|
36
|
+
versions = Pkgwat.get_versions(name)
|
37
|
+
versions.reject! { |pkg| pkg['stable_version'] == "None" }
|
38
|
+
versions = versions.collect { |pkg| pkg['stable_version'] }
|
39
|
+
bl.call(:fedora, name, versions) unless(bl.nil?)
|
40
|
+
versions
|
41
|
+
end
|
42
|
+
end # class Fedora
|
43
|
+
end # module Polisher
|
data/lib/polisher/gem.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
# Polisher Gem Represenation
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'curb'
|
7
|
+
require 'json'
|
8
|
+
require 'tempfile'
|
9
|
+
require 'pathname'
|
10
|
+
require 'rubygems/installer'
|
11
|
+
require 'active_support/core_ext'
|
12
|
+
|
13
|
+
require 'polisher/version_checker'
|
14
|
+
|
15
|
+
module Polisher
|
16
|
+
class Gem
|
17
|
+
attr_accessor :name
|
18
|
+
attr_accessor :version
|
19
|
+
attr_accessor :deps
|
20
|
+
attr_accessor :dev_deps
|
21
|
+
attr_accessor :files
|
22
|
+
|
23
|
+
def initialize(args={})
|
24
|
+
@name = args[:name]
|
25
|
+
@version = args[:version]
|
26
|
+
@deps = args[:deps] || []
|
27
|
+
@dev_deps = args[:dev_deps] || []
|
28
|
+
@files = args[:files] || []
|
29
|
+
end
|
30
|
+
|
31
|
+
# Retrieve list of the versions of the specified gem installed locally
|
32
|
+
#
|
33
|
+
# @param [String] name name of the gem to lookup
|
34
|
+
# @param [Callable] bl optional block to invoke with versions retrieved
|
35
|
+
# @return [Array<String>] list of versions of gem installed locally
|
36
|
+
def self.local_versions_for(name, &bl)
|
37
|
+
@local_db ||= ::Gem::Specification.all
|
38
|
+
versions = @local_db.select { |s| s.name == name }.collect { |s| s.version }
|
39
|
+
bl.call(:local_gem, name, versions) unless(bl.nil?)
|
40
|
+
versions
|
41
|
+
end
|
42
|
+
|
43
|
+
# Parse the specified gemspec & return new Gem instance from metadata
|
44
|
+
#
|
45
|
+
# @param [String,Hash] args contents of actual gemspec of option hash
|
46
|
+
# specifying location of gemspec to parse
|
47
|
+
# @option args [String] :gemspec path to gemspec to load / parse
|
48
|
+
# @return [Polisher::Gem] gem instantiated from gemspec metadata
|
49
|
+
def self.parse(args={})
|
50
|
+
metadata = {}
|
51
|
+
|
52
|
+
if args.is_a?(String)
|
53
|
+
specj = JSON.parse(args)
|
54
|
+
metadata[:name] = specj['name']
|
55
|
+
metadata[:version] = specj['version']
|
56
|
+
metadata[:deps] = specj['dependencies']['runtime'].collect { |d| d['name'] }
|
57
|
+
metadata[:dev_deps] = specj['dependencies']['development'].collect { |d| d['name'] }
|
58
|
+
|
59
|
+
elsif args.has_key?(:gemspec)
|
60
|
+
gemspec = ::Gem::Specification.load(args[:gemspec])
|
61
|
+
metadata[:name] = gemspec.name
|
62
|
+
metadata[:version] = gemspec.version.to_s
|
63
|
+
metadata[:deps] =
|
64
|
+
gemspec.dependencies.select { |dep| dep.type == :runtime }.collect { |dep| dep.name }
|
65
|
+
metadata[:dev_deps] =
|
66
|
+
gemspec.dependencies.select { |dep| dep.type == :development }.collect { |dep| dep.name }
|
67
|
+
|
68
|
+
elsif args.has_key?(:gem)
|
69
|
+
# TODO
|
70
|
+
end
|
71
|
+
|
72
|
+
self.new metadata
|
73
|
+
end
|
74
|
+
|
75
|
+
# Download the gem and return the binary file contents as a string
|
76
|
+
# @return [String] binary gem contents
|
77
|
+
def download_gem
|
78
|
+
gem_path = "https://rubygems.org/gems/#{@name}-#{@version}.gem"
|
79
|
+
curl = Curl::Easy.new(gem_path)
|
80
|
+
curl.follow_location = true
|
81
|
+
curl.http_get
|
82
|
+
gemf = curl.body_str
|
83
|
+
end
|
84
|
+
|
85
|
+
# Retrieve the list of files in the gem
|
86
|
+
#
|
87
|
+
# @return [Array<String>] list of files in the gem
|
88
|
+
def refresh_files
|
89
|
+
gemf = download_gem
|
90
|
+
tgem = Tempfile.new(@name)
|
91
|
+
tgem.write gemf
|
92
|
+
tgem.close
|
93
|
+
|
94
|
+
@files = []
|
95
|
+
pkg = ::Gem::Installer.new tgem.path, :unpack => true
|
96
|
+
Dir.mktmpdir { |dir|
|
97
|
+
pkg.unpack dir
|
98
|
+
Pathname(dir).find do |path|
|
99
|
+
pathstr = path.to_s.gsub(dir, '')
|
100
|
+
@files << pathstr unless pathstr.blank?
|
101
|
+
end
|
102
|
+
}
|
103
|
+
@files
|
104
|
+
end
|
105
|
+
|
106
|
+
# Retrieve gem metadata and contents from rubygems.org
|
107
|
+
#
|
108
|
+
# @param [String] name string name of gem to retrieve
|
109
|
+
# @return [Polisher::Gem] representation of gem
|
110
|
+
def self.retrieve(name)
|
111
|
+
gem_json_path = "https://rubygems.org/api/v1/gems/#{name}.json"
|
112
|
+
spec = Curl::Easy.http_get(gem_json_path).body_str
|
113
|
+
gem = self.parse spec
|
114
|
+
gem.refresh_files
|
115
|
+
gem
|
116
|
+
end
|
117
|
+
|
118
|
+
# Retreive versions of gem available on rubygems.org
|
119
|
+
#
|
120
|
+
# @param [Hash] args hash of options to configure retrieval
|
121
|
+
# @option args [Boolean] :recursive indicates if versions of dependencies
|
122
|
+
# should also be retrieved
|
123
|
+
# @option args [Boolean] :dev_deps indicates if versions of development
|
124
|
+
# dependencies should also be retrieved
|
125
|
+
# @return [Hash<name,versions>] hash of name to list of versions for gem
|
126
|
+
# (and dependencies if specified)
|
127
|
+
def versions(args={}, &bl)
|
128
|
+
recursive = args[:recursive]
|
129
|
+
dev_deps = args[:dev_deps]
|
130
|
+
|
131
|
+
versions = args[:versions] || {}
|
132
|
+
versions.merge!({ self.name => Polisher::VersionChecker.versions_for(self.name, &bl) })
|
133
|
+
args[:versions] = versions
|
134
|
+
|
135
|
+
if recursive
|
136
|
+
self.deps.each { |dep|
|
137
|
+
unless versions.has_key?(dep)
|
138
|
+
gem = Polisher::Gem.retrieve(dep)
|
139
|
+
versions.merge! gem.versions(args, &bl)
|
140
|
+
end
|
141
|
+
}
|
142
|
+
|
143
|
+
if dev_deps
|
144
|
+
self.dev_deps.each { |dep|
|
145
|
+
unless versions.has_key?(dep)
|
146
|
+
gem = Polisher::Gem.retrieve(dep)
|
147
|
+
versions.merge! gem.versions(args, &bl)
|
148
|
+
end
|
149
|
+
}
|
150
|
+
end
|
151
|
+
end
|
152
|
+
versions
|
153
|
+
end
|
154
|
+
end # class Gem
|
155
|
+
end # module Polisher
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Polisher Gemfile Represenation
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2013 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'bundler'
|
7
|
+
|
8
|
+
require 'polisher/version_checker'
|
9
|
+
|
10
|
+
# Override bundler's gem registration
|
11
|
+
module Bundler
|
12
|
+
class << self
|
13
|
+
attr_accessor :bundler_gems
|
14
|
+
|
15
|
+
def init_gems
|
16
|
+
Bundler.bundler_gems = []
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Dsl
|
21
|
+
alias :old_gem :gem
|
22
|
+
def gem(name, *args)
|
23
|
+
Bundler.bundler_gems ||= []
|
24
|
+
version = args.first.is_a?(Hash) ? nil : args.first
|
25
|
+
Bundler.bundler_gems << [name, version]
|
26
|
+
old_gem(name, *args)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module Polisher
|
32
|
+
class Gemfile
|
33
|
+
include VersionedDependencies
|
34
|
+
|
35
|
+
# always nil, for interface compatability
|
36
|
+
attr_accessor :version
|
37
|
+
|
38
|
+
attr_accessor :deps
|
39
|
+
attr_accessor :dev_deps
|
40
|
+
|
41
|
+
# always empty array, for interface compatability
|
42
|
+
attr_accessor :files
|
43
|
+
|
44
|
+
def initialize(args={})
|
45
|
+
@version = nil
|
46
|
+
@deps = args[:deps]
|
47
|
+
@dev_deps = args[:dev_deps]
|
48
|
+
@files = []
|
49
|
+
end
|
50
|
+
|
51
|
+
# Parse the specified gemfile & return new Gemfile instance from metadata
|
52
|
+
#
|
53
|
+
# @param [String] path to gemfile to parse
|
54
|
+
# @return [Polisher::Gemfile] gemfile instantiated from parsed metadata
|
55
|
+
def self.parse(path)
|
56
|
+
path,g = File.split(path)
|
57
|
+
Dir.chdir(path){
|
58
|
+
Bundler.init_gems
|
59
|
+
begin
|
60
|
+
Bundler::Definition.build(g, nil, false)
|
61
|
+
rescue Bundler::GemfileNotFound
|
62
|
+
raise ArgumentError, "invalid gemfile: #{path}"
|
63
|
+
end
|
64
|
+
}
|
65
|
+
metadata = {}
|
66
|
+
metadata[:deps] = Bundler.bundler_gems.collect { |n,v| n }
|
67
|
+
metadata[:dev_deps] = [] # TODO
|
68
|
+
|
69
|
+
self.new metadata
|
70
|
+
end
|
71
|
+
end # class Gemfile
|
72
|
+
end # module Polisher
|