Skip to content

Commit f04feef

Browse files
committed
Fix semantic version comparison
1 parent 6c20af2 commit f04feef

File tree

6 files changed

+69
-11
lines changed

6 files changed

+69
-11
lines changed

Diff for: Manifest.txt

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ lib/pmdtester/project.rb
4444
lib/pmdtester/report_diff.rb
4545
lib/pmdtester/resource_locator.rb
4646
lib/pmdtester/runner.rb
47+
lib/pmdtester/semver.rb
4748
pmdtester.gemspec
4849
resources/_includes/diff_pill_row.html
4950
resources/css/bootstrap.min.css

Diff for: lib/pmdtester.rb

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
require_relative 'pmdtester/report_diff'
1616
require_relative 'pmdtester/resource_locator'
1717
require_relative 'pmdtester/runner'
18+
require_relative 'pmdtester/semver'
1819

1920
require_relative 'pmdtester/builders/simple_progress_logger'
2021
require_relative 'pmdtester/builders/project_builder'

Diff for: lib/pmdtester/builders/pmd_report_builder.rb

+1-7
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,7 @@ def wd_has_dirty_git_changes
198198

199199
def should_use_long_cli_options
200200
logger.debug "PMD Version: #{@pmd_version}"
201-
m = /(\d+)\.(\d+)\.(\d+).*/.match(@pmd_version)
202-
major = m[1]
203-
minor = m[2]
204-
patch = m[3]
205-
result = major.to_i >= 6 && minor.to_i >= 41
206-
logger.debug " major: #{major} minor: #{minor} patch: #{patch} => use long cli options: #{result}"
207-
result
201+
Semver.compare(@pmd_version, '6.41.0') >= 0
208202
end
209203
end
210204
end

Diff for: lib/pmdtester/semver.rb

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
module PmdTester
4+
# Utility to deal with semantic versions
5+
class Semver
6+
def self.compare(version_a, version_b)
7+
PmdTester.logger.debug "Comparing #{version_a} <=> #{version_b}"
8+
m = /(\d+)\.(\d+)\.(\d+)(.*)/.match(version_a)
9+
a_major = m[1].to_i
10+
a_minor = m[2].to_i
11+
a_patch = m[3].to_i
12+
a_snapshot = m[4]
13+
PmdTester.logger.debug " a_major: #{a_major} a_minor: #{a_minor} a_patch: #{a_patch} a_snapshot: #{a_snapshot}"
14+
15+
m = /(\d+)\.(\d+)\.(\d+)(.*)/.match(version_b)
16+
b_major = m[1].to_i
17+
b_minor = m[2].to_i
18+
b_patch = m[3].to_i
19+
b_snapshot = m[4]
20+
PmdTester.logger.debug " b_major: #{b_major} b_minor: #{b_minor} b_patch: #{b_patch} b_snapshot: #{b_snapshot}"
21+
22+
return a_major <=> b_major if a_major != b_major
23+
return a_minor <=> b_minor if a_minor != b_minor
24+
return a_patch <=> b_patch if a_patch != b_patch
25+
26+
compare_snapshots(a_snapshot, b_snapshot)
27+
end
28+
29+
private_class_method def self.compare_snapshots(a_snapshot, b_snapshot)
30+
return -1 if a_snapshot == '-SNAPSHOT' && b_snapshot == ''
31+
return 1 if a_snapshot == '' && b_snapshot == '-SNAPSHOT'
32+
33+
a_snapshot <=> b_snapshot
34+
end
35+
end
36+
end

