polisher 0.7.1 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cccecc84da6d0524db953260dc592ee5424f33b0
4
- data.tar.gz: c9dc301daf1b9366e5d62eb68615b9b53004d6a8
3
+ metadata.gz: cde437d4b30595528a08d2127ed32d64458b9910
4
+ data.tar.gz: 2124dcabfc9cfda82bc6a481163e17e0ef0e6774
5
5
  SHA512:
6
- metadata.gz: bd10517253ce3ddf2c69a0169d720d52031dc61586078f7598bbd25909057f73aa0b96c4f7610ef996458bc1303b9c2d21381a7a08d338f5a85c7c9a07f5f7fb
7
- data.tar.gz: eea79b07d89a0966245a48654967bb49be12e6df13da1c1c15ba1b4c283ca2d85812a46be3d5f6f41bb00e75f83dd72c2b34cee107016744689323f25cbf25a6
6
+ metadata.gz: 46ed5242624caa97426ee83c6b37a21f14253ceab0ccaa026e2154c8936d9594e79c0383cfdb409ddc6a045129a62154b7ee5c695178ac402a9562b858644292
7
+ data.tar.gz: 029682eb264075bf04c12a8922bc58a3da54622d48bdac446501c87e58b9fe70a87e2ad3bb798c15f2b82a4b8278054e9bc65174b41c0497c078113a4b4184c6
@@ -50,7 +50,7 @@ end
50
50
  require 'mkmf'
51
51
 
52
52
  alias :_cpp_command :cpp_command
53
- def cpp_command(outfile="", opt)
53
+ def cpp_command(outfile, opt="")
54
54
  ""
55
55
  end
56
56
 
@@ -18,13 +18,13 @@ require 'optparse'
18
18
  require 'colored'
19
19
  require 'polisher/gem'
20
20
  require 'polisher/gemfile'
21
- require 'polisher/gemspec'
22
21
 
23
22
  ##########################################################
24
23
 
