polisher 0.10.2 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/bin/binary_gem_resolver.rb +2 -2
  3. data/bin/bundler2yum.rb +51 -0
  4. data/bin/check_ruby_spec.rb +32 -0
  5. data/bin/gem_dependency_checker.rb +13 -242
  6. data/bin/gem_mapper.rb +27 -0
  7. data/bin/gems2update.rb +27 -0
  8. data/bin/git_gem_diff.rb +48 -0
  9. data/bin/git_gem_updater.rb +3 -3
  10. data/bin/missing_deps.rb +29 -0
  11. data/bin/polisher-config.rb +17 -0
  12. data/bin/ruby_rpm_spec_updater.rb +23 -2
  13. data/lib/polisher.rb +5 -12
  14. data/lib/polisher/adaptors/checker_loader.rb +78 -0
  15. data/lib/polisher/{upstream.rb → adaptors/upstream.rb} +1 -0
  16. data/lib/polisher/adaptors/version_checker.rb +57 -0
  17. data/lib/polisher/adaptors/version_checker/bodhi.rb +29 -0
  18. data/lib/polisher/adaptors/version_checker/errata.rb +29 -0
  19. data/lib/polisher/adaptors/version_checker/fedora.rb +29 -0
  20. data/lib/polisher/adaptors/version_checker/gem.rb +27 -0
  21. data/lib/polisher/adaptors/version_checker/git.rb +29 -0
  22. data/lib/polisher/adaptors/version_checker/koji.rb +29 -0
  23. data/lib/polisher/adaptors/version_checker/yum.rb +29 -0
  24. data/lib/polisher/cli/all.rb +22 -0
  25. data/lib/polisher/cli/bin/gem_dependency_checker.rb +85 -0
  26. data/lib/polisher/cli/bin/gem_mapper.rb +37 -0
  27. data/lib/polisher/cli/bin/gems2update.rb +86 -0
  28. data/lib/polisher/cli/bin/missing_deps.rb +35 -0
  29. data/lib/polisher/cli/conf.rb +18 -0
  30. data/lib/polisher/cli/default.rb +25 -0
  31. data/lib/polisher/cli/format.rb +130 -0
  32. data/lib/polisher/cli/sources.rb +106 -0
  33. data/lib/polisher/cli/specifier.rb +30 -0
  34. data/lib/polisher/cli/status.rb +50 -0
  35. data/lib/polisher/cli/targets.rb +88 -0
  36. data/lib/polisher/gem.rb +41 -338
  37. data/lib/polisher/gem/attributes.rb +20 -0
  38. data/lib/polisher/gem/dependencies.rb +63 -0
  39. data/lib/polisher/gem/diff.rb +39 -0
  40. data/lib/polisher/gem/files.rb +111 -0
  41. data/lib/polisher/gem/parser.rb +85 -0
  42. data/lib/polisher/gem/retriever.rb +137 -0
  43. data/lib/polisher/{gem_state.rb → gem/state.rb} +6 -6
  44. data/lib/polisher/gem/versions.rb +131 -0
  45. data/lib/polisher/gemfile.rb +20 -89
  46. data/lib/polisher/gemfile/attributes.rb +19 -0
  47. data/lib/polisher/gemfile/deps.rb +43 -0
  48. data/lib/polisher/gemfile/parser.rb +45 -0
  49. data/lib/polisher/git/pkg.rb +33 -238
  50. data/lib/polisher/git/pkg/attributes.rb +60 -0
  51. data/lib/polisher/git/pkg/builder.rb +47 -0
  52. data/lib/polisher/git/pkg/repo.rb +82 -0
  53. data/lib/polisher/git/pkg/updater.rb +53 -0
  54. data/lib/polisher/git/pkg/versions.rb +40 -0
  55. data/lib/polisher/git/project.rb +1 -1
  56. data/lib/polisher/git/repo.rb +79 -76
  57. data/lib/polisher/{vendor.rb → mixins/vendored_deps.rb} +4 -7
  58. data/lib/polisher/mixins/versioned_dependencies.rb +86 -0
  59. data/lib/polisher/record.rb +2 -0
  60. data/lib/polisher/rpm.rb +23 -0
  61. data/lib/polisher/rpm/patch.rb +10 -8
  62. data/lib/polisher/rpm/requirement.rb +33 -189
  63. data/lib/polisher/rpm/requirement/attributes.rb +43 -0
  64. data/lib/polisher/rpm/requirement/comparison.rb +97 -0
  65. data/lib/polisher/rpm/requirement/gem_reference.rb +46 -0
  66. data/lib/polisher/rpm/requirement/parser.rb +41 -0
  67. data/lib/polisher/rpm/spec.rb +97 -436
  68. data/lib/polisher/rpm/spec/check.rb +14 -0
  69. data/lib/polisher/rpm/spec/comparison.rb +64 -0
  70. data/lib/polisher/rpm/spec/files.rb +15 -0
  71. data/lib/polisher/rpm/spec/gem_files.rb +65 -0
  72. data/lib/polisher/rpm/spec/gem_reference.rb +59 -0
  73. data/lib/polisher/rpm/spec/gem_requirements.rb +73 -0
  74. data/lib/polisher/rpm/spec/parser.rb +106 -0
  75. data/lib/polisher/rpm/spec/requirements.rb +31 -0
  76. data/lib/polisher/rpm/spec/subpackages.rb +23 -0
  77. data/lib/polisher/rpm/spec/updater.rb +268 -0
  78. data/lib/polisher/specifier.rb +13 -0
  79. data/lib/polisher/targets.rb +36 -0
  80. data/lib/polisher/{apt.rb → targets/apt.rb} +1 -1
  81. data/lib/polisher/targets/bodhi.rb +43 -0
  82. data/lib/polisher/{bugzilla.rb → targets/bugzilla.rb} +1 -1
  83. data/lib/polisher/targets/errata.rb +55 -0
  84. data/lib/polisher/targets/errata/build.rb +24 -0
  85. data/lib/polisher/targets/fedora.rb +47 -0
  86. data/lib/polisher/targets/koji.rb +39 -0
  87. data/lib/polisher/targets/koji/builder.rb +38 -0
  88. data/lib/polisher/targets/koji/diff.rb +39 -0
  89. data/lib/polisher/targets/koji/rpc.rb +43 -0
  90. data/lib/polisher/targets/koji/versions.rb +67 -0
  91. data/lib/polisher/targets/rhn.rb +12 -0
  92. data/lib/polisher/targets/yum.rb +36 -0
  93. data/lib/polisher/{component.rb → util/component.rb} +3 -3
  94. data/lib/polisher/util/conf_helpers.rb +77 -0
  95. data/lib/polisher/util/config.rb +45 -0
  96. data/lib/polisher/util/core_ext.rb +59 -0
  97. data/lib/polisher/{error.rb → util/error.rb} +0 -0
  98. data/lib/polisher/{gem_cache.rb → util/gem_cache.rb} +1 -1
  99. data/lib/polisher/{git_cache.rb → util/git_cache.rb} +0 -0
  100. data/lib/polisher/{logger.rb → util/logger.rb} +2 -0
  101. data/lib/polisher/{tag_mapper.rb → util/tag_mapper.rb} +1 -1
  102. data/lib/polisher/version.rb +1 -1
  103. data/spec/{upstream_spec.rb → adaptors/upstream_spec.rb} +1 -1
  104. data/spec/{version_checker_spec.rb → adaptors/version_checker_spec.rb} +1 -6
  105. data/spec/data/activesupport-4.1.4.gem +0 -0
  106. data/spec/data/rubygem-activesupport-with-doc.spec +247 -0
  107. data/spec/data/rubygem-activesupport-without-requires.spec +232 -0
  108. data/spec/data/rubygem-activesupport.spec +0 -122
  109. data/spec/fixtures/gem_json.rb +49 -0
  110. data/spec/fixtures/gem_spec.rb +13 -0
  111. data/spec/fixtures/gemfile.rb +10 -0
  112. data/spec/fixtures/local_gem.rb +62 -0
  113. data/spec/fixtures/rpm_spec.rb +91 -0
  114. data/spec/gem/attributes_spec.rb +17 -0
  115. data/spec/gem/diff_spec.rb +80 -0
  116. data/spec/gem/files_spec.rb +171 -0
  117. data/spec/gem/parser_spec.rb +44 -0
  118. data/spec/gem/retriever_spec.rb +124 -0
  119. data/spec/gem/state_spec.rb +79 -0
  120. data/spec/gem/versions_spec.rb +148 -0
  121. data/spec/gem_spec.rb +5 -347
  122. data/spec/gemfile/deps_spec.rb +20 -0
  123. data/spec/gemfile/parser_spec.rb +26 -0
  124. data/spec/gemfile_spec.rb +0 -34
  125. data/spec/git/pkg/attributes_spec.rb +128 -0
  126. data/spec/git/pkg/builder_spec.rb +63 -0
  127. data/spec/git/pkg/repo_spec.rb +146 -0
  128. data/spec/git/pkg/updater_spec.rb +86 -0
  129. data/spec/git/pkg/versions_spec.rb +42 -0
  130. data/spec/git/pkg_spec.rb +21 -0
  131. data/spec/git/project_spec.rb +21 -0
  132. data/spec/git/repo_spec.rb +160 -0
  133. data/spec/{vendor_spec.rb → mixins/vendored_deps_spec.rb} +2 -4
  134. data/spec/mixins/versioned_dependencies_spec.rb +48 -0
  135. data/spec/rpm/patch_spec.rb +48 -0
  136. data/spec/rpm/requirement/attributes_spec.rb +34 -0
  137. data/spec/rpm/requirement/comparison_spec.rb +286 -0
  138. data/spec/rpm/requirement/gem_spec.rb +49 -0
  139. data/spec/rpm/requirement/parser_spec.rb +31 -0
  140. data/spec/rpm/requirement_spec.rb +8 -334
  141. data/spec/rpm/spec/check_spec.rb +25 -0
  142. data/spec/rpm/spec/comparison_spec.rb +55 -0
  143. data/spec/rpm/spec/files_spec.rb +17 -0
  144. data/spec/rpm/spec/gem_files_spec.rb +112 -0
  145. data/spec/rpm/spec/gem_reference_spec.rb +99 -0
  146. data/spec/rpm/spec/gem_requirement_spec.rb +38 -0
  147. data/spec/rpm/spec/parser_spec.rb +64 -0
  148. data/spec/rpm/spec/requirements_spec.rb +10 -0
  149. data/spec/rpm/spec/subpackages_spec.rb +38 -0
  150. data/spec/rpm/spec/updater_spec.rb +486 -0
  151. data/spec/rpm/spec_spec.rb +27 -174
  152. data/spec/spec_helper.rb +7 -107
  153. data/spec/support/coveralls.rb +10 -0
  154. data/spec/support/fixtures.rb +8 -0
  155. data/spec/support/paths.rb +20 -0
  156. data/spec/support/rspec.rb +20 -0
  157. data/spec/support/vcr.rb +11 -0
  158. data/spec/{bodhi_spec.rb → targets/bodhi_spec.rb} +3 -1
  159. data/spec/{errata_spec.rb → targets/errata_spec.rb} +2 -2
  160. data/spec/{fedora_spec.rb → targets/fedora_spec.rb} +3 -3
  161. data/spec/targets/koji/builder_spec.rb +48 -0
  162. data/spec/targets/koji/diff_spec.rb +36 -0
  163. data/spec/targets/koji/rpc_spec.rb +28 -0
  164. data/spec/{koji_spec.rb → targets/koji/versions_spec.rb} +1 -59
  165. data/spec/targets/koji_spec.rb +11 -0
  166. data/spec/{yum_spec.rb → targets/yum_spec.rb} +1 -1
  167. data/spec/{component_spec.rb → util/component_spec.rb} +1 -1
  168. data/spec/{core_spec.rb → util/core_ext_spec.rb} +2 -3
  169. metadata +278 -88
  170. data/lib/polisher/bodhi.rb +0 -23
  171. data/lib/polisher/config.rb +0 -32
  172. data/lib/polisher/core.rb +0 -101
  173. data/lib/polisher/errata.rb +0 -75
  174. data/lib/polisher/fedora.rb +0 -46
  175. data/lib/polisher/git.rb +0 -8
  176. data/lib/polisher/koji.rb +0 -159
  177. data/lib/polisher/rhn.rb +0 -15
  178. data/lib/polisher/version_checker.rb +0 -177
  179. data/lib/polisher/yum.rb +0 -37
  180. data/spec/git_spec.rb +0 -445