Diff for: pmdtester.gemspec

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ Gem::Specification.new do |s|
1111
s.metadata = { "bug_tracker_uri" => "https://github.com/pmd/pmd-regression-tester/issues", "homepage_uri" => "https://pmd.github.io", "source_code_uri" => "https://github.com/pmd/pmd-regression-tester" } if s.respond_to? :metadata=
1212
s.require_paths = ["lib".freeze]
1313
s.authors = ["Andreas Dangel".freeze, "Binguo Bao".freeze, "Cl\u00E9ment Fournier".freeze]
14-
s.date = "2021-06-20"
14+
s.date = "2021-12-17"
1515
s.description = "A regression testing tool ensure that new problems and unexpected behaviors will not be introduced to PMD project after fixing an issue , and new rules can work as expected.".freeze
1616
s.email = ["[email protected]".freeze, "[email protected]".freeze, "[email protected]".freeze]
1717
s.executables = ["pmdtester".freeze]
1818
s.extra_rdoc_files = ["History.md".freeze, "Manifest.txt".freeze, "README.rdoc".freeze]
19-
s.files = [".ci/build.sh".freeze, ".ci/inc/fetch_ci_scripts.bash".freeze, ".ci/manual-integration-tests.sh".freeze, ".github/workflows/build.yml".freeze, ".github/workflows/manual-integration-tests.yml".freeze, ".gitignore".freeze, ".hoerc".freeze, ".rubocop.yml".freeze, ".rubocop_todo.yml".freeze, ".ruby-version".freeze, "Gemfile".freeze, "History.md".freeze, "LICENSE".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "Rakefile".freeze, "bin/pmdtester".freeze, "config/all-java.xml".freeze, "config/design.xml".freeze, "config/project-list.xml".freeze, "config/projectlist_1_0_0.xsd".freeze, "config/projectlist_1_1_0.xsd".freeze, "config/projectlist_1_2_0.xsd".freeze, "lib/pmdtester.rb".freeze, "lib/pmdtester/builders/liquid_renderer.rb".freeze, "lib/pmdtester/builders/pmd_report_builder.rb".freeze, "lib/pmdtester/builders/project_builder.rb".freeze, "lib/pmdtester/builders/project_hasher.rb".freeze, "lib/pmdtester/builders/rule_set_builder.rb".freeze, "lib/pmdtester/builders/simple_progress_logger.rb".freeze, "lib/pmdtester/builders/summary_report_builder.rb".freeze, "lib/pmdtester/cmd.rb".freeze, "lib/pmdtester/collection_by_file.rb".freeze, "lib/pmdtester/parsers/options.rb".freeze, "lib/pmdtester/parsers/pmd_report_document.rb".freeze, "lib/pmdtester/parsers/projects_parser.rb".freeze, "lib/pmdtester/pmd_branch_detail.rb".freeze, "lib/pmdtester/pmd_configerror.rb".freeze, "lib/pmdtester/pmd_error.rb".freeze, "lib/pmdtester/pmd_report_detail.rb".freeze, "lib/pmdtester/pmd_tester_utils.rb".freeze, "lib/pmdtester/pmd_violation.rb".freeze, "lib/pmdtester/project.rb".freeze, "lib/pmdtester/report_diff.rb".freeze, "lib/pmdtester/resource_locator.rb".freeze, "lib/pmdtester/runner.rb".freeze, "pmdtester.gemspec".freeze, "resources/_includes/diff_pill_row.html".freeze, "resources/css/bootstrap.min.css".freeze, "resources/css/datatables.min.css".freeze, "resources/css/pmd-tester.css".freeze, "resources/js/bootstrap.min.js".freeze, "resources/js/code-snippets.js".freeze, "resources/js/datatables.min.js".freeze, "resources/js/jquery-3.2.1.slim.min.js".freeze, "resources/js/jquery.min.js".freeze, "resources/js/popper.min.js".freeze, "resources/js/project-report.js".freeze, "resources/project_diff_report.html".freeze, "resources/project_index.html".freeze, "resources/project_pmd_report.html".freeze]
19+
s.files = [".ci/build.sh".freeze, ".ci/inc/fetch_ci_scripts.bash".freeze, ".ci/manual-integration-tests.sh".freeze, ".github/workflows/build.yml".freeze, ".github/workflows/manual-integration-tests.yml".freeze, ".gitignore".freeze, ".hoerc".freeze, ".rubocop.yml".freeze, ".rubocop_todo.yml".freeze, ".ruby-version".freeze, "Gemfile".freeze, "History.md".freeze, "LICENSE".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "Rakefile".freeze, "bin/pmdtester".freeze, "config/all-java.xml".freeze, "config/design.xml".freeze, "config/project-list.xml".freeze, "config/projectlist_1_0_0.xsd".freeze, "config/projectlist_1_1_0.xsd".freeze, "config/projectlist_1_2_0.xsd".freeze, "lib/pmdtester.rb".freeze, "lib/pmdtester/builders/liquid_renderer.rb".freeze, "lib/pmdtester/builders/pmd_report_builder.rb".freeze, "lib/pmdtester/builders/project_builder.rb".freeze, "lib/pmdtester/builders/project_hasher.rb".freeze, "lib/pmdtester/builders/rule_set_builder.rb".freeze, "lib/pmdtester/builders/simple_progress_logger.rb".freeze, "lib/pmdtester/builders/summary_report_builder.rb".freeze, "lib/pmdtester/cmd.rb".freeze, "lib/pmdtester/collection_by_file.rb".freeze, "lib/pmdtester/parsers/options.rb".freeze, "lib/pmdtester/parsers/pmd_report_document.rb".freeze, "lib/pmdtester/parsers/projects_parser.rb".freeze, "lib/pmdtester/pmd_branch_detail.rb".freeze, "lib/pmdtester/pmd_configerror.rb".freeze, "lib/pmdtester/pmd_error.rb".freeze, "lib/pmdtester/pmd_report_detail.rb".freeze, "lib/pmdtester/pmd_tester_utils.rb".freeze, "lib/pmdtester/pmd_violation.rb".freeze, "lib/pmdtester/project.rb".freeze, "lib/pmdtester/report_diff.rb".freeze, "lib/pmdtester/resource_locator.rb".freeze, "lib/pmdtester/runner.rb".freeze, "lib/pmdtester/semver.rb".freeze, "pmdtester.gemspec".freeze, "resources/_includes/diff_pill_row.html".freeze, "resources/css/bootstrap.min.css".freeze, "resources/css/datatables.min.css".freeze, "resources/css/pmd-tester.css".freeze, "resources/js/bootstrap.min.js".freeze, "resources/js/code-snippets.js".freeze, "resources/js/datatables.min.js".freeze, "resources/js/jquery-3.2.1.slim.min.js".freeze, "resources/js/jquery.min.js".freeze, "resources/js/popper.min.js".freeze, "resources/js/project-report.js".freeze, "resources/project_diff_report.html".freeze, "resources/project_index.html".freeze, "resources/project_pmd_report.html".freeze]
2020
s.homepage = "https://pmd.github.io".freeze
2121
s.licenses = ["BSD-2-Clause".freeze]
2222
s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
4242
s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.81"])
4343
s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.2"])
4444
s.add_development_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
45-
s.add_development_dependency(%q<hoe>.freeze, ["~> 3.22"])
45+
s.add_development_dependency(%q<hoe>.freeze, ["~> 3.23"])
4646
else
4747
s.add_dependency(%q<nokogiri>.freeze, [">= 1.11.0.rc4"])
4848
s.add_dependency(%q<slop>.freeze, ["~> 4.6"])
@@ -57,7 +57,7 @@ Gem::Specification.new do |s|
5757
s.add_dependency(%q<rubocop>.freeze, ["~> 0.81"])
5858
s.add_dependency(%q<test-unit>.freeze, ["~> 3.2"])
5959
s.add_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
60-
s.add_dependency(%q<hoe>.freeze, ["~> 3.22"])
60+
s.add_dependency(%q<hoe>.freeze, ["~> 3.23"])
6161
end
6262
end
6363

