polisher 0.6.1 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 376315592c88c3de00fca0125ae64583fb660764
4
- data.tar.gz: 4d11de1d33a201b7195c090c4831d8e8ee61783c
3
+ metadata.gz: cccecc84da6d0524db953260dc592ee5424f33b0
4
+ data.tar.gz: c9dc301daf1b9366e5d62eb68615b9b53004d6a8
5
5
  SHA512:
6
- metadata.gz: 6217a46af865d179c17d64e8c7cc030f624470b35b480e04f5a4cf2907161acd1afff8b57f283a8c394e0fd401baba77bef07e9318c57b9ac39e7360a461bc66
7
- data.tar.gz: fa067ed1e2161d7b185108476c588c24f58f2bc26ce894f499b6b212563366fe68df5e431528d1ef6ce252263e4b930e2a4939585ba90eb908b5b1ca4b3794fa
6
+ metadata.gz: bd10517253ce3ddf2c69a0169d720d52031dc61586078f7598bbd25909057f73aa0b96c4f7610ef996458bc1303b9c2d21381a7a08d338f5a85c7c9a07f5f7fb
7
+ data.tar.gz: eea79b07d89a0966245a48654967bb49be12e6df13da1c1c15ba1b4c283ca2d85812a46be3d5f6f41bb00e75f83dd72c2b34cee107016744689323f25cbf25a6
data/README.md CHANGED
@@ -136,7 +136,7 @@ The test suite is based on rspec, to run:
136
136
 
137
137
  ## Legal & Other
138
138
 
139
- Polisher is Licensed under the MIT License, Copyright (C) 2013 Red Hat, Inc.
139
+ Polisher is Licensed under the MIT License, Copyright (C) 2013-2014 Red Hat, Inc.
140
140
 
141
141
  See the commit log for authors of the project. All feedback and contributions
142
142
  are more than welcome.
@@ -10,7 +10,7 @@
10
10
  # ./binary_gem_resolver.rb <path-to-gem-install>
11
11
  #
12
12
  # Licensed under the MIT license
13
- # Copyright (C) 2013 Red Hat, Inc.
13
+ # Copyright (C) 2013-2014 Red Hat, Inc.
14
14
  ###########################################################
15
15
 
16
16
  require 'colored'
@@ -11,7 +11,7 @@
11
11
  # before invoking this script
12
12
  #
13
13
  # Licensed under the MIT license
14
- # Copyright (C) 2013 Red Hat, Inc.
14
+ # Copyright (C) 2013-2014 Red Hat, Inc.
15
15
  ###########################################################
16
16
 
17
17
  require 'optparse'
@@ -33,7 +33,8 @@ conf = { :gemfile => './Gemfile',
33
33
  :check_rhn => false,
34
34
  :check_yum => false,
35
35
  :check_bugzilla => false,
36
- :check_errata => false}
36
+ :check_errata => false,
37
+ :check_bodhi => false}
37
38
 
38
39
  optparse = OptionParser.new do |opts|
39
40
  opts.on('-h', '--help', 'Display this help screen') do
@@ -118,6 +119,7 @@ targets << Polisher::VersionChecker::KOJI_TARGET if conf[:check_koji]
118
119
  targets << Polisher::VersionChecker::FEDORA_TARGET if conf[:check_fedora]
119
120
  targets << Polisher::VersionChecker::GIT_TARGET if conf[:check_git]
120
121
  targets << Polisher::VersionChecker::YUM_TARGET if conf[:check_yum]
122
+ targets << Polisher::VersionChecker::BODHI_TARGET if conf[:check_bodhi]
121
123
  targets = Polisher::VersionChecker::ALL_TARGETS if targets.empty?
122
124
  Polisher::VersionChecker.check targets
123
125
 
@@ -8,7 +8,7 @@
8
8
  # git_gem_updater.rb -n <gem_name>
9
9
  #
