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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -661
  3. data/README.md +39 -0
  4. data/Rakefile +11 -88
  5. data/bin/binary_gem_resolver.rb +95 -0
  6. data/bin/gem_dependency_checker.rb +165 -0
  7. data/bin/git_gem_updater.rb +86 -0
  8. data/bin/ruby_rpm_spec_updater.rb +29 -0
  9. data/lib/polisher.rb +19 -0
  10. data/lib/polisher/apt.rb +12 -0
  11. data/lib/polisher/bodhi.rb +21 -0
  12. data/lib/polisher/bugzilla.rb +9 -0
  13. data/lib/polisher/core.rb +33 -0
  14. data/lib/polisher/errata.rb +43 -0
  15. data/lib/polisher/fedora.rb +43 -0
  16. data/lib/polisher/gem.rb +155 -0
  17. data/lib/polisher/gemfile.rb +72 -0
  18. data/lib/polisher/gemspec.rb +32 -0
  19. data/lib/polisher/git.rb +135 -0
  20. data/lib/polisher/koji.rb +54 -0
  21. data/lib/polisher/rhn.rb +14 -0
  22. data/lib/polisher/rpmspec.rb +254 -0
  23. data/lib/polisher/upstream.rb +29 -0
  24. data/lib/polisher/vendor.rb +9 -0
  25. data/lib/polisher/version_checker.rb +100 -0
  26. data/lib/polisher/yum.rb +28 -0
  27. data/spec/core_spec.rb +64 -0
  28. data/spec/fedora_spec.rb +14 -0
  29. data/spec/gem_spec.rb +82 -0
  30. data/spec/gemfile_spec.rb +45 -0
  31. data/spec/git_spec.rb +74 -0
  32. data/spec/rpmspec_spec.rb +105 -0
  33. data/spec/spec_helper.rb +50 -37
  34. data/spec/upstream_spec.rb +39 -0
  35. metadata +173 -179
  36. data/COPYING +0 -8
  37. data/README.rdoc +0 -105
  38. data/TODO +0 -7
  39. data/bin/server +0 -4
  40. data/config.ru +0 -25
  41. data/config/database.yml +0 -13
  42. data/config/polisher.yml +0 -5
  43. data/db/connection.rb +0 -52
  44. data/db/migrations/001_create_projects.rb +0 -23
  45. data/db/migrations/002_create_sources.rb +0 -25
  46. data/db/migrations/003_create_project_source_versions.rb +0 -28
  47. data/db/migrations/004_create_events.rb +0 -27
  48. data/db/migrations/005_create_project_dependencies.rb +0 -28
  49. data/db/models/event.rb +0 -87
  50. data/db/models/project.rb +0 -110
  51. data/db/models/project_dependency.rb +0 -27
  52. data/db/models/project_source_version.rb +0 -31
  53. data/db/models/source.rb +0 -101
  54. data/lib/common.rb +0 -71
  55. data/lib/dsl.rb +0 -292
  56. data/lib/event_handlers.rb +0 -166
  57. data/lib/gem_adapter.rb +0 -94
  58. data/lib/sinatra/url_for.rb +0 -40
  59. data/polisher.rb +0 -372
  60. data/public/stylesheets/style.css +0 -67
  61. data/spec/common_spec.rb +0 -28
  62. data/spec/dsl_spec.rb +0 -357
  63. data/spec/event_handlers_spec.rb +0 -300
  64. data/spec/gem_adapter_spec.rb +0 -89
  65. data/spec/models_spec.rb +0 -721
  66. data/spec/polisher_spec.rb +0 -573
  67. data/views/layout.haml +0 -22
  68. data/views/projects/index.haml +0 -42
  69. data/views/projects/index.html.haml +0 -38
  70. data/views/result.haml +0 -9
  71. data/views/sources/index.haml +0 -24
  72. data/views/sources/index.html.haml +0 -26