Diff for: test/test_semver.rb

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_helper'
4+
5+
# Unit test class for PmdTester::Semver
6+
class TestSemver < Test::Unit::TestCase
7+
def test_compare_releases
8+
assert_equal(0, PmdTester::Semver.compare('1.0.0', '1.0.0'))
9+
assert_equal(-1, PmdTester::Semver.compare('1.0.0', '1.0.1'))
10+
assert_equal(-1, PmdTester::Semver.compare('1.0.0', '1.1.0'))
11+
assert_equal(-1, PmdTester::Semver.compare('1.0.0', '2.0.0'))
12+
assert_equal(1, PmdTester::Semver.compare('1.1.0', '1.0.0'))
13+
assert_equal(1, PmdTester::Semver.compare('2.0.0', '1.0.0'))
14+
15+
assert_equal(1, PmdTester::Semver.compare('6.42.0', '6.41.0'))
16+
assert_equal(1, PmdTester::Semver.compare('7.0.0', '6.41.0'))
17+
assert_equal(0, PmdTester::Semver.compare('6.41.0', '6.41.0'))
18+
assert_equal(-1, PmdTester::Semver.compare('6.40.0', '6.41.0'))
19+
end
20+
21+
def test_compare_snapshots
22+
assert_equal(1, PmdTester::Semver.compare('7.0.0-SNAPSHOT', '6.41.0'))
23+
assert_equal(-1, PmdTester::Semver.compare('6.41.0-SNAPSHOT', '6.41.0'))
24+
assert_equal(0, PmdTester::Semver.compare('6.41.0-SNAPSHOT', '6.41.0-SNAPSHOT'))
25+
end
26+
end

0 commit comments

Comments
 (0)