10
10
  # Licensed under the MIT License
11
- # Copyright (C) 2013 Red Hat, Inc.
11
+ # Copyright (C) 2013-2014 Red Hat, Inc.
12
12
 
13
13
  require 'colored'
14
14
  require 'curb'
@@ -61,7 +61,7 @@ Dir.chdir conf[:dir]
61
61
  conf[:gems].each do |gem_name|
62
62
  pkg =
63
63
  begin
64
- Polisher::GitPackage.clone(gem_name)
64
+ Polisher::GitPackage.new(:name => gem_name).clone
65
65
  rescue => e
66
66
  next
67
67
  end
@@ -73,7 +73,7 @@ conf[:gems].each do |gem_name|
73
73
 
74
74
  pkg.build
75
75
 
76
- unless pkg.has_check?
76
+ unless pkg.spec.has_check?
77
77
  puts "Warning: no %check section in spec,\
78
78
  manually verify functionality!".bold.red
79
79
  end
@@ -13,9 +13,8 @@
13
13
  # ruby_rpm_spec_updater.rb <path-to-spec> <optional-source-or-version>
14
14
  #
15
15
  # Licensed under the MIT License
16
- # Copyright (C) 2013 Red Hat, Inc.
16
+ # Copyright (C) 2013-2014 Red Hat, Inc.
17
17
 
18
- require 'colored'
19
18
  require 'polisher'
20
19
 
21
20
  spec_file = ARGV.shift
@@ -26,4 +25,4 @@ source = source.nil? ?
26
25
  Polisher::Upstream.parse(source)
27
26
 
28
27
  rpmspec.update_to(source)
29
- puts rpmspec.to_string.yellow.bold
28
+ puts rpmspec.to_string
@@ -1,7 +1,7 @@
1
1
  # Ruby Polisher
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'polisher/core'
7
7
  require 'polisher/rpmspec'
@@ -1,7 +1,7 @@
1
1
  # Polisher APT Operations
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  module Polisher
7
7
  class Apt
@@ -1,22 +1,20 @@
1
1
  # Polisher Bodhi Operations
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
+ # XXX issue w/ retreiving packages from pkgwat causing sporadic issues:
7
+ # https://github.com/fedora-infra/fedora-packages/issues/55
8
+
9
+ # fedora pkgwat provides a frontend to bodhi
6
10
  require 'pkgwat'
7
11
 
8
12
  module Polisher
9
13
  class Bodhi
10
14
  def self.versions_for(name, &bl)
11
- # XXX issue w/ retreiving packages from pkgwat causing issues:
12
- # https://github.com/fedora-infra/fedora-packages/issues/55
13
-
14
- # fedora pkgwat provides a frontend to bodhi
15
- updates = Pkgwat.get_updates("rubygem-#{name}", 'all', 'all') # TODO set timeout
16
- updates.reject! { |u|
17
- u['stable_version'] == 'None' && u['testing_version'] == "None"
18
- }
19
- versions = updates.collect { |u| u['stable_version'] }
15
+ versions = Pkgwat.get_updates("rubygem-#{name}", 'all', 'all').
16
+ select { |update| update['stable_version'] != 'None' }.
17
+ collect { |update| update['stable_version'] }
20
18
  bl.call(:bodhi, name, versions) unless(bl.nil?)
21
19
  versions
22
20
  end
@@ -1,7 +1,9 @@
1
1
  # Polisher Bugzilla Operations
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ # TODO use ruby_bugzilla to search to packages in bz
5
7
 
6
8
  module Polisher
7
9
  class Bugzilla
@@ -1,23 +1,29 @@
1
1
  # Polisher Core Ruby Extensions
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'polisher/rpmspec'
7
7
 
8
8
  class String
9
+ # Return bool indicating if self is a path to a gem
9
10
  def gem?
10
11
  File.extname(self) == ".gem"
11
12
  end
12
13
 