@@ -0,0 +1,268 @@
1
+ # RPM Spec Updater Mixin
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ require 'polisher/gem'
7
+ require 'polisher/rpm'
8
+
9
+ module Polisher
10
+ module RPM
11
+ module SpecUpdater
12
+ # Update RPM::Spec metadata to new gem
13
+ #
14
+ # @param [Polisher::Gem] new_source new gem to update rpmspec to
15
+ def update_to(new_source)
16
+ update_deps_from(new_source)
17
+ update_files_from(new_source)
18
+ update_metadata_from(new_source)
19
+ update_contents
20
+ end
21
+
22
+ # Return updated spec requirements
23
+ def updated_requires_for(new_source)
24
+ non_gem_requirements + extra_gem_requirements(new_source) +
25
+ new_source.deps.select { |r| !excludes_dep?(r.name) }
26
+ .collect { |r| RPM::Requirement.from_gem_dep(r) }.flatten
27
+ end
28
+
29
+ # Return updated spec build requires
30
+ def updated_build_requires_for(new_source)
31
+ non_gem_build_requirements + extra_gem_build_requirements(new_source) +
32
+ new_source.dev_deps.select { |r| !excludes_dev_dep?(r.name) }
33
+ .collect { |r| RPM::Requirement.from_gem_dep(r, true) }.flatten
34
+ end
35
+
36
+ def changelog_index
37
+ @metadata[:contents].index RPM::Spec::SPEC_CHANGELOG_MATCHER
38
+ end
39
+
40
+ def changelog_end_index
41
+ ci = changelog_index
42
+ ci.nil? ? (@metadata[:contents].length - 1) :
43
+ (@metadata[:contents].index "\n", ci) + 1
44
+ end
45
+
46
+ def requires_contents
47
+ @metadata[:requires].collect { |r| "Requires: #{r.str}" }.join("\n")
48
+ end
49
+
50
+ def build_requires_contents
51
+ @metadata[:build_requires].collect { |r| "BuildRequires: #{r.str}" }
52
+ .join("\n")
53
+ end
54
+
55
+ def first_requires_index
56
+ @metadata[:contents].index RPM::Spec::SPEC_REQUIRES_MATCHER
57
+ end
58
+
59
+ def first_build_requires_index
60
+ @metadata[:contents].index RPM::Spec::SPEC_BUILD_REQUIRES_MATCHER
61
+ end
62
+
63
+ def requirement_section_index
64
+ ri = first_requires_index
65
+ bri = first_build_requires_index
66
+
67
+ # Requires missing (e.g. section is auto-generated)
68
+ return bri unless ri
69
+ ri < bri ? ri : bri
70
+ end
71
+
72
+ # Main package ends either with subpkg specification
73
+ # or with a %description or %prep section
74
+ def last_main_package_index
75
+ description_index || subpkg_index || prep_index || -1
76
+ end
77
+
78
+ def description_index
79
+ @metadata[:contents].index RPM::Spec::SPEC_DESCRIPTION_MATCHER
80
+ end
81
+
82
+ def prep_index
83
+ @metadata[:contents].index RPM::Spec::SPEC_PREP_MATCHER
84
+ end
85
+
86
+ def subpkg_index
87
+ @metadata[:contents].index RPM::Spec::SPEC_SUBPACKAGE_MATCHER
88
+ end
89
+
90
+ def last_requires_index
91
+ @metadata[:contents].rindex(RPM::Spec::SPEC_REQUIRES_MATCHER, last_main_package_index) || -1
92
+ end
93
+
94
+ def last_build_requires_index
95
+ @metadata[:contents].rindex(RPM::Spec::SPEC_BUILD_REQUIRES_MATCHER, last_main_package_index) || -1
96
+ end
97
+
98
+ def last_requirement_index
99
+ lri = last_requires_index
100
+ lbri = last_build_requires_index
101
+ lri > lbri ? lri : lbri
102
+ end
103
+
104
+ def requirement_section_end_index
105
+ @metadata[:contents].index "\n", last_requirement_index
106
+ end
107
+
108
+ def new_files_contents_for(pkg)
109
+ has_new_files = @metadata.key?(:new_files) && @metadata[:new_files].key?(pkg)
110
+ return "" unless has_new_files
111
+
112
+ title = pkg == gem_name ? "%files\n" : "%files #{pkg}\n"
113
+ contents = @metadata[:new_files][pkg].join("\n") + "\n"
114
+ title + contents
115
+ end
116
+
117
+ def new_subpkg_files_contents
118
+ has_new_files = @metadata.key?(:new_files)
119
+ return "" unless has_new_files
120
+
121
+ @metadata[:new_files].keys
122
+ .select { |pkg| pkg != gem_name }
123
+ .collect { |pkg| new_files_contents_for(pkg) }.join("\n\n") + "\n\n"
124
+ end
125
+
126
+ def excludes_contents
127
+ if @metadata[:pkg_excludes][gem_name]
128
+ @metadata[:pkg_excludes][gem_name]
129
+ .collect { |exclude| "%exclude #{exclude}" }
130
+ .join("\n") + "\n\n"
131
+ else
132
+ ''
133
+ end
134
+ end
135
+
136
+ def files_index
137
+ @metadata[:contents].index RPM::Spec::SPEC_FILES_MATCHER
138
+ end
139
+
140
+ def files_end_index
141
+ @metadata[:contents].index RPM::Spec::SPEC_CHANGELOG_MATCHER
142
+ end
143
+
144
+ private
145
+
146
+ def update_requires
147
+ new_contents = (requires_contents + "\n" + build_requires_contents).strip
148
+ rsi = requirement_section_index || last_main_package_index
149
+ rsei = requirement_section_end_index
150
+ @metadata[:contents].slice!(rsi...rsei) unless rsei.nil?
151
+ @metadata[:contents].insert rsi, new_contents
152
+ end
153
+
154
+
155
+ def update_files
156
+ # update files
157
+ fi = files_index || files_end_index || length
158
+ fei = files_end_index
159
+ @metadata[:contents].slice!(fi...files_end_index) unless fei.nil?
160
+
161
+ contents = new_files_contents_for(gem_name) +
162
+ excludes_contents +
163
+ new_subpkg_files_contents
164
+
165
+ @metadata[:contents].insert fi, contents
166
+ end
167
+
168
+ # Update spec dependencies from new source
169
+ def update_deps_from(new_source)
170
+ update_requires_from new_source
171
+ update_build_requires_from new_source
172
+ end
173
+
174
+ # Update requires from new source
175
+ def update_requires_from(new_source)
176
+ @metadata[:requires] = updated_requires_for(new_source)
177
+ end
178
+
179
+ # Update build requires from new source
180
+ def update_build_requires_from(new_source)
181
+ @metadata[:build_requires] = updated_build_requires_for(new_source)
182
+ end
183
+
184
+ # Internal helper to update spec files from new source
185
+ def update_files_from(new_source)
186
+ # populate file list from rpmized versions of new source files
187
+ # minus excluded files minus duplicates (files taken care by other
188
+ # dirs on list)
189
+ #
190
+ # TODO: also detect / add files from SOURCES & PATCHES
191
+ gem_files = new_source.file_paths - excluded_files
192
+ gem_files.reject! do |file|
193
+ gem_files.any? do |other|
194
+ other != file && self.class.file_satisfies?(other, file)
195
+ end
196
+ end
197
+
198
+ @metadata[:new_files] = {}
199
+ @metadata[:pkg_excludes] ||= {}
200
+ gem_files.each do |gem_file|
201
+ pkg = subpkg_containing(gem_file)
202
+ pkg = gem_name if pkg.nil?
203
+ if Gem.ignorable_file?(gem_file)
204
+ @metadata[:pkg_excludes] ||= []
205
+ @metadata[:pkg_excludes][pkg] << gem_file.rpmize
206
+
207
+ elsif Gem.runtime_file?(gem_file) || Gem.license_file?(gem_file)
208
+ @metadata[:new_files][pkg] ||= []
209
+ @metadata[:new_files][pkg] << gem_file.rpmize
210
+
211
+ # All files not required for runtime should go
212
+ # into -doc subpackage if -doc subpackage exists
213
+ else
214
+ package = has_doc_subpkg? ? 'doc' : pkg
215
+
216
+ @metadata[:new_files][package] ||= []
217
+ @metadata[:new_files][package] << gem_file.rpmize
218
+ end
219
+ end
220
+
221
+ extra_gem_files.each do |pkg, files|
222
+ @metadata[:new_files][pkg] ||= []
223
+ @metadata[:new_files][pkg] += files.collect { |file| file.rpmize }
224
+ end
225
+ end
226
+
227
+ # Internal helper to update spec metadata from new source
228
+ def update_metadata_from(new_source)
229
+ # update to new version
230
+ @metadata[:version] = new_source.version
231
+ @metadata[:release] = "1%{?dist}"
232
+
233
+ # invalidate the local gem
234
+ @update_gem = true
235
+
236
+ # add changelog entry
237
+ changelog_entry = <<EOS
238
+ * #{Time.now.strftime("%a %b %d %Y")} #{RPM.current_author} - #{@metadata[:version]}-1
239
+ - Update #{@metadata[:gem_name]} to version #{new_source.version}
240
+ EOS
241
+ @metadata[:changelog_entries] ||= []
242
+ @metadata[:changelog_entries].unshift changelog_entry.rstrip
243
+ end
244
+
245
+ def update_metadata_contents
246
+ # replace version / release
247
+ @metadata[:contents].gsub!(RPM::Spec::SPEC_VERSION_MATCHER,
248
+ "Version: #{@metadata[:version]}")
249
+ @metadata[:contents].gsub!(RPM::Spec::SPEC_RELEASE_MATCHER,
250
+ "Release: #{@metadata[:release]}")
251
+ end
252
+
253
+ def update_changelog
254
+ # add changelog entry
255
+ cei = changelog_end_index
256
+ @metadata[:contents] = @metadata[:contents][0...cei] +
257
+ @metadata[:changelog_entries].join("\n\n")
258
+ end
259
+
260
+ def update_contents
261
+ update_metadata_contents
262
+ update_changelog
263
+ update_requires
264
+ update_files
265
+ end
266
+ end # module SpecUpdater
267
+ end # module RPM
268
+ end # module Polisher
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/ruby
2
+ # Polisher Gem Specifier Options
3
+ #
4
+ # Licensed under the MIT license
5
+ # Copyright (C) 2015 Red Hat, Inc.
6
+ ###########################################################
7
+
8
+ module Polisher
9
+ EARLIEST_SPECIFIER = :earliest
10
+ LATEST_SPECIFIER = :latest
11
+
12
+ RELATIVE_SPECIFIERS = [EARLIEST_SPECIFIER, LATEST_SPECIFIER]
13
+ end # module Polisher
@@ -0,0 +1,36 @@
1
+ # Polisher Targets
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ require 'polisher/targets/apt'
7
+ require 'polisher/targets/bodhi'
8
+ require 'polisher/targets/bugzilla'
9
+ require 'polisher/targets/errata'
10
+ require 'polisher/targets/fedora'
11
+ require 'polisher/targets/koji'
12
+ require 'polisher/targets/rhn'
13
+ require 'polisher/targets/yum'
14
+
15
+ module Polisher
16
+ def self.target(name)
17
+ case name
18
+ when 'apt'
19
+ Polisher::Apt
20
+ when 'bodhi'
21
+ Polisher::Bodhi
22
+ when 'bugzilla'
23
+ Polisher::Bugzilla
24
+ when 'errata'
25
+ Polisher::Errata
26
+ when 'fedora'
27
+ Polisher::Fedora
28
+ when 'koji'
29
+ Polisher::Koji
30
+ when 'rhn'
31
+ Polisher::RHN
32
+ when 'yum'
33
+ Polisher::Yum
34
+ end
35
+ end
36
+ end # module Polisher
@@ -5,7 +5,7 @@
5
5
 
