Skip to content

Commit 9de1221

Browse files
Anackreonnebhale
authored andcommitted
Prioritize Leading Digits in Qualifier
Previously, when wildcarded qualifiers were compared, they were compared purely lexically. This disadvantaged versions that exclusively used numbers in the qualifier (e.g. Java versions). The result of this was that no matter what _121 would always fall before _91 which in turn led to some poor work arounds using the wildcards. This change now handles leading digits numerically rather than lexically, after which the rest of the qualifier is compared lexically. [cloudfoundry#397][cloudfoundry#402]
1 parent 6ff8e9d commit 9de1221

2 files changed

Lines changed: 5 additions & 3 deletions

File tree

lib/java_buildpack/util/tokenized_version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def minimum_qualifier_length(a, b)
121121
end
122122

123123
def qualifier_compare(a, b)
124-
comparison = 0
124+
comparison = a[/^\d+/].to_i <=> b[/^\d+/].to_i
125125

126126
i = 0
127127
until comparison.nonzero? || i == minimum_qualifier_length(a, b)

spec/java_buildpack/repository/version_resolver_spec.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
describe JavaBuildpack::Repository::VersionResolver do
2323
include_context 'logging_helper'
2424

25-
let(:versions) { %w(1.6.0_26 1.6.0_27 1.6.1_14 1.7.0_19 1.7.0_21 1.8.0_M-7 1.8.0_05 2.0.0 2.0.0a) }
25+
let(:versions) do
26+
%w(1.6.0_26 1.6.0_27 1.6.0_112 1.6.0_102 1.6.0_45RELEASE 1.6.1_14 1.7.0_19 1.7.0_21 1.8.0_M-7 1.8.0_05 2.0.0 2.0.0a)
27+
end
2628

2729
it 'resolves the default version if no candidate is supplied' do
2830
expect(described_class.resolve(nil, versions)).to eq(tokenized_version('2.0.0'))
@@ -41,7 +43,7 @@
4143
end
4244

4345
it 'resolves a wildcard qualifier' do
44-
expect(described_class.resolve(tokenized_version('1.6.0_+'), versions)).to eq(tokenized_version('1.6.0_27'))
46+
expect(described_class.resolve(tokenized_version('1.6.0_+'), versions)).to eq(tokenized_version('1.6.0_112'))
4547
expect(described_class.resolve(tokenized_version('1.8.0_+'), versions)).to eq(tokenized_version('1.8.0_05'))
4648
end
4749

0 commit comments

Comments
 (0)