14
+ # Return bool indicating if self is a path to a gemspec
13
15
  def gemspec?
14
16
  File.extname(self) == ".gemspec"
15
17
  end
16
18
 
19
+ # Return bool indicating if self is a path to a Gemfile
17
20
  def gemfile?
18
21
  File.basename(self) == "Gemfile"
19
22
  end
20
23
 
24
+ # Remove and replace all occurances of rpm macros in self with non-rpm
25
+ # macro correspondents. If no rpm macro is specified macro will
26
+ # simply be removed
21
27
  def unrpmize
22
28
  fmm = Polisher::RPMSpec::FILE_MACRO_MATCHERS
23
29
  fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS
@@ -26,6 +32,8 @@ class String
26
32
  f
27
33
  end
28
34
 
35
+ # Replace all occurrances of non-rpm macro strings in self
36
+ # with their macro correspondences
29
37
  def rpmize
30
38
  fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS.invert
31
39
  fmr.keys.inject(self) { |file, r| file.gsub(r, fmr[r]) }
@@ -1,13 +1,15 @@
1
1
  # Polisher Errata Operations
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'json'
7
7
  require 'curb'
8
8
 
9
9
  module Polisher
10
10
  class Errata
11
+ # Initialize/return singleton curl handle to
12
+ # query errata and set url
11
13
  def self.client(url)
12
14
  @curl ||= begin
13
15
  c = Curl::Easy.new
@@ -23,22 +25,32 @@ module Polisher
23
25
  end
24
26
 
25
27
  def self.versions_for(advisory_url, name, &bl)
26
- url = "#{advisory_url}/builds"
27
- result = self.client(url).get
28
- json = JSON.parse result.body_str
28
+ result = self.client("#{advisory_url}/builds").get
29
29
  versions =
30
- json.collect { |tag, builds|
31
- builds.collect { |build|
32
- pkg,meta = *build.flatten
33
- if pkg =~ /^rubygem-#{name}-([^-]*)-.*$/
34
- $1
35
- else
36
- nil
37
- end
38
- }
39
- }.flatten.compact
30
+ JSON.parse(result.body_str).collect { |tag, builds|
31
+ ErrataBuild.builds_matching(builds, name)
32
+ }.flatten
33
+
40
34
  bl.call(:errata, name, versions) unless(bl.nil?)
41
35
  versions
42
36
  end
43
37
  end
38
+
39
+ class ErrataBuild
40
+ def self.builds_matching(builds, name)
41
+ builds.collect { |build|
42
+ self.build_matches?(build, name) ? self.build_version(build, name) : nil
43
+ }.compact
44
+ end
45
+
46
+ def self.build_matches?(build, name)
47
+ pkg,meta = *build.flatten
48
+ pkg =~ /^rubygem-#{name}-([^-]*)-.*$/
49
+ end
50
+
51
+ def self.build_version(build, name)
52
+ pkg,meta = *build.flatten
53
+ pkg.split('-')[2]
54
+ end
55
+ end
44
56
  end
@@ -1,7 +1,7 @@
1
1
  # Polisher Fedora Operations
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'curb'
7
7
  require 'pkgwat'
@@ -0,0 +1 @@
1
+ # TODO
@@ -1,36 +1,55 @@
1
1
  # Polisher Gem Represenation
2
2
  #
3
3
  # Licensed under the MIT license
4
- # Copyright (C) 2013 Red Hat, Inc.
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'curb'
7
7
  require 'json'
8
8
  require 'yaml'
9
9
  require 'tempfile'
10
10
  require 'pathname'
11
+ require 'fileutils'
12
+ require 'awesome_spawn'
11
13
  require 'rubygems/installer'
12
14
  require 'active_support/core_ext'
13
15
 
14
16
  require 'polisher/version_checker'
17
+ require 'polisher/gem_cache'
15
18
 
16
19
  module Polisher