6
6
  module Polisher
7
7
  class Apt
8
- def self.version_for(name)
8
+ def self.version_for(_name)
9
9
  # TODO
10
10
  end
11
11
  end
@@ -0,0 +1,43 @@
1
+ # Polisher Bodhi Operations
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ # XXX issue w/ retreiving packages from pkgwat causing sporadic issues:
7
+ # https://github.com/fedora-infra/fedora-packages/issues/55
8
+
9
+ # another issue seems to result in url's sometimes
10
+ # html anchors being returned in version field, use
11
+ # nokogiri to pull this out
12
+ require 'nokogiri'
13
+
14
+ module Polisher
15
+ # fedora pkgwat provides a frontend to bodhi
16
+ class Bodhi
17
+ def self.versions_for(name, &bl)
18
+ require 'pkgwat'
19
+ versions = Pkgwat.get_updates("rubygem-#{name}", 'all', 'all')
20
+ .select { |update| update['stable_version'] != 'None' }
21
+ .collect { |update| update['stable_version'] }
22
+ versions = sanitize(versions)
23
+ bl.call(:bodhi, name, versions) unless bl.nil?
24
+ versions
25
+ end
26
+
27
+ private
28
+
29
+ def self.sanitize(versions)
30
+ versions.collect { |v|
31
+ is_url?(v) ? url2version(v) : v
32
+ }
33
+ end
34
+
35
+ def self.is_url?(version)
36
+ !Nokogiri::HTML(version).css('a').empty?
37
+ end
38
+
39
+ def self.url2version(version)
40
+ Nokogiri::HTML(version).text
41
+ end
42
+ end
43
+ end
@@ -3,7 +3,7 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- # TODO use ruby_bugzilla to search to packages in bz
6
+ # TODO: use ruby_bugzilla to search to packages in bz
7
7
 