25
24
  conf = { :gemfile => './Gemfile',
26
25
  :gemspec => nil,
27
26
  :gemname => nil,
27
+ :groups => [],
28
28
  :devel_deps => false,
29
29
  :highlight_missing => false,
30
30
  :check_fedora => false,
@@ -46,6 +46,10 @@ optparse = OptionParser.new do |opts|
46
46
  conf[:gemfile] = g
47
47
  end
48
48
 
49
+ opts.on('--group gemfile_groups', 'Gemfile groups (may be specified multiple times)') do |g|
50
+ conf[:groups] << g
51
+ end
52
+
49
53
  opts.on('--gemspec file', 'Location of the gemspec to parse') do |g|
50
54
  conf[:gemspec] = g
51
55
  end
@@ -145,11 +149,17 @@ if conf[:gemname]
145
149
  print_dep(tgt, dep, versions)
146
150
  end
147
151
 
152
+ elsif conf[:gemspec]
153
+ gem = Polisher::Gem.from_gemspec(conf[:gemspec])
154
+ gem.versions(:recursive => true, :dev_deps => true) do |tgt, dep, versions|
155
+ print_dep(tgt, dep, versions)
156
+ end
157
+
148
158
  elsif conf[:gemfile]
149
159
  gemfile = nil
150
160
 
151
161
  begin
152
- gemfile = Polisher::Gemfile.parse(conf[:gemfile])
162
+ gemfile = Polisher::Gemfile.parse(conf[:gemfile], :groups => conf[:groups])
153
163
  rescue => e
154
164
  puts "Runtime err #{e}".red
155
165
  exit 1
@@ -158,10 +168,4 @@ elsif conf[:gemfile]
158
168
  gemfile.dependency_versions do |tgt, dep, versions|
159
169
  print_dep(tgt, dep, versions)
160
170
  end
161
-
162
- elsif conf[:gemspec]
163
- gemspec = Polisher::Gemspec.parse(conf[:gemspec])
164
- gemspec.dependency_versions do |tgt, dep, versions|
165
- print_dep(tgt, dep, versions)
166
- end
167
171
  end
@@ -61,26 +61,27 @@ Dir.chdir conf[:dir]
61
61
  conf[:gems].each do |gem_name|
62
62
  pkg =
63
63
  begin
64
- Polisher::GitPackage.new(:name => gem_name).clone
64
+ Polisher::Git::Pkg.new(:name => gem_name).clone
65
65
  rescue => e
66
+ puts "Problem Cloning Package, Skipping: #{e}"
66
67
  next
67
68
  end
68
69
 
69
70
  gem = Polisher::Gem.retrieve gem_name
70
- File.write("#{gem.name}-#{gem.version}.gem", gem.download_gem)
71
71
  pkg.update_to(gem)
72
72
  # TODO append gem dependencies to conf[:gems] list
73
73
 
74
74
  pkg.build
75
75
 
76
76
  unless pkg.spec.has_check?
77
- puts "Warning: no %check section in spec,\
78
- manually verify functionality!".bold.red
77
+ puts "Warning: no %check section in spec, "\
78
+ "manually verify functionality!".bold.red
79
79
  end
80
80
 
81
81
  pkg.commit
82
82
 
83
83
  puts "#{gem_name} commit complete".green
84
+ puts "Package located in #{pkg.path.bold}"
84
85
  puts "Push commit with: git push".blue
85
- puts "Build and tag official rpms with: #{Polisher::GitPackage::PKG_CMD} build".blue
86
+ puts "Build and tag official rpms with: #{Polisher::Git::Pkg.pkg_cmd} build".blue
86
87
  end
@@ -19,7 +19,7 @@ require 'polisher'
19
19
 
20
20
  spec_file = ARGV.shift
21
21
  source = ARGV.shift
22
- rpmspec = Polisher::RPMSpec.parse File.read(spec_file)
22
+ rpmspec = Polisher::RPM::Spec.parse File.read(spec_file)
23
23
  source = source.nil? ?
24
24
  Polisher::Gem.retrieve(rpmspec.gem_name) :
25
25
  Polisher::Upstream.parse(source)
@@ -4,7 +4,9 @@
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'polisher/core'
7
- require 'polisher/rpmspec'
7
+ require 'polisher/error'
8
+ require 'polisher/rpm/requirement'
9
+ require 'polisher/rpm/spec'
8
10
  require 'polisher/gem'
9
11
  require 'polisher/upstream'
10
12
  require 'polisher/gemfile'
@@ -3,7 +3,50 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- require 'polisher/rpmspec'
6
+ class Object
7
+ def eigenclass
8
+ class << self
9
+ self
10
+ end
11
+ end
12
+ end
13
+
14
+ module ConfHelpers
15
+ # Defines a 'config attribute' or attribute on the class
16
+ # which this is defined in. Accessors to the single shared
17
+ # attribute will be added to the class as well as instances
18
+ # of the class. Specify the default value with the attr name
19
+ # or via an env variable
20
+ #
21
+ # @example
22
+ # class Custom
23
+ # extend ConfHelpers
24
+ # conf_attr :data_dir, '/etc/'
25
+ # end
26
+ # Custom.data_dir # => '/etc/'
27
+ # ENV['POLISHER_DATA_DIR'] = '/usr/'
28
+ # Custom.data_dir # => '/usr/'
29
+ # Custom.data_dir == Custom.new.data_dir # => true
30
+ #
31
+ def conf_attr(name, default=nil)
32
+ self.send(:define_singleton_method, name) do |*args|
33
+ nvar = "@#{name}".intern
34
+ current = self.instance_variable_get(nvar)
35
+ envk = "POLISHER_#{name.to_s.upcase}"
36
+ self.instance_variable_set(nvar, default) unless current
37
+ self.instance_variable_set(ENV[envk]) if ENV.has_key?(envk)
38
+ # TODO also allow vars to be able to be set from a conf file
39
+ self.instance_variable_set(nvar, args.first) unless args.empty?
40
+ self.instance_variable_get(nvar)
41
+ end
42
+
43
+ self.send(:define_method, name) do
44
+ self.class.send(name)
45
+ end
46
+ end
47
+ end
48
+
49
+ require 'polisher/rpm/spec'
7
50
 
8
51
  class String
9
52
  # Return bool indicating if self is a path to a gem
@@ -25,8 +68,8 @@ class String
25
68
  # macro correspondents. If no rpm macro is specified macro will
26
69
  # simply be removed
27
70
  def unrpmize
28
- fmm = Polisher::RPMSpec::FILE_MACRO_MATCHERS
29
- fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS
71
+ fmm = Polisher::RPM::Spec::FILE_MACRO_MATCHERS
72
+ fmr = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS
30
73
  f = fmm.inject(self) { |file, matcher| file.gsub(matcher, '') }
31
74
  f = fmr.keys.inject(f) { |file, r| file.gsub(Regexp.new(r), fmr[r]) }
32
75
  f
@@ -35,7 +78,7 @@ class String
35
78
  # Replace all occurrances of non-rpm macro strings in self
36
79
  # with their macro correspondences
37
80
  def rpmize
38
- fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS.invert
81
+ fmr = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS.invert
39
82
  fmr.keys.inject(self) { |file, r| file.gsub(r, fmr[r]) }
40
83
  end
41
84
  end
@@ -17,7 +17,6 @@ module Polisher
17
17
  c.ssl_verify_host = false
18
18
  c.http_auth_types = :negotiate
19
19
  c.userpwd = ':'
20
- c.get
21
20
  end
22
21
 
23
22
  @curl.url = url
@@ -0,0 +1,7 @@
1
+ # Polisher Errors
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ class PolisherError < StandardError
7
+ end
@@ -15,9 +15,12 @@ require 'active_support/core_ext'
15
15
 
16
16
  require 'polisher/version_checker'
17
17
  require 'polisher/gem_cache'
18
+ require 'polisher/vendor'
18
19
 
19
20
  module Polisher
20
21
  class Gem
22
+ include HasVendoredDeps
23
+
21
24
  GEM_CMD = '/usr/bin/gem'
22
25
  DIFF_CMD = '/usr/bin/diff'
23
26
 
@@ -64,6 +67,58 @@ module Polisher
64
67
  versions
65
68
  end
66
69
 
70
+ # Return new instance of Gem from JSON Specification
71
+ def self.from_json(json)
72
+ specj = JSON.parse(json)
73
+ metadata = {}
74
+ metadata[:spec] = specj
75
+ metadata[:name] = specj['name']
76
+ metadata[:version] = specj['version']
77
+
78
+ metadata[:deps] =
79
+ specj['dependencies']['runtime'].collect { |d|
80
+ ::Gem::Dependency.new d['name'], *d['requirements'].split(',')
81
+ }
82
+
83
+ metadata[:dev_deps] =
84
+ specj['dependencies']['development'].collect { |d|
85
+ ::Gem::Dependency.new d['name'], d['requirements'].split(',')
86
+ }
87
+
88
+ self.new metadata
89
+ end
90
+
91
+ # Return new instance of Gem from Gemspec
92
+ def self.from_gemspec(gemspec)
93
+ gemspec =
94
+ ::Gem::Specification.load(gemspec) if !gemspec.is_a?(::Gem::Specification) &&
95
+ File.exists?(gemspec)
96
+
97
+ metadata = {}
98
+ metadata[:spec] = gemspec
99
+ metadata[:name] = gemspec.name
100
+ metadata[:version] = gemspec.version.to_s
101
+
102
+ metadata[:deps] =
103
+ gemspec.dependencies.select { |dep|
104
+ dep.type == :runtime
105
+ }.collect { |dep| dep }
106
+
107
+ metadata[:dev_deps] =
108
+ gemspec.dependencies.select { |dep|
109
+ dep.type == :development
110
+ }.collect { |dep| dep }
111
+
112
+ self.new metadata
113
+ end
114
+
115
+ # Return new instance of Gem from rubygem
116
+ def self.from_gem(gem_path)
117
+ gem = self.parse :gemspec => ::Gem::Package.new(gem_path).spec
118
+ gem.path = gem_path
119
+ gem
120
+ end
121
+
67
122
  # Parse the specified gemspec & return new Gem instance from metadata
68
123
  #
69
124
  # @param [String,Hash] args contents of actual gemspec of option hash
@@ -71,72 +126,65 @@ module Polisher
71
126
  # @option args [String] :gemspec path to gemspec to load / parse
72
127
  # @return [Polisher::Gem] gem instantiated from gemspec metadata
73
128
  def self.parse(args={})
74
- metadata = {}
75
-
76
129
  if args.is_a?(String)
77
- specj = JSON.parse(args)
78
- metadata[:spec] = specj
79
- metadata[:name] = specj['name']
80
- metadata[:version] = specj['version']
81
-
82
- metadata[:deps] =
83
- specj['dependencies']['runtime'].collect { |d|
84
- ::Gem::Dependency.new d['name'], *d['requirements'].split(',')
85
- }
86
-
87
- metadata[:dev_deps] =
88
- specj['dependencies']['development'].collect { |d|
89
- ::Gem::Dependency.new d['name'], d['requirements'].split(',')
90
- }
130
+ return self.from_json args
91
131
 
92
132
  elsif args.has_key?(:gemspec)
93
- gemspec = ::Gem::Specification.load(args[:gemspec])
94
- metadata[:spec] = gemspec # TODO to json
95
- metadata[:name] = gemspec.name
96
- metadata[:version] = gemspec.version.to_s
97
-
98
- metadata[:deps] =
99
- gemspec.dependencies.select { |dep|
100
- dep.type == :runtime
101
- }.collect { |dep| dep }
102
-
103
- metadata[:dev_deps] =
104
- gemspec.dependencies.select { |dep|
105
- dep.type == :development
106
- }.collect { |dep| dep }
133
+ return self.from_gemspec args[:gemspec]
107
134
 
108
135
  elsif args.has_key?(:gem)
109
- # TODO
136
+ return self.from_gem args[:gem]
137
+
110
138
  end
111
139
 
112
- self.new metadata
140
+ self.new
113
141
  end
114
142
 
115
- # Download the gem and return the binary file contents as a string
143
+ # Return handler to internal curl helper
144
+ def self.client
145
+ @client ||= Curl::Easy.new
146
+ end
147
+
148
+ # Download the specified gem and return the binary file contents as a string
116
149
  #
117
150
  # @return [String] binary gem contents
118
- def download_gem
119
- cached = GemCache.get(@name, @version)
151
+ def self.download_gem(name, version)
152
+ cached = GemCache.get(name, version)
120
153
  return cached unless cached.nil?
121
154
 
122
- # TODO utilize a singleton curl instance (akin to errata module)
123
- gem_path = "https://rubygems.org/gems/#{@name}-#{@version}.gem"
124
- curl = Curl::Easy.new(gem_path)
125
- curl.follow_location = true
126
- curl.http_get
127
- gemf = curl.body_str
155
+ client.url = "https://rubygems.org/gems/#{name}-#{version}.gem"
156
+ client.follow_location = true
157
+ client.http_get
158
+ gemf = client.body_str
128
159
 
129
- GemCache.set(@name, @version, gemf)
160
+ GemCache.set(name, version, gemf)
130
161
  gemf
131
162
  end
132
163
 
164
+ # Download the local gem and return it as a string
165
+ def download_gem
166
+ self.class.download_gem @name, @version
167
+ end
168
+
169
+ # Download the specified gem / version from rubygems and
170
+ # return instance of Polisher::Gem class corresponding to it
171
+ def self.from_rubygems(name, version)
172
+ download_gem name, version
173
+ self.from_gem downloaded_gem_path(name, version)
174
+ end
175
+
133
176
  # Returns path to downloaded gem
134
177
  #
135
178
  # @return [String] path to downloaded gem
136
- def downloaded_gem_path
179
+ def self.downloaded_gem_path(name, version)
137
180
  # ensure gem is downloaded
138
- self.download_gem
139
- GemCache.path_for(@name, @version)
181
+ self.download_gem(name, version)
182
+ GemCache.path_for(name, version)
183
+ end
184
+
185
+ # Return path to downloaded gem
186
+ def downloaded_gem_path
187
+ self.class.downloaded_gem_path @name, @version
140
188
  end
141
189
 
142
190
  # Returns path to gem, either specified one of downloaded one
@@ -170,7 +218,8 @@ module Polisher
170
218
  self.unpack do |dir|
171
219
  Pathname(dir).find do |path|
172
220
  next if path.to_s == dir.to_s
173
- bl.call path
221
+ pathstr = path.to_s.gsub("#{dir}/", '')
222
+ bl.call pathstr unless pathstr.blank?
174
223
  end
175
224
  end
176
225
  end
@@ -182,8 +231,7 @@ module Polisher
182
231
  @file_paths ||= begin
183
232
  files = []
184
233
  self.each_file do |path|
185
- pathstr = path.to_s.gsub("#{dir}/", '')
186
- files << pathstr unless pathstr.blank?
234
+ files << path
187
235
  end
188
236
  files
189
237
  end
@@ -212,9 +260,10 @@ module Polisher
212
260
  def versions(args={}, &bl)
213
261
  recursive = args[:recursive]
214
262
  dev_deps = args[:dev_deps]
215
-
216
263
  versions = args[:versions] || {}
217
- versions.merge!({ self.name => Polisher::VersionChecker.versions_for(self.name, &bl) })
264
+
265
+ gem_versions = Polisher::VersionChecker.versions_for(self.name, &bl)
266
+ versions.merge!({ self.name => gem_versions })
218
267
  args[:versions] = versions
219
268
 
220
269
  if recursive
@@ -237,42 +286,21 @@ module Polisher
237
286
  versions
238
287
  end
239
288
 
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
289
  # Return diff of content in this gem against other
264
290
  def diff(other)
265
291
  out = nil
266
292
 
267
293
  begin
268
294
  this_dir = self.unpack
269
- other_dir = other.unpack
295
+ other_dir = other.is_a?(Polisher::Gem) ? other.unpack :
296
+ (other.is_a?(Polisher::Git::Repo) ? other.path : other)
270
297
  result = AwesomeSpawn.run("#{DIFF_CMD} -r #{this_dir} #{other_dir}")
271
- out = result.output
298
+ out = result.output.gsub("#{this_dir}", 'a').gsub("#{other_dir}", 'b')
272
299
  rescue
273
300
  ensure
274
- FileUtils.rm_rf this_dir
275
- FileUtils.rm_rf other_dir
301
+ FileUtils.rm_rf this_dir unless this_dir.nil?
302
+ FileUtils.rm_rf other_dir unless other_dir.nil? ||
303
+ !other.is_a?(Polisher::Gem)
276
304
  end
277
305
 
278
306
  out