17
20
  class Gem
18
21
  GEM_CMD = '/usr/bin/gem'
22
+ DIFF_CMD = '/usr/bin/diff'
23
+
24
+ # Common files shipped in gems that we should ignore
25
+ IGNORE_FILES = ['.gemtest', '.gitignore', '.travis.yml',
26
+ /.*.gemspec/, /Gemfile.*/, 'Rakefile',
27
+ /rspec.*/, '.yardopts', '.rvmrc']
28
+
29
+ # TODO also mark certain files to be tagged as %{doc}
19
30
 
20
31
  attr_accessor :spec
21
32
  attr_accessor :name
22
33
  attr_accessor :version
23
34
  attr_accessor :deps
24
35
  attr_accessor :dev_deps
25
- attr_accessor :files
36
+
37
+ attr_accessor :path
26
38
 
27
39
  def initialize(args={})
28
40
  @spec = args[:spec]
29
41
  @name = args[:name]
30
42
  @version = args[:version]
43
+ @path = args[:path]
31
44
  @deps = args[:deps] || []
32
45
  @dev_deps = args[:dev_deps] || []
33
- @files = args[:files] || []
46
+ end
47
+
48
+ # Return bool indiicating if the specified file is on the IGNORE_FILES list
49
+ def self.ignorable_file?(file)
50
+ IGNORE_FILES.any? do |ignore|
51
+ ignore.is_a?(Regexp) ? ignore.match(file) : ignore == file
52
+ end
34
53
  end
35
54
 
36
55
  # Retrieve list of the versions of the specified gem installed locally
@@ -67,7 +86,7 @@ module Polisher
67
86
 
68
87
  metadata[:dev_deps] =
69
88
  specj['dependencies']['development'].collect { |d|
70
- ::Gem::Dependency.new d['name'], d['requirements']
89
+ ::Gem::Dependency.new d['name'], d['requirements'].split(',')
71
90
  }
72
91
 
73
92
  elsif args.has_key?(:gemspec)
@@ -94,55 +113,80 @@ module Polisher
94
113
  end
95
114
 
96
115
  # Download the gem and return the binary file contents as a string
116
+ #
97
117
  # @return [String] binary gem contents
98
118
  def download_gem
119
+ cached = GemCache.get(@name, @version)
120
+ return cached unless cached.nil?
121
+
122
+ # TODO utilize a singleton curl instance (akin to errata module)
99
123
  gem_path = "https://rubygems.org/gems/#{@name}-#{@version}.gem"
100
124
  curl = Curl::Easy.new(gem_path)
101
125
  curl.follow_location = true
102
126
  curl.http_get
103
127
  gemf = curl.body_str
128
+
129
+ GemCache.set(@name, @version, gemf)
130
+ gemf
131
+ end
132
+
133
+ # Returns path to downloaded gem
134
+ #
135
+ # @return [String] path to downloaded gem
136
+ def downloaded_gem_path
137
+ # ensure gem is downloaded
138
+ self.download_gem
139
+ GemCache.path_for(@name, @version)
104
140
  end
105
141
 
106
- # Refresh the gem spec
107
- def refresh_spec
108
- gemf = download_gem
109
- tgem = Tempfile.new(@name)
110
- tgem.write gemf
111
- tgem.close
112
-
113
- @spec = YAML.load `#{GEM_CMD} specification #{tgem.path}`
114
-
115
- # update deps, dev_deps
116
- @deps =
117
- @spec.dependencies.select { |dep|
118
- dep.type == :runtime
119
- }.collect { |dep| dep }
120
-
121
- @dev_deps =
122
- @spec.dependencies.select { |dep|
123
- dep.type == :development
124
- }.collect { |dep| dep }
142
+ # Returns path to gem, either specified one of downloaded one
143
+ def gem_path
144
+ @path || downloaded_gem_path
125
145
  end
126
146
 