8
8
  module Polisher
9
9
  class Bugzilla
@@ -0,0 +1,55 @@
1
+ # Polisher Errata Operations
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ require 'polisher/util/conf_helpers'
7
+ require 'polisher/targets/errata/build'
8
+
9
+ module Polisher
10
+ class Errata
11
+ include ConfHelpers
12
+
13
+ conf_attr :advisory_url, ''
14
+ conf_attr :package_prefix, 'rubygem-'
15
+
16
+ # Initialize/return singleton curl handle to query errata
17
+ def self.client
18
+ @curl ||= begin
19
+ curl = Curl::Easy.new
20
+ curl.ssl_verify_peer = false
21
+ curl.ssl_verify_host = false
22
+ curl.http_auth_types = :negotiate
23
+ curl.userpwd = ':'
24
+ curl
25
+ end
26
+ end
27
+
28
+ def self.clear!
29
+ @cached_url = nil
30
+ @cached_builds = nil
31
+ self
32
+ end
33
+
34
+ def self.builds
35
+ @cached_url ||= advisory_url
36
+ @cached_builds ||= nil
37
+
38
+ if @cached_url != advisory_url || @cached_builds.nil?
39
+ client.url = "#{advisory_url}/builds"
40
+ @cached_builds = client.get
41
+ @cached_builds = JSON.parse(client.body_str)
42
+ end
43
+
44
+ @cached_builds
45
+ end
46
+
47
+ def self.versions_for(name, &bl)
48
+ versions = builds.collect do |_tag, builds|
49
+ ErrataBuild.builds_matching(builds, name)
50
+ end.flatten
51
+ bl.call(:errata, name, versions) unless bl.nil?
52
+ versions
53
+ end
54
+ end # class Errata
55
+ end # module Polisher
@@ -0,0 +1,24 @@
1
+ # Polisher Errata Operations
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ module Polisher
7
+ class ErrataBuild
8
+ def self.builds_matching(builds, name)
9
+ builds.collect do |build|
10
+ build_matches?(build, name) ? build_version(build) : nil
11
+ end.compact
12
+ end
13
+
14
+ def self.build_matches?(build, name)
15
+ pkg, _meta = *build.flatten
16
+ pkg =~ /^#{Errata.package_prefix}#{name}-([^-]*)-.*$/
17
+ end
18
+
19
+ def self.build_version(build)
20
+ pkg, _meta = *build.flatten
21
+ pkg.gsub(Errata.package_prefix, '').split('-')[1]
22
+ end
23
+ end # class ErrataBuild
24
+ end # module Polisher