Skip to content

Commit 3c07da3

Browse files
committed
Merge pull request #102 from adangel:pmd-long-cli-options
Use long cli options for PMD >= 6.41.0 #102 * pr-102: Fix semantic version comparison Use long cli options for PMD >= 6.41.0
2 parents 8f1d7f2 + f04feef commit 3c07da3

7 files changed

+98
-7
lines changed

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

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'

lib/pmdtester/builders/pmd_report_builder.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,12 @@ def get_last_commit_message
9797
def generate_pmd_report(project)
9898
error_recovery_options = @error_recovery ? 'PMD_JAVA_OPTS="-Dpmd.error_recovery -ea" ' : ''
9999
run_path = "#{saved_distro_path(@pmd_branch_details.branch_last_sha)}/bin/run.sh"
100+
fail_on_violation = should_use_long_cli_options ? '--fail-on-violation false' : '-failOnViolation false'
100101
pmd_cmd = "#{error_recovery_options}" \
101102
"#{run_path} pmd -d #{project.local_source_path} -f xml " \
102103
"-R #{project.get_config_path(@pmd_branch_name)} " \
103104
"-r #{project.get_pmd_report_path(@pmd_branch_name)} " \
104-
"-failOnViolation false -t #{@threads} " \
105+
"#{fail_on_violation} -t #{@threads} " \
105106
"#{project.auxclasspath}"
106107
start_time = Time.now
107108
if File.exist?(project.get_pmd_report_path(@pmd_branch_name))
@@ -194,5 +195,10 @@ def saved_distro_path(build_sha)
194195
def wd_has_dirty_git_changes
195196
!Cmd.execute('git status --porcelain').empty?
196197
end
198+
199+
def should_use_long_cli_options
200+
logger.debug "PMD Version: #{@pmd_version}"
201+
Semver.compare(@pmd_version, '6.41.0') >= 0
202+
end
197203
end
198204
end

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

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

test/test_pmd_report_builder.rb

+23-2
Original file line numberDiff line numberDiff line change
@@ -127,22 +127,43 @@ def test_build_error_recovery
127127
.build
128128
end
129129

130+
def test_build_long_cli_options
131+
@pmd_version = '6.41.0'
132+
project_list = 'test/resources/pmd_report_builder/project-list.xml'
133+
projects = PmdTester::ProjectsParser.new.parse(project_list)
134+
assert_equal(1, projects.size)
135+
argv = %w[-r target/repositories/pmd -b master -p pmd_releases/6.1.0
136+
-c config/design.xml --debug --error-recovery -l]
137+
argv.push project_list
138+
options = PmdTester::Options.new(argv)
139+
140+
projects[0].auxclasspath = '-auxclasspath extra:dirs'
141+
record_expectations('sha1abc', 'sha1abc', true)
142+
record_expectations_after_build
143+
record_expectations_project_build('sha1abc', true, true)
144+
145+
PmdTester::PmdReportBuilder
146+
.new(projects, options, options.base_config, options.base_branch)
147+
.build
148+
end
149+
130150
private
131151

132-
def record_expectations_project_build(sha1, error = false)
152+
def record_expectations_project_build(sha1, error = false, long_cli_options = false)
133153
PmdTester::ProjectBuilder.any_instance.stubs(:clone_projects).once
134154
PmdTester::ProjectBuilder.any_instance.stubs(:build_projects).once
135155
PmdTester::SimpleProgressLogger.any_instance.stubs(:start).once
136156
PmdTester::SimpleProgressLogger.any_instance.stubs(:stop).once
137157
error_prefix = error ? 'PMD_JAVA_OPTS="-Dpmd.error_recovery -ea" ' : ''
138158
distro_path = "#{Dir.getwd}/target/pmd-bin-#{@pmd_version}-master-#{sha1}"
159+
fail_on_violation = long_cli_options ? '--fail-on-violation false' : '-failOnViolation false'
139160
PmdTester::Cmd.stubs(:execute)
140161
.with("#{error_prefix}" \
141162
"#{distro_path}/bin/run.sh " \
142163
'pmd -d target/repositories/checkstyle -f xml ' \
143164
'-R target/reports/master/checkstyle/config.xml ' \
144165
'-r target/reports/master/checkstyle/pmd_report.xml ' \
145-
'-failOnViolation false -t 1 ' \
166+
"#{fail_on_violation} -t 1 " \
146167
'-auxclasspath extra:dirs').once
147168
PmdTester::PmdReportDetail.any_instance.stubs(:save).once
148169
end

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)