127
- # Retrieve the list of files in the gem
147
+ # Unpack files & return unpacked directory
128
148
  #
129
- # @return [Array<String>] list of files in the gem
130
- def refresh_files
131
- gemf = download_gem
132
- tgem = Tempfile.new(@name)
133
- tgem.write gemf
134
- tgem.close
135
-
136
- @files = []
137
- pkg = ::Gem::Installer.new tgem.path, :unpack => true
138
- Dir.mktmpdir { |dir|
149
+ # If block is specified, it will be invoked
150
+ # with directory after which directory will be removed
151
+ def unpack(&bl)
152
+ dir = nil
153
+ pkg = ::Gem::Installer.new gem_path, :unpack => true
154
+
155
+ if bl
156
+ Dir.mktmpdir { |dir|
157
+ pkg.unpack dir
158
+ bl.call dir
159
+ }
160
+ else
161
+ dir = Dir.mktmpdir
139
162
  pkg.unpack dir
163
+ end
164
+
165
+ dir
166
+ end
167
+
168
+ # Iterate over each file in gem invoking block with path
169
+ def each_file(&bl)
170
+ self.unpack do |dir|
140
171
  Pathname(dir).find do |path|
141
- pathstr = path.to_s.gsub(dir, '')
142
- @files << pathstr unless pathstr.blank?
172
+ next if path.to_s == dir.to_s
173
+ bl.call path
143
174
  end
144
- }
145
- @files
175
+ end
176
+ end
177
+
178
+ # Retrieve the list of paths to files in the gem
179
+ #
180
+ # @return [Array<String>] list of files in the gem
181
+ def file_paths
182
+ @file_paths ||= begin
183
+ files = []
184
+ self.each_file do |path|
185
+ pathstr = path.to_s.gsub("#{dir}/", '')
186
+ files << pathstr unless pathstr.blank?
187
+ end
188
+ files
189
+ end
146
190
  end
147
191
 
148
192
  # Retrieve gem metadata and contents from rubygems.org
@@ -153,7 +197,6 @@ module Polisher
153
197
  gem_json_path = "https://rubygems.org/api/v1/gems/#{name}.json"
154
198
  spec = Curl::Easy.http_get(gem_json_path).body_str
155
199
  gem = self.parse spec
156
- gem.refresh_files
157
200
  gem
158
201
  end
159
202
 
@@ -193,5 +236,47 @@ module Polisher
193
236
  end
194
237
  versions
195
238
  end
239
+
240
+ # Return list of file paths marked as vendored
241
+ def vendored_file_paths
242
+ self.file_paths.select { |f| f.include?('vendor/') }
243
+ end
244
+
245
+ # Return list of vendered gems in file list
246
+ def vendored
247
+ vendored_file_paths.inject({}){ |v,fp|
248
+ vendored_file = fp.split('/')
249
+ vendor_index = vendored_file.index('vendor')
250
+
251
+ # only process vendor'd dirs:
252
+ next v if vendor_index + 2 == vendored_file.size
253
+
254
+ vname = vendored_file[vendor_index + 1]
255
+ vversion = nil
256
+ # TODO set vversion from version.rb:
257
+ #vf.last.downcase == 'version.rb'
258
+ v[vname] = vversion
259
+ v
260
+ }
261
+ end
262
+
263
+ # Return diff of content in this gem against other
264
+ def diff(other)
265
+ out = nil
266
+
267
+ begin
268
+ this_dir = self.unpack
269
+ other_dir = other.unpack
270
+ result = AwesomeSpawn.run("#{DIFF_CMD} -r #{this_dir} #{other_dir}")
271
+ out = result.output
272
+ rescue
273
+ ensure
274
+ FileUtils.rm_rf this_dir
275
+ FileUtils.rm_rf other_dir
276
+ end
277
+
278
+ out
279
+ end
280
+
196
281
  end # class Gem
197
282
  end # module Polisher