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 +4 -4
- data/bin/binary_gem_resolver.rb +1 -1
- data/bin/gem_dependency_checker.rb +12 -8
- data/bin/git_gem_updater.rb +6 -5
- data/bin/ruby_rpm_spec_updater.rb +1 -1
- data/lib/polisher.rb +3 -1
- data/lib/polisher/core.rb +47 -4
- data/lib/polisher/errata.rb +0 -1
- data/lib/polisher/error.rb +7 -0
- data/lib/polisher/gem.rb +105 -77
- data/lib/polisher/gemfile.rb +43 -27
- data/lib/polisher/git.rb +3 -230
- data/lib/polisher/git/pkg.rb +189 -0
- data/lib/polisher/git/project.rb +23 -0
- data/lib/polisher/git/repo.rb +74 -0
- data/lib/polisher/koji.rb +10 -16
- data/lib/polisher/rpm/patch.rb +44 -0
- data/lib/polisher/rpm/requirement.rb +188 -0
- data/lib/polisher/rpm/spec.rb +381 -0
- data/lib/polisher/vendor.rb +28 -0
- data/lib/polisher/version.rb +1 -1
- data/lib/polisher/version_checker.rb +13 -9
- data/spec/gem_spec.rb +2 -25
- data/spec/gemfile_spec.rb +13 -0
- data/spec/git_spec.rb +34 -10
- data/spec/rpmspec_spec.rb +36 -36
- data/spec/spec_helper.rb +29 -29
- data/spec/vendor_spec.rb +41 -0
- metadata +10 -5
- data/lib/polisher/formatter.rb +0 -1
- data/lib/polisher/gemspec.rb +0 -32
- data/lib/polisher/rpmspec.rb +0 -512
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
SPEC_DIR = File.expand_path File.dirname(__FILE__)
|
7
7
|
|
8
|
-
require 'polisher/
|
8
|
+
require 'polisher/rpm/spec'
|
9
9
|
require 'polisher/gem_cache'
|
10
10
|
|
11
11
|
RSpec.configure do |config|
|
@@ -67,34 +67,34 @@ module Polisher
|
|
67
67
|
:name => "activesupport",
|
68
68
|
:version => "4.0.0",
|
69
69
|
:release => "1%{?dist}",
|
70
|
-
:requires => [Polisher::
|
71
|
-
Polisher::
|
72
|
-
Polisher::
|
73
|
-
Polisher::
|
74
|
-
Polisher::
|
75
|
-
Polisher::
|
76
|
-
Polisher::
|
77
|
-
Polisher::
|
78
|
-
Polisher::
|
79
|
-
Polisher::
|
80
|
-
Polisher::
|
81
|
-
Polisher::
|
82
|
-
Polisher::
|
83
|
-
Polisher::
|
84
|
-
:build_requires => [Polisher::
|
85
|
-
Polisher::
|
86
|
-
Polisher::
|
87
|
-
Polisher::
|
88
|
-
Polisher::
|
89
|
-
Polisher::
|
90
|
-
Polisher::
|
91
|
-
Polisher::
|
92
|
-
Polisher::
|
93
|
-
Polisher::
|
94
|
-
Polisher::
|
95
|
-
Polisher::
|
96
|
-
Polisher::
|
97
|
-
Polisher::
|
70
|
+
:requires => [Polisher::RPM::Requirement.parse("ruby(rubygems)"),
|
71
|
+
Polisher::RPM::Requirement.parse("ruby(release)"),
|
72
|
+
Polisher::RPM::Requirement.parse("rubygem(bigdecimal)"),
|
73
|
+
Polisher::RPM::Requirement.parse("rubygem(dalli)"),
|
74
|
+
Polisher::RPM::Requirement.parse("rubygem(i18n) >= 0.6"),
|
75
|
+
Polisher::RPM::Requirement.parse("rubygem(i18n) < 1.0"),
|
76
|
+
Polisher::RPM::Requirement.parse("rubygem(minitest) >= 4.2"),
|
77
|
+
Polisher::RPM::Requirement.parse("rubygem(minitest) < 5"),
|
78
|
+
Polisher::RPM::Requirement.parse("rubygem(multi_json) >= 1.0"),
|
79
|
+
Polisher::RPM::Requirement.parse("rubygem(multi_json) < 2"),
|
80
|
+
Polisher::RPM::Requirement.parse("rubygem(rack)"),
|
81
|
+
Polisher::RPM::Requirement.parse("rubygem(thread_safe)"),
|
82
|
+
Polisher::RPM::Requirement.parse("rubygem(tzinfo) >= 0.3.37"),
|
83
|
+
Polisher::RPM::Requirement.parse("rubygem(tzinfo) < 0.4.0")],
|
84
|
+
:build_requires => [Polisher::RPM::Requirement.parse("rubygems-devel"),
|
85
|
+
Polisher::RPM::Requirement.parse("rubygem(bigdecimal)"),
|
86
|
+
Polisher::RPM::Requirement.parse("rubygem(builder)"),
|
87
|
+
Polisher::RPM::Requirement.parse("rubygem(dalli)"),
|
88
|
+
Polisher::RPM::Requirement.parse("rubygem(i18n) >= 0.6"),
|
89
|
+
Polisher::RPM::Requirement.parse("rubygem(i18n) < 1.0"),
|
90
|
+
Polisher::RPM::Requirement.parse("rubygem(minitest)"),
|
91
|
+
Polisher::RPM::Requirement.parse("rubygem(mocha)"),
|
92
|
+
Polisher::RPM::Requirement.parse("rubygem(multi_json) >= 1.0"),
|
93
|
+
Polisher::RPM::Requirement.parse("rubygem(multi_json) < 2"),
|
94
|
+
Polisher::RPM::Requirement.parse("rubygem(rack)"),
|
95
|
+
Polisher::RPM::Requirement.parse("rubygem(thread_safe)"),
|
96
|
+
Polisher::RPM::Requirement.parse("rubygem(tzinfo) >= 0.3.37"),
|
97
|
+
Polisher::RPM::Requirement.parse("rubygem(tzinfo) < 0.4.0")],
|
98
98
|
:changelog => "",
|
99
99
|
:files => {"activesupport"=>["%{gem_instdir}", "CHANGELOG.md", "lib", "MIT-LICENSE", "README.rdoc", "%{gem_docdir}", "%{gem_cache}", "%{gem_spec}", "test"]}
|
100
100
|
}
|
data/spec/vendor_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Polisher Vendor Specs
|
2
|
+
#
|
3
|
+
# Licensed under the MIT license
|
4
|
+
# Copyright (C) 2014 Red Hat, Inc.
|
5
|
+
|
6
|
+
require 'spec_helper'
|
7
|
+
|
8
|
+
require 'polisher/vendor'
|
9
|
+
|
10
|
+
module Polisher
|
11
|
+
describe HasVendoredDeps do
|
12
|
+
before(:each) do
|
13
|
+
@obj = Object.new
|
14
|
+
@obj.extend(HasVendoredDeps)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#vendored_file_paths" do
|
18
|
+
it "returns file marks in gem marked as vendored" do
|
19
|
+
expected = [ 'vendor/foo.rb', 'vendor/bar/foo.rb']
|
20
|
+
paths = ['foo.rb'] + expected
|
21
|
+
gem = Polisher::Gem.new
|
22
|
+
gem.should_receive(:file_paths).and_return(paths)
|
23
|
+
gem.vendored_file_paths.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#vendored" do
|
28
|
+
it "returns list of vendored modules in gem" do
|
29
|
+
gem = Polisher::Gem.new
|
30
|
+
vendored = ['vendor/thor.rb', 'vendor/thor/foo.rb', 'vendor/biz/baz.rb']
|
31
|
+
gem.should_receive(:vendored_file_paths).and_return(vendored)
|
32
|
+
gem.vendored.should == {'thor' => nil, 'biz' => nil}
|
33
|
+
end
|
34
|
+
|
35
|
+
context "vendored module has VERSION.rb file" do
|
36
|
+
it "returns version of vendored gems"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polisher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Frey
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-02-
|
14
|
+
date: 2014-02-27 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
@@ -192,16 +192,20 @@ files:
|
|
192
192
|
- lib/polisher/errata.rb
|
193
193
|
- lib/polisher/git_cache.rb
|
194
194
|
- lib/polisher/gem.rb
|
195
|
+
- lib/polisher/rpm/spec.rb
|
196
|
+
- lib/polisher/rpm/patch.rb
|
197
|
+
- lib/polisher/rpm/requirement.rb
|
195
198
|
- lib/polisher/git.rb
|
199
|
+
- lib/polisher/error.rb
|
196
200
|
- lib/polisher/upstream.rb
|
197
201
|
- lib/polisher/bugzilla.rb
|
198
202
|
- lib/polisher/gemfile.rb
|
199
|
-
- lib/polisher/
|
203
|
+
- lib/polisher/git/project.rb
|
204
|
+
- lib/polisher/git/pkg.rb
|
205
|
+
- lib/polisher/git/repo.rb
|
200
206
|
- lib/polisher/koji.rb
|
201
|
-
- lib/polisher/rpmspec.rb
|
202
207
|
- lib/polisher/gem_cache.rb
|
203
208
|
- lib/polisher/rhn.rb
|
204
|
-
- lib/polisher/gemspec.rb
|
205
209
|
- lib/polisher/yum.rb
|
206
210
|
- lib/polisher.rb
|
207
211
|
- spec/git_spec.rb
|
@@ -214,6 +218,7 @@ files:
|
|
214
218
|
- spec/yum_spec.rb
|
215
219
|
- spec/upstream_spec.rb
|
216
220
|
- spec/rpmspec_spec.rb
|
221
|
+
- spec/vendor_spec.rb
|
217
222
|
- spec/fedora_spec.rb
|
218
223
|
- spec/core_spec.rb
|
219
224
|
- spec/data/rails.json
|
data/lib/polisher/formatter.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# TODO
|
data/lib/polisher/gemspec.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# Polisher Gemspec Represenation
|
2
|
-
#
|
3
|
-
# Licensed under the MIT license
|
4
|
-
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
|
-
|
6
|
-
require 'polisher/version_checker'
|
7
|
-
|
8
|
-
module Polisher
|
9
|
-
class Gemspec
|
10
|
-
include VersionedDependencies
|
11
|
-
|
12
|
-
attr_accessor :deps
|
13
|
-
|
14
|
-
def initialize(args={})
|
15
|
-
@deps = args[:deps]
|
16
|
-
end
|
17
|
-
|
18
|
-
# Parse the specified gemspec & return new Gemspec instance from metadata
|
19
|
-
#
|
20
|
-
# @param [String] path to gemspec to parse
|
21
|
-
# @return [Polisher::Gemspec] gemspec instantiated from parsed metadata
|
22
|
-
def self.parse(path)
|
23
|
-
parser = Gemnasium::Parser.gemspec(File.read(path))
|
24
|
-
metadata = {:deps => [], :dev_deps => []}
|
25
|
-
parser.dependencies.each { |dep|
|
26
|
-
metadata[:deps] << dep.name
|
27
|
-
}
|
28
|
-
|
29
|
-
self.new metadata
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/polisher/rpmspec.rb
DELETED
@@ -1,512 +0,0 @@
|
|
1
|
-
# Polisher RPM Spec Represenation
|
2
|
-
#
|
3
|
-
# Licensed under the MIT license
|
4
|
-
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
|
-
|
6
|
-
require 'gem2rpm'
|
7
|
-
require 'versionomy'
|
8
|
-
require 'active_support/core_ext'
|
9
|
-
|
10
|
-
require 'polisher/core'
|
11
|
-
require 'polisher/gem'
|
12
|
-
|
13
|
-
module Polisher
|
14
|
-
class RPMSpec
|
15
|
-
class Requirement
|
16
|
-
# Bool indiciating if req is a BR
|
17
|
-
attr_accessor :br
|
18
|
-
|
19
|
-
# Name of requirement
|
20
|
-
attr_accessor :name
|
21
|
-
|
22
|
-
# Condition, eg >=, =, etc
|
23
|
-
attr_accessor :condition
|
24
|
-
|
25
|
-
# Version number
|
26
|
-
attr_accessor :version
|
27
|
-
|
28
|
-
# Requirement string
|
29
|
-
def str
|
30
|
-
sp = self.specifier
|
31
|
-
sp.nil? ? "#{@name}" : "#{@name} #{sp}"
|
32
|
-
end
|
33
|
-
|
34
|
-
# Specified string
|
35
|
-
def specifier
|
36
|
-
@version.nil? ? nil : "#{@condition} #{@version}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.parse(str, opts={})
|
40
|
-
stra = str.split
|
41
|
-
br = str.include?('BuildRequires')
|
42
|
-
name = condition = version = nil
|
43
|
-
|
44
|
-
if str.include?('Requires')
|
45
|
-
name = stra[1]
|
46
|
-
condition = stra[2]
|
47
|
-
version = stra[3]
|
48
|
-
|
49
|
-
else
|
50
|
-
name = stra[0]
|
51
|
-
condition = stra[1]
|
52
|
-
version = stra[2]
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
req = self.new({:name => name,
|
57
|
-
:condition => condition,
|
58
|
-
:version => version,
|
59
|
-
:br => br}.merge(opts))
|
60
|
-
req
|
61
|
-
end
|
62
|
-
|
63
|
-
def initialize(args={})
|
64
|
-
@br = args[:br] || false
|
65
|
-
@name = args[:name]
|
66
|
-
@condition = args[:condition]
|
67
|
-
@version = args[:version]
|
68
|
-
|
69
|
-
@name.strip! unless @name.nil?
|
70
|
-
@condition.strip! unless @condition.nil?
|
71
|
-
@version.strip! unless @version.nil?
|
72
|
-
end
|
73
|
-
|
74
|
-
def ==(other)
|
75
|
-
@br == other.br &&
|
76
|
-
@name == other.name &&
|
77
|
-
@condition == other.condition &&
|
78
|
-
@version == other.version
|
79
|
-
end
|
80
|
-
|
81
|
-
# Greatest Common Denominator,
|
82
|
-
# Max version in list that is less than the local version
|
83
|
-
def gcd(versions)
|
84
|
-
lversion = Versionomy.parse(self.version)
|
85
|
-
versions.collect { |v| Versionomy.parse(v) }.
|
86
|
-
sort { |a,b| a <=> b }.reverse.
|
87
|
-
find { |v| v < lversion }.to_s
|
88
|
-
end
|
89
|
-
|
90
|
-
# Minimum gem version which satisfies this dependency
|
91
|
-
def min_satisfying_version
|
92
|
-
return "0.0" if self.version.nil? ||
|
93
|
-
self.condition == '<' ||
|
94
|
-
self.condition == '<='
|
95
|
-
return self.version if self.condition == '=' ||
|
96
|
-
self.condition == '>='
|
97
|
-
Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '>'
|
98
|
-
end
|
99
|
-
|
100
|
-
# Max gem version which satisfies this dependency
|
101
|
-
#
|
102
|
-
# Can't automatically deduce in '<' case, so if that is the conditional
|
103
|
-
# we require a version list, and will return the gcd from it
|
104
|
-
def max_satisfying_version(versions=nil)
|
105
|
-
return Float::INFINITY if self.version.nil? ||
|
106
|
-
self.condition == '>' ||
|
107
|
-
self.condition == '>='
|
108
|
-
return self.version if self.condition == '=' ||
|
109
|
-
self.condition == '<='
|
110
|
-
|
111
|
-
raise ArgumentError if versions.nil?
|
112
|
-
self.gcd(versions)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Minimum gem version for which this dependency fails
|
116
|
-
def min_failing_version
|
117
|
-
raise ArgumentError if self.version.nil?
|
118
|
-
return "0.0" if self.condition == '>' ||
|
119
|
-
self.condition == '>='
|
120
|
-
return self.version if self.condition == '<'
|
121
|
-
Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '<=' and '='
|
122
|
-
end
|
123
|
-
|
124
|
-
# Max gem version for which this dependency fails
|
125
|
-
#
|
126
|
-
# Can't automatically deduce in '>=', and '=' cases, so if that is the
|
127
|
-
# conditional we require a version list, and will return the gcd from it
|
128
|
-
def max_failing_version(versions=nil)
|
129
|
-
raise ArgumentError if self.version.nil? ||
|
130
|
-
self.condition == '<=' ||
|
131
|
-
self.condition == '<'
|
132
|
-
return self.version if self.condition == '>'
|
133
|
-
|
134
|
-
raise ArgumentError if versions.nil?
|
135
|
-
self.gcd(versions)
|
136
|
-
end
|
137
|
-
|
138
|
-
def matches?(dep)
|
139
|
-
return self == dep if dep.is_a?(self.class)
|
140
|
-
raise ArgumentError unless dep.is_a?(::Gem::Dependency)
|
141
|
-
|
142
|
-
return false if !self.gem? || self.gem_name != dep.name
|
143
|
-
return true if self.version.nil?
|
144
|
-
|
145
|
-
Gem2Rpm::Helpers.expand_requirement([dep.requirement.to_s.split]).
|
146
|
-
any?{ |req|
|
147
|
-
req.first == self.condition && req.last.to_s == self.version
|
148
|
-
}
|
149
|
-
end
|
150
|
-
|
151
|
-
def gem?
|
152
|
-
!!(self.str =~ SPEC_GEM_REQ_MATCHER)
|
153
|
-
end
|
154
|
-
|
155
|
-
def gem_name
|
156
|
-
# XXX need to explicitly run regex here to get $1
|
157
|
-
!!(self.str =~ SPEC_GEM_REQ_MATCHER) ? $1 : nil
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
AUTHOR = "#{ENV['USER']} <#{ENV['USER']}@localhost.localdomain>"
|
162
|
-
|
163
|
-
COMMENT_MATCHER = /^\s*#.*/
|
164
|
-
GEM_NAME_MATCHER = /^%global\s*gem_name\s(.*)$/
|
165
|
-
SPEC_NAME_MATCHER = /^Name:\s*rubygem-(.*)$/
|
166
|
-
SPEC_VERSION_MATCHER = /^Version:\s*(.*)$/
|
167
|
-
SPEC_RELEASE_MATCHER = /^Release:\s*(.*)$/
|
168
|
-
SPEC_REQUIRES_MATCHER = /^Requires:\s*(.*)$/
|
169
|
-
SPEC_BUILD_REQUIRES_MATCHER = /^BuildRequires:\s*(.*)$/
|
170
|
-
SPEC_GEM_REQ_MATCHER = /^.*\s*rubygem\((.*)\)(\s*(.*))?$/
|
171
|
-
SPEC_SUBPACKAGE_MATCHER = /^%package\s(.*)$/
|
172
|
-
SPEC_CHANGELOG_MATCHER = /^%changelog$/
|
173
|
-
SPEC_FILES_MATCHER = /^%files$/
|
174
|
-
SPEC_SUBPKG_FILES_MATCHER = /^%files\s*(.*)$/
|
175
|
-
SPEC_CHECK_MATCHER = /^%check$/
|
176
|
-
|
177
|
-
FILE_MACRO_MATCHERS =
|
178
|
-
[/^%doc\s/, /^%config\s/, /^%attr\s/,
|
179
|
-
/^%verify\s/, /^%docdir.*/, /^%dir\s/,
|
180
|
-
/^%defattr.*/, /^%exclude\s/, /^%{gem_instdir}\/+/]
|
181
|
-
|
182
|
-
FILE_MACRO_REPLACEMENTS =
|
183
|
-
{"%{_bindir}" => 'bin',
|
184
|
-
"%{gem_libdir}" => 'lib'}
|
185
|
-
|
186
|
-
attr_accessor :metadata
|
187
|
-
|
188
|
-
# Return the currently configured author
|
189
|
-
def self.current_author
|
190
|
-
ENV['POLISHER_AUTHOR'] || AUTHOR
|
191
|
-
end
|
192
|
-
|
193
|
-
def initialize(metadata={})
|
194
|
-
@metadata = metadata
|
195
|
-
end
|
196
|
-
|
197
|
-
# Dispatch all missing methods to lookup calls in rpm spec metadata
|
198
|
-
def method_missing(method, *args, &block)
|
199
|
-
# proxy to metadata
|
200
|
-
if @metadata.has_key?(method)
|
201
|
-
@metadata[method]
|
202
|
-
|
203
|
-
else
|
204
|
-
super(method, *args, &block)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def has_check?
|
209
|
-
@metadata.has_key?(:has_check) && @metadata[:has_check]
|
210
|
-
end
|
211
|
-
|
212
|
-
# Return all the requirements for the specified gem
|
213
|
-
def requirements_for_gem(gem_name)
|
214
|
-
@metadata[:requires].nil? ? [] :
|
215
|
-
@metadata[:requires].select { |r| r.gem_name == gem_name }
|
216
|
-
end
|
217
|
-
|
218
|
-
# Return bool indicating if this spec specifies all the
|
219
|
-
# requirements in the specified gem dependency
|
220
|
-
def has_all_requirements_for?(gem_dep)
|
221
|
-
reqs = self.requirements_for_gem gem_dep.name
|
222
|
-
# create a spec requirement dependency for each expanded subrequirement,
|
223
|
-
# verify we can find a match for that
|
224
|
-
gem_dep.requirement.to_s.split(',').all? { |greq|
|
225
|
-
Gem2Rpm::Helpers.expand_requirement([greq.split]).all? { |ereq|
|
226
|
-
tereq = Requirement.new :name => "rubygem(#{gem_dep.name})",
|
227
|
-
:condition => ereq.first,
|
228
|
-
:version => ereq.last.to_s
|
229
|
-
reqs.any? { |req| req.matches?(tereq)}
|
230
|
-
}
|
231
|
-
}
|
232
|
-
end
|
233
|
-
|
234
|
-
# Parse the specified rpm spec and return new RPMSpec instance from metadata
|
235
|
-
#
|
236
|
-
# @param [String] string contents of spec to parse
|
237
|
-
# @return [Polisher::RPMSpec] spec instantiated from rpmspec metadata
|
238
|
-
def self.parse(spec)
|
239
|
-
in_subpackage = false
|
240
|
-
in_changelog = false
|
241
|
-
in_files = false
|
242
|
-
subpkg_name = nil
|
243
|
-
meta = {:contents => spec}
|
244
|
-
spec.each_line { |l|
|
245
|
-
if l =~ COMMENT_MATCHER
|
246
|
-
;
|
247
|
-
|
248
|
-
# TODO support optional gem prefix
|
249
|
-
elsif l =~ GEM_NAME_MATCHER
|
250
|
-
meta[:gem_name] = $1.strip
|
251
|
-
meta[:gem_name] = $1.strip
|
252
|
-
|
253
|
-
elsif l =~ SPEC_NAME_MATCHER &&
|
254
|
-
$1.strip != "%{gem_name}"
|
255
|
-
meta[:gem_name] = $1.strip
|
256
|
-
|
257
|
-
elsif l =~ SPEC_VERSION_MATCHER
|
258
|
-
meta[:version] = $1.strip
|
259
|
-
|
260
|
-
elsif l =~ SPEC_RELEASE_MATCHER
|
261
|
-
meta[:release] = $1.strip
|
262
|
-
|
263
|
-
elsif l =~ SPEC_SUBPACKAGE_MATCHER
|
264
|
-
subpkg_name = $1.strip
|
265
|
-
in_subpackage = true
|
266
|
-
|
267
|
-
elsif l =~ SPEC_REQUIRES_MATCHER &&
|
268
|
-
!in_subpackage
|
269
|
-
meta[:requires] ||= []
|
270
|
-
meta[:requires] << RPMSpec::Requirement.parse($1.strip)
|
271
|
-
|
272
|
-
elsif l =~ SPEC_BUILD_REQUIRES_MATCHER &&
|
273
|
-
!in_subpackage
|
274
|
-
meta[:build_requires] ||= []
|
275
|
-
meta[:build_requires] << RPMSpec::Requirement.parse($1.strip)
|
276
|
-
|
277
|
-
elsif l =~ SPEC_CHANGELOG_MATCHER
|
278
|
-
in_changelog = true
|
279
|
-
|
280
|
-
elsif l =~ SPEC_FILES_MATCHER
|
281
|
-
subpkg_name = nil
|
282
|
-
in_files = true
|
283
|
-
|
284
|
-
elsif l =~ SPEC_SUBPKG_FILES_MATCHER
|
285
|
-
subpkg_name = $1.strip
|
286
|
-
in_files = true
|
287
|
-
|
288
|
-
elsif l =~ SPEC_CHECK_MATCHER
|
289
|
-
meta[:has_check] = true
|
290
|
-
|
291
|
-
elsif in_changelog
|
292
|
-
meta[:changelog] ||= ""
|
293
|
-
meta[:changelog] << l
|
294
|
-
|
295
|
-
elsif in_files
|
296
|
-
tgt = subpkg_name.nil? ? meta[:gem_name] : subpkg_name
|
297
|
-
meta[:files] ||= {}
|
298
|
-
meta[:files][tgt] ||= []
|
299
|
-
|
300
|
-
sl = l.strip.unrpmize
|
301
|
-
meta[:files][tgt] << sl unless sl.blank?
|
302
|
-
end
|
303
|
-
}
|
304
|
-
|
305
|
-
meta[:changelog_entries] = meta[:changelog] ?
|
306
|
-
meta[:changelog].split("\n\n") : []
|
307
|
-
meta[:changelog_entries].collect! { |c| c.strip }.compact!
|
308
|
-
|
309
|
-
self.new meta
|
310
|
-
end
|
311
|
-
|
312
|
-
# Update RPMSpec metadata to new gem
|
313
|
-
#
|
314
|
-
# TODO add option to enable/disable certain aspects
|
315
|
-
# from being updates
|
316
|
-
#
|
317
|
-
# @param [Polisher::Gem] new_source new gem to update rpmspec to
|
318
|
-
def update_to(new_source)
|
319
|
-
update_deps_from(new_source)
|
320
|
-
update_files_from(new_source)
|
321
|
-
update_metadata_from(new_source)
|
322
|
-
end
|
323
|
-
|
324
|
-
private
|
325
|
-
|
326
|
-
def update_deps_from(new_source)
|
327
|
-
non_gem_requires = []
|
328
|
-
non_gem_brequires = []
|
329
|
-
extra_gem_requires = []
|
330
|
-
extra_gem_brequires = []
|
331
|
-
|
332
|
-
@metadata[:requires] ||= []
|
333
|
-
@metadata[:requires].each { |r|
|
334
|
-
if !r.gem?
|
335
|
-
non_gem_requires << r
|
336
|
-
elsif !new_source.deps.any? { |d| d.name == r.gem_name }
|
337
|
-
extra_gem_requires << r
|
338
|
-
#else
|
339
|
-
# spec_version = $2
|
340
|
-
end
|
341
|
-
}
|
342
|
-
|
343
|
-
@metadata[:build_requires] ||= []
|
344
|
-
@metadata[:build_requires].each { |r|
|
345
|
-
if !r.gem?
|
346
|
-
non_gem_brequires << r
|
347
|
-
elsif !new_source.deps.any? { |d| d.name == r.gem_name }
|
348
|
-
extra_gem_brequires << r
|
349
|
-
#else
|
350
|
-
# spec_version = $2
|
351
|
-
end
|
352
|
-
}
|
353
|
-
|
354
|
-
# TODO detect if req is same as @version, swap out w/ %{version} macro ?
|
355
|
-
|
356
|
-
@metadata[:requires] =
|
357
|
-
non_gem_requires + extra_gem_requires +
|
358
|
-
new_source.deps.collect { |r|
|
359
|
-
r.requirement.to_s.split(',').collect { |req|
|
360
|
-
expanded = Gem2Rpm::Helpers.expand_requirement [req.split]
|
361
|
-
expanded.collect { |e|
|
362
|
-
RPMSpec::Requirement.new :name => "rubygem(#{r.name})",
|
363
|
-
:condition => e.first.to_s,
|
364
|
-
:version => e.last.to_s,
|
365
|
-
:br => false
|
366
|
-
}
|
367
|
-
}
|
368
|
-
}.flatten
|
369
|
-
|
370
|
-
@metadata[:build_requires] =
|
371
|
-
non_gem_brequires + extra_gem_brequires +
|
372
|
-
new_source.dev_deps.collect { |r|
|
373
|
-
r.requirement.to_s.split(',').collect { |req|
|
374
|
-
expanded = Gem2Rpm::Helpers.expand_requirement [req.split]
|
375
|
-
expanded.collect { |e|
|
376
|
-
RPMSpec::Requirement.new :name => "rubygem(#{r.name})",
|
377
|
-
:condition => e.first.to_s,
|
378
|
-
:version => e.last.to_s,
|
379
|
-
:br => true
|
380
|
-
}
|
381
|
-
}
|
382
|
-
}.flatten
|
383
|
-
end
|
384
|
-
|
385
|
-
def update_files_from(new_source)
|
386
|
-
to_add = new_source.file_paths
|
387
|
-
@metadata[:files] ||= {}
|
388
|
-
@metadata[:files].each { |pkg,spec_files|
|
389
|
-
(new_source.file_paths & to_add).each { |gem_file|
|
390
|
-
# skip files already included in spec or in dir in spec
|
391
|
-
has_file = spec_files.any? { |sf|
|
392
|
-
gem_file.gsub(sf,'') != gem_file
|
393
|
-
}
|
394
|
-
|
395
|
-
to_add.delete(gem_file)
|
396
|
-
to_add << gem_file.rpmize if !has_file &&
|
397
|
-
!Gem.ignorable_file?(gem_file)
|
398
|
-
}
|
399
|
-
}
|
400
|
-
|
401
|
-
@metadata[:new_files] = to_add
|
402
|
-
end
|
403
|
-
|
404
|
-
def update_metadata_from(new_source)
|
405
|
-
# update to new version
|
406
|
-
@metadata[:version] = new_source.version
|
407
|
-
@metadata[:release] = "1%{?dist}"
|
408
|
-
|
409
|
-
# add changelog entry
|
410
|
-
changelog_entry = <<EOS
|
411
|
-
* #{Time.now.strftime("%a %b %d %Y")} #{RPMSpec.current_author} - #{@metadata[:version]}-1
|
412
|
-
- Update to version #{new_source.version}
|
413
|
-
EOS
|
414
|
-
@metadata[:changelog_entries] ||= []
|
415
|
-
@metadata[:changelog_entries].unshift changelog_entry.rstrip
|
416
|
-
end
|
417
|
-
|
418
|
-
public
|
419
|
-
|
420
|
-
# Return properly formatted rpmspec as string
|
421
|
-
#
|
422
|
-
# @return [String] string representation of rpm spec
|
423
|
-
def to_string
|
424
|
-
contents = @metadata[:contents]
|
425
|
-
|
426
|
-
# replace version / release
|
427
|
-
contents.gsub!(SPEC_VERSION_MATCHER, "Version: #{@metadata[:version]}")
|
428
|
-
contents.gsub!(SPEC_RELEASE_MATCHER, "Release: #{@metadata[:release]}")
|
429
|
-
|
430
|
-
# add changelog entry
|
431
|
-
cp = contents.index SPEC_CHANGELOG_MATCHER
|
432
|
-
cpn = contents.index "\n", cp
|
433
|
-
contents = contents[0...cpn+1] +
|
434
|
-
@metadata[:changelog_entries].join("\n\n")
|
435
|
-
|
436
|
-
# update requires/build requires
|
437
|
-
rp = contents.index SPEC_REQUIRES_MATCHER
|
438
|
-
brp = contents.index SPEC_BUILD_REQUIRES_MATCHER
|
439
|
-
tp = rp < brp ? rp : brp
|
440
|
-
|
441
|
-
pp = contents.index SPEC_SUBPACKAGE_MATCHER
|
442
|
-
pp = -1 if pp.nil?
|
443
|
-
|
444
|
-
lrp = contents.rindex SPEC_REQUIRES_MATCHER, pp
|
445
|
-
lbrp = contents.rindex SPEC_BUILD_REQUIRES_MATCHER, pp
|
446
|
-
ltp = lrp > lbrp ? lrp : lbrp
|
447
|
-
|
448
|
-
ltpn = contents.index "\n", ltp
|
449
|
-
|
450
|
-
contents.slice!(tp...ltpn)
|
451
|
-
contents.insert tp,
|
452
|
-
(@metadata[:requires].collect { |r| "Requires: #{r.str}" } +
|
453
|
-
@metadata[:build_requires].collect { |r| "BuildRequires: #{r.str}" }).join("\n")
|
454
|
-
|
455
|
-
# add new files
|
456
|
-
fp = contents.index SPEC_FILES_MATCHER
|
457
|
-
lfp = contents.index SPEC_SUBPKG_FILES_MATCHER, fp + 1
|
458
|
-
lfp = contents.index SPEC_CHANGELOG_MATCHER if lfp.nil?
|
459
|
-
|
460
|
-
contents.insert lfp - 1, @metadata[:new_files].join("\n") + "\n"
|
461
|
-
|
462
|
-
# return new contents
|
463
|
-
contents
|
464
|
-
end
|
465
|
-
|
466
|
-
def compare(upstream_source)
|
467
|
-
same = {}
|
468
|
-
diff = {}
|
469
|
-
upstream_source.deps.each do |d|
|
470
|
-
spec_reqs = self.requirements_for_gem(d.name)
|
471
|
-
spec_reqs_specifier = spec_reqs.empty? ? nil :
|
472
|
-
spec_reqs.collect { |req| req.specifier }
|
473
|
-
|
474
|
-
if spec_reqs.nil?
|
475
|
-
diff[d.name] = {:spec => nil,
|
476
|
-
:upstream => d.requirement.to_s}
|
477
|
-
|
478
|
-
elsif !spec_reqs.any? { |req| req.matches?(d) } ||
|
479
|
-
!self.has_all_requirements_for?(d)
|
480
|
-
diff[d.name] = {:spec => spec_reqs_specifier,
|
481
|
-
:upstream => d.requirement.to_s}
|
482
|
-
|
483
|
-
elsif !diff.has_key?(d.name)
|
484
|
-
same[d.name] = {:spec => spec_reqs_specifier,
|
485
|
-
:upstream => d.requirement.to_s }
|
486
|
-
end
|
487
|
-
end
|
488
|
-
|
489
|
-
@metadata[:requires].each do |req|
|
490
|
-
next unless req.gem?
|
491
|
-
|
492
|
-
upstream_dep = upstream_source.deps.find { |d| d.name == req.gem_name }
|
493
|
-
|
494
|
-
if upstream_dep.nil?
|
495
|
-
diff[req.gem_name] = {:spec => req.specifier,
|
496
|
-
:upstream => nil}
|
497
|
-
|
498
|
-
elsif !req.matches?(upstream_dep)
|
499
|
-
diff[req.gem_name] = {:spec => req.specifier,
|
500
|
-
:upstream => upstream_dep.requirement.to_s }
|
501
|
-
|
502
|
-
elsif !diff.has_key?(req.gem_name)
|
503
|
-
same[req.gem_name] = {:spec => req.specifier,
|
504
|
-
:upstream => upstream_dep.requirement.to_s }
|
505
|
-
end
|
506
|
-
end unless @metadata[:requires].nil?
|
507
|
-
|
508
|
-
{:same => same, :diff => diff}
|
509
|
-
end
|
510
|
-
|
511
|
-
end # class RPMSpec
|
512
|
-
end # module Polisher
|