@@ -0,0 +1,39 @@
1
+ Polisher
2
+ ======================
3
+ Ruby Post-Publishing Processor - Polish your Ruby projects with ease!
4
+
5
+ <pre>
6
+ .77 7.
7
+ +$ =~
8
+ +?ZZZII .Z$$$$$$
9
+ $~~:,.$Z $~~:,.7
10
+ ?~:,, .......................................redmine...............=~:,,.
11
+ ~::,..rails.......................................................~~:,.
12
+ ~~:,, .........rack................json...........................=~:,,
13
+ =~::,.....................sass............activerecord..............~::,.
14
+ ~~:,.=....eruby...................................................~~:,.~
15
+ +~:,,.................haml......................eventmachine.......?~::,.
16
+ ~::,. ........................rspec................................~~:,.:
17
+ =~:,,:.........................................bundler.............~~:,,
18
+ ~I7I..........rvm..................rake...........................,~7?II
19
+ $$$$$$$O $$$$$$$$
20
+ .ZO7Z, .+ZIZ.
21
+ 7 7
22
+ $I ZI
23
+ </pre>
24
+
25
+ Polisher is a Ruby module and set of utilities aimed to assisting the post-publishing
26
+ packaging process for Ruby gems and applications.
27
+
28
+ Provided are a series of tools geared towards querying rubygems.org and other upstream
29
+ ruby sources for metadata as well as downstream sources such as the Fedora and Debian
30
+ distributions to cross reference various supported stacks vendored by each.
31
+
32
+ Also prodivided are tools to integrate and hook into various build and install workflows
33
+ used by both upstream and downstream developers to synergize operations and streamline
34
+ the packaging and support process.
35
+
36
+ The project is still in its early / conceptual stages, and all are welcome to assist
37
+ shaping its direction. See documentation and spec suite for specific usage.
38
+
39
+ Polisher is Licensed under the MIT License, Copyright (C) 2013 Red Hat, Inc.
data/Rakefile CHANGED
@@ -1,94 +1,17 @@
1
- # polisher project Rakefile
1
+ # Polisher Project Rakefile
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013 Red Hat, Inc.
2
5
 
3
- require 'lib/common'
4
- require 'db/connection'
5
- require 'rake/rdoctask'
6
- require 'spec/rake/spectask'
7
- require 'rake/gempackagetask'
8
-
9
- #task :default => :test
10
-
11
- env = ENV['RACK_ENV']
12
- env ||= 'development'
13
-
14
- logger = Logger.new(STDOUT)
15
-
16
- GEM_NAME='polisher'
17
- PKG_VERSION='0.4'
18
-
19
- namespace :db do
20
- desc "Migrate the database"
21
- task :migrate do
22
- Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
23
- Polisher::DB.migrate './db/migrations'
24
- end
25
-
26
- desc "Rollback the database"
27
- task :rollback do
28
- Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
29
- Polisher::DB.rollback './db/migrations'
30
- end
31
-
32
- desc "Drop all tables in the database"
33
- task :drop_tables do
34
- Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
35
- Polisher::DB.drop_tables './db/migrations'
36
- end
37
- end
38
-
39
- task 'test_env' do
40
- env = 'test'
41
- create_missing_polisher_dirs(:artifacts_dir => 'spec/artifacts', :db_data_dir => 'db/data', :log_dir => 'log')
42
- end
6
+ require "rspec/core/rake_task"
43
7
 
44
8
  desc "Run all specs"
45
- Spec::Rake::SpecTask.new('spec' => ['test_env', 'db:drop_tables', 'db:migrate']) do |t|
46
- t.spec_files = FileList['spec/*_spec.rb']
47
- end
48
-
49
- Rake::RDocTask.new do |rd|
50
- rd.main = "README.rdoc"
51
- rd.rdoc_dir = "doc/site/api"
52
- rd.rdoc_files.include("README.rdoc", "polisher.rb", "db/models/*.rb", "lib/**/*.rb")
53
- end
54
-
55
- PKG_FILES = FileList['bin/*', 'config/*.yml', 'config.ru', 'COPYING',
56
- 'db/**/*.rb', 'lib/**/*.rb', 'LICENSE', 'polisher.rb', 'public/**/*', 'Rakefile',
57
- 'README.rdoc', 'spec/**/*.rb', 'TODO', 'views/**/*.haml']
58
-
59
- DIST_FILES = FileList[
60
- "pkg/*.tgz", "pkg/*.gem"
61
- ]
62
-
63
- SPEC = Gem::Specification.new do |s|
64
- s.name = GEM_NAME
65
- s.version = PKG_VERSION
66
- s.files = PKG_FILES
67
-
68
- s.required_ruby_version = '>= 1.8.1'
69
- s.required_rubygems_version = Gem::Requirement.new(">= 1.3.3")
70
-
71
- s.add_dependency('sinatra', '>= 0.9.4')
72
- s.add_dependency('thin', '>= 1.2.7')
73
- s.add_dependency('activerecord', '>= 2.3.5')
74
- s.add_dependency('haml', '>= 2.2.20')
75
- s.add_dependency('curb', '>= 0.6.7') # eg curl
76
- s.add_dependency('libxml-ruby', '>= 1.1.3')
77
- s.add_dependency('rest-client', '>= 1.4.2')
78
- s.add_dependency('json_pure', '>= 1.2.0')
79
- s.add_dependency('gem2rpm', '>= 0.6.0')
80
- s.add_dependency('rspec', '>= 1.3.0')
81
- s.add_dependency('rack-test', '>= 0.5.3')
82
-
83
- s.author = "Mohammed Morsi"
84
- s.email = "mmorsi@redhat.com"
85
- s.date = %q{2010-03-11}
86
- s.summary = "A project release management tool"
87
- s.description = "Polisher provides simple REST and DSL interfaces allowing you to configure event workflows to be invoked on specific versions of project/source releases"
88
- s.homepage = "http://github.com/movitto/polisher"
9
+ RSpec::Core::RakeTask.new(:spec) do |spec|
10
+ spec.pattern = 'specs/**/*_spec.rb'
11
+ spec.rspec_opts = ['--backtrace', '-fd', '-c']
89
12
  end
90
13
 
91
- Rake::GemPackageTask.new(SPEC) do |pkg|
92
- pkg.need_tar = true
93
- pkg.need_zip = true
14
+ desc "build the polisher gem"
15
+ task :build do
16
+ system "gem build polisher.gemspec"
94
17
  end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/ruby
2
+ # binary gem resolver
3
+ #
4
+ # Looks up missing binary dependencies required by ruby packages via
5
+ # various backends (currently yum, more to be added)
6
+ #
7
+ # gem install packages as normal. If any fail due to missing requirements,
8
+ # run this script w/ the location of the failed install like so:
9
+ #
10
+ # ./binary_gem_resolver.rb <path-to-gem-install>
11
+ #
12
+ # Licensed under the MIT license
13
+ # Copyright (C) 2013 Red Hat, Inc.
14
+ ###########################################################
15
+
16
+ require 'colored'
17
+
18
+ # retrieve extconf.rb for gem at specified path in filesystem
19
+ gem_dir = ARGV.shift
20
+ extconf = nil
21
+
22
+ require 'find'
23
+ Find.find(gem_dir) do |path|
24
+ if path =~ /.*extconf.rb/
25
+ extconf = File.expand_path path
26
+ break
27
+ end
28
+ end
29
+
30
+ if extconf.nil?
31
+ puts "extconf could not be found".red.bold
32
+ exit 1
33
+ end
34
+
35
+ # helper to lookup missing headers / print packages that satisfy them
36
+ def lookup_missing(header)
37
+ puts 'looking up... (may take a few minutes)'.yellow
38
+ matches = []
39
+ `yum provides */usr/include/#{header}`.each_line { |l|
40
+ if l =~ /(.*)\.fc.*/
41
+ matches << $1
42
+ end
43
+ }
44
+ puts "packages which provide header:\n#{matches.join("\n")}".yellow.bold
45
+ end
46
+
47
+ #############################################################
48
+
49
+ # require/override mkmf methods
50
+ require 'mkmf'
51
+
52
+ alias :_cpp_command :cpp_command
53
+ def cpp_command(outfile="", opt)
54
+ ""
55
+ end
56
+
57
+ alias :_have_library :have_library
58
+ def have_library(lib, func = nil, headers = nil, &b)
59
+ _have_library(lib, func, headers, &b)
60
+ end
61
+
62
+ alias :_find_library :find_library
63
+ def find_library(lib, func, *paths, &b)
64
+ _find_library(lib, func, *paths, &b)
65
+ end
66
+
67
+ alias :_have_func :have_func
68
+ def have_func(func, headers = nil, &b)
69
+ _have_func(func, headers, &b)
70
+
71
+ rescue => e
72
+ puts "missing func #{func}".red.bold
73
+ end
74
+
75
+ alias :_hav_header :have_header
76
+ def have_header(header, preheaders = nil, &b)
77
+ _have_header(header, preheaders, &b)
78
+
79
+ rescue => e
80
+ puts "missing header #{header}".red.bold
81
+ lookup_missing(header)
82
+ end
83
+
84
+ # other mkmf methods which may be overridden
85
+ #def find_header(header, *paths)
86
+ #def have_var(var, headers = nil, &b)
87
+ #def try_type(type, headers = nil, opt = "", &b)
88
+ #def have_type(type, headers = nil, opt = "", &b)
89
+ #def find_type(type, opt, *headers, &b)
90
+ #def try_const(const, headers = nil, opt = "", &b)
91
+ #def have_const(const, headers = nil, opt = "", &b)
92
+ #def find_executable0(bin, path = nil)
93
+
94
+ # require the gem's extconf
95
+ require extconf
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/ruby
2
+ # Gem Dependency Checker
3
+ # Print out Gem/Gemspec/Gemfile dependencies, highlighting
4
+ # missing dependencies and those that are remotely
5
+ # available in various locations including koji,
6
+ # git, fedora, bodhi, rhn, etc.
7
+ #
8
+ # Pass -h to the script to see command line option details
9
+ #
10
+ # User is responsible for establishing authorization session
11
+ # before invoking this script
12
+ #
13
+ # Licensed under the MIT license
14
+ # Copyright (C) 2013 Red Hat, Inc.
15
+ ###########################################################
16
+
17
+ require 'optparse'
18
+ require 'colored'
19
+ require 'polisher/gem'
20
+ require 'polisher/gemfile'
21
+ require 'polisher/gemspec'
22
+
23
+ ##########################################################
24
+
25
+ conf = { :gemfile => './Gemfile',
26
+ :gemspec => nil,
27
+ :gemname => nil,
28
+ :devel_deps => false,
29
+ :highlight_missing => false,
30
+ :check_fedora => false,
31
+ :check_git => false,
32
+ :check_koji => false,
33
+ :check_rhn => false,
34
+ :check_yum => false,
35
+ :check_bugzilla => false,
36
+ :check_errata => false}
37
+
38
+ optparse = OptionParser.new do |opts|
39
+ opts.on('-h', '--help', 'Display this help screen') do
40
+ puts opts
41
+ exit
42
+ end
43
+
44
+ opts.on('--gemfile file', 'Location of the gemfile to parse') do |g|
45
+ conf[:gemfile] = g
46
+ end
47
+
48
+ opts.on('--gemspec file', 'Location of the gemspec to parse') do |g|
49
+ conf[:gemspec] = g
50
+ end
51
+
52
+ opts.on('--gem name', 'Name of the rubygem to check') do |g|
53
+ conf[:gemname] = g
54
+ end
55
+
56
+ opts.on('--[no-]devel', 'Include development dependencies') do |d|
57
+ conf[:devel_deps] = d
58
+ end
59
+
60
+ opts.on('-m', '--[no-]missing', 'Highlight missing packages') do |m|
61
+ conf[:highlight_missing] = m
62
+ end
63
+
64
+ opts.on('-f', '--[no-]fedora', 'Check fedora for packages') do |f|
65
+ conf[:check_fedora] = f
66
+ end
67
+
68
+ opts.on('-g', '--git [url]', 'Check git for packages') do |g|
69
+ conf[:check_git] = g || "git://pkgs.fedoraproject.org/"
70
+ end
71
+
72
+ opts.on('-k', '--koji [url]', 'Check koji for packages') do |k|
73
+ conf[:check_koji] = k || 'koji.fedoraproject.org/kojihub'
74
+ end
75
+
76
+ opts.on('-t', '--koji-tag tag', 'Koji tag to query') do |t|
77
+ conf[:koji_tag] = t
78
+ end
79
+
80
+ opts.on('-b', '--bodhi [url]', 'Check Bodhi for packages') do |r|
81
+ conf[:check_bodhi] = r || 'https://admin.fedoraproject.org/updates/'
82
+ end
83
+
84
+ opts.on('--rhn [url]', 'Check RHN for packages') do |r|
85
+ conf[:check_rhn] = r || 'TODO'
86
+ end
87
+
88
+ opts.on('-y', '--yum', 'Check yum for packages') do |y|
89
+ conf[:check_yum] = y
90
+ end
91
+
92
+ opts.on('-b', '--bugzilla', 'Check bugzilla for bugs filed against package') do |b|
93
+ conf[:check_bugzilla] = b
94
+ end
95
+
96
+ opts.on('-e', '--errata [url]', 'Check packages filed in errata') do |e|
97
+ conf[:check_errata] = e || nil
98
+ end
99
+ end
100
+
101
+ optparse.parse!
102
+
103
+ if conf[:gemfile].nil? &&
104
+ conf[:gemspec].nil? &&
105
+ conf[:gemname].nil?
106
+
107
+ if File.exists?('./Gemfile')
108
+ conf[:gemfile] = './Gemfile'
109
+ else
110
+ puts "Valid Gemfile, GemSpec, or Gem must be specified".bold.red
111
+ exit 1
112
+ end
113
+ end
114
+
115
+ targets = []
116
+ targets << Polisher::VersionChecker::GEM_TARGET if conf[:check_gem]
117
+ targets << Polisher::VersionChecker::KOJI_TARGET if conf[:check_koji]
118
+ targets << Polisher::VersionChecker::FEDORA_TARGET if conf[:check_fedora]
119
+ targets << Polisher::VersionChecker::GIT_TARGET if conf[:check_git]
120
+ targets << Polisher::VersionChecker::YUM_TARGET if conf[:check_yum]
121
+ targets = Polisher::VersionChecker::ALL_TARGETS if targets.empty?
122
+ Polisher::VersionChecker.check targets
123
+
124
+ def print_dep(tgt, dep, versions)
125
+ # XXX little bit hacky but works for now
126
+ @last_dep ||= nil
127
+ if @last_dep != dep
128
+ puts "\n#{dep}".blue.bold
129
+ @last_dep = dep
130
+ end
131
+
132
+ if versions.nil? || versions.empty? ||
133
+ versions.size == 1 && versions[0].nil?
134
+ print " #{tgt.to_s.red.bold} "
135
+ else
136
+ print " #{tgt.to_s.green.bold}: #{versions.join(', ').yellow}"
137
+ end
138
+ end
139
+
140
+ if conf[:gemname]
141
+ gem = Polisher::Gem.retrieve(conf[:gemname])
142
+ gem.versions(:recursive => true, :dev_deps => true) do |tgt, dep, versions|
143
+ print_dep(tgt, dep, versions)
144
+ end
145
+
146
+ elsif conf[:gemfile]
147
+ gemfile = nil
148
+
149
+ begin
150
+ gemfile = Polisher::Gemfile.parse(conf[:gemfile])
151
+ rescue => e
152
+ puts "Runtime err #{e}".red
153
+ exit 1
154
+ end
155
+
156
+ gemfile.dependency_versions do |tgt, dep, versions|
157
+ print_dep(tgt, dep, versions)
158
+ end
159
+
160
+ elsif conf[:gemspec]
161
+ gemspec = Polisher::Gemspec.parse(conf[:gemspec])
162
+ gemspec.dependency_versions do |tgt, dep, versions|
163
+ print_dep(tgt, dep, versions)
164
+ end
165
+ end
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/ruby
2
+ # git gem updater
3
+ #
4
+ # Will checkout an existing gem rpm from distgit,
5
+ # and update to the latest version found on http://rubygems.org
6
+ #
7
+ # Usage:
8
+ # git_gem_updater.rb -n <gem_name>
9
+ #
10
+ # Licensed under the MIT License
11
+ # Copyright (C) 2013 Red Hat, Inc.
12
+
13
+ require 'colored'
14
+ require 'curb'
15
+ require 'json'
16
+ require 'optparse'
17
+ require 'nokogiri'
18
+
19
+ require 'polisher/git'
20
+ require 'polisher/gem'
21
+
22
+ ORIG_DIR = Dir.pwd
23
+
24
+ # read various options from the command line
25
+ conf = { :dir => ORIG_DIR,
26
+ :user => nil,
27
+ :gems => []}
28
+
29
+ optparse = OptionParser.new do|opts|
30
+ opts.on('-n', '--name GEM', 'gem name' ) do |n|
31
+ conf[:gems] << n
32
+ end
33
+
34
+ opts.on('-u', '--user USER', 'fedora user name' ) do |u|
35
+ conf[:user] = u
36
+ end
37
+
38
+ opts.on('-d', '--dir path', 'Directory to cd to before checking out / manipulating packages' ) do |p|
39
+ conf[:dir] = p
40
+ end
41
+
42
+ opts.on('-h', '--help', 'display this screen' ) do
43
+ puts opts
44
+ exit
45
+ end
46
+ end
47
+
48
+ optparse.parse!
49
+
50
+ conf[:gems] += Polisher::Fedora.gems_owned_by(conf[:user]) unless conf[:user].nil?
51
+
52
+ if conf[:gems].empty?
53
+ puts "must specify a gem name or user name!".red
54
+ exit 1
55
+ end
56
+
57
+ Dir.mkdir conf[:dir] unless File.directory?(conf[:dir])
58
+ Dir.chdir conf[:dir]
59
+
60
+ # iterate over gems
61
+ conf[:gems].each do |gem_name|
62
+ pkg =
63
+ begin
64
+ Polisher::GitPackage.clone(gem_name)
65
+ rescue => e
66
+ next
67
+ end
68
+
69
+ gem = Polisher::Gem.retrieve gem_name
70
+ File.write("#{gem.name}-#{gem.version}.gem", gem.download_gem)
71
+ pkg.update_to(gem)
72
+ # TODO append gem dependencies to conf[:gems] list
73
+
74
+ pkg.build
75
+
76
+ unless pkg.has_check?
77
+ puts "Warning: no %check section in spec,\
78
+ manually verify functionality!".bold.red
79
+ end
80
+
81
+ pkg.commit
82
+
83
+ puts "#{gem_name} commit complete".green
84
+ puts "Push commit with: git push".blue
85
+ puts "Build and tag official rpms with: #{Polisher::GitPackage::PKG_CMD} build".blue
86
+ end