pmdtester 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0002a7305089264a200552384fff3179d706c2a89b39ef28cec2f2c184e84331
4
- data.tar.gz: b59758aa8ece040b8d90c3577fcdc05000615e5efb32504b6e96599686d0ee6a
3
+ metadata.gz: 1d00209411d45b04f8ebcfb34d4289b682a9c3d044998b1f82e15c1d08e184ed
4
+ data.tar.gz: d6d6a48c4a2c558b9058c91dc57e2043e304addc90b8e7cc7441f07c50dac624
5
5
  SHA512:
6
- metadata.gz: d18602b80cad2306aba780a338c90831aeaff5b17ebce880384a2e1b94405c7e45ae40e9842f878fe3ee514e8651b1bb856bfea35bab130f0f67606690ac53a7
7
- data.tar.gz: 36c0c70dada772cfe44d595eeefd2cf131925db7a884dbd092bc4490cbf2ea948df23449c2dcdc78f39b75c4863b4c41b84d73a0346874c78c8aa5dee03a5ad4
6
+ metadata.gz: 82c0d9bce215128d2fb56f44116c7c6f5394b8a34ff8b26918974a89e2c6e67b4d76c14b3a920b372e345ffbe33e114cdacfbcdd962f1c76f5fddc24595d8998
7
+ data.tar.gz: effbb41f97137a0b6a93bc200cd8ebb3b7323dabaeef1eca50bfee3dd97b00e0418987b28661328902b1f66942843acad32bc397f1dc04590cbc9d0a19d1c4b7
@@ -15,6 +15,7 @@ on:
15
15
 
16
16
  jobs:
17
17
  build:
18
+ timeout-minutes: 120
18
19
  runs-on: ubuntu-latest
19
20
  continue-on-error: false
20
21
  if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
@@ -27,9 +28,9 @@ jobs:
27
28
  ~/.cache
28
29
  vendor/bundle
29
30
  target/repositories
30
- key: v1-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
31
+ key: v3-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
31
32
  restore-keys: |
32
- v1-${{ runner.os }}-
33
+ v3-${{ runner.os }}-
33
34
  - name: Set up Ruby 2.7
34
35
  uses: ruby/setup-ruby@v1
35
36
  with:
@@ -8,6 +8,7 @@ on:
8
8
 
9
9
  jobs:
10
10
  build:
11
+ timeout-minutes: 120
11
12
  runs-on: ubuntu-latest
12
13
  continue-on-error: false
13
14
  steps:
@@ -19,9 +20,9 @@ jobs:
19
20
  ~/.cache
20
21
  vendor/bundle
21
22
  target/repositories
22
- key: v1-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
23
+ key: v3-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
23
24
  restore-keys: |
24
- v1-${{ runner.os }}-
25
+ v3-${{ runner.os }}-
25
26
  - name: Set up Ruby 2.7
26
27
  uses: ruby/setup-ruby@v1
27
28
  with:
data/History.md CHANGED
@@ -1,3 +1,14 @@
1
+ # 1.5.0 / 2022-05-06
2
+
3
+ ## Enhancements
4
+
5
+ * [#108](https://github.com/pmd/pmd-regression-tester/issues/108): Disable progress bar for PMD 7
6
+ * [#109](https://github.com/pmd/pmd-regression-tester/issues/109): Make stdout/stderr and exit code available
7
+
8
+ ## Fixed Issues
9
+
10
+ * [#107](https://github.com/pmd/pmd-regression-tester/issues/107): Deprecated command line options is used: `-auxclasspath`
11
+
1
12
  # 1.4.1 / 2022-04-12
2
13
 
3
14
  ## Fixed Issues
@@ -60,6 +60,11 @@ module PmdTester
60
60
  # copy original pmd reports
61
61
  copy_file("#{root}/base_pmd_report.xml", project.report_diff.base_report.file)
62
62
  copy_file("#{root}/patch_pmd_report.xml", project.report_diff.patch_report.file)
63
+ # copy stdout and stderr outputs
64
+ copy_file("#{root}/base_stdout.txt", "#{project.report_diff.base_report.report_folder}/stdout.txt")
65
+ copy_file("#{root}/base_stderr.txt", "#{project.report_diff.base_report.report_folder}/stderr.txt")
66
+ copy_file("#{root}/patch_stdout.txt", "#{project.report_diff.patch_report.report_folder}/stdout.txt")
67
+ copy_file("#{root}/patch_stderr.txt", "#{project.report_diff.patch_report.report_folder}/stderr.txt")
63
68
  # render full pmd reports
64
69
  write_file("#{root}/base_pmd_report.html",
65
70
  render_liquid('project_pmd_report.html', pmd_report_liquid_env(project, BASE)))
@@ -120,6 +125,7 @@ module PmdTester
120
125
 
121
126
  'execution_time' => PmdReportDetail.convert_seconds(report.exec_time),
122
127
  'timestamp' => report.timestamp,
128
+ 'exit_code' => report.exit_code,
123
129
 
124
130
  'rules' => report.rule_summaries,
125
131
  'errors' => report.errors_by_file.all_values.map { |e| error_to_hash(e, project) },
@@ -25,7 +25,7 @@ module PmdTester
25
25
  def get_pmd_binary_file
26
26
  logger.info "#{@pmd_branch_name}: Start packaging PMD"
27
27
  Dir.chdir(@local_git_repo) do
28
- build_branch_sha = Cmd.execute("git rev-parse #{@pmd_branch_name}^{commit}")
28
+ build_branch_sha = Cmd.execute_successfully("git rev-parse #{@pmd_branch_name}^{commit}")
29
29
 
30
30
  checkout_build_branch # needs a clean working tree, otherwise fails
31
31
 
@@ -70,49 +70,53 @@ module PmdTester
70
70
  ' -Dcheckstyle.skip=true' \
71
71
  ' -Dpmd.skip=true' \
72
72
  ' -T1C -B'
73
- Cmd.execute(package_cmd)
73
+ Cmd.execute_successfully(package_cmd)
74
74
  end
75
75
 
76
76
  logger.info "#{@pmd_branch_name}: Extracting the zip"
77
- Cmd.execute("unzip -qo #{pmd_dist_target} -d pmd-dist/target/exploded")
78
- Cmd.execute("mv pmd-dist/target/exploded/pmd-bin-#{@pmd_version} #{into_dir}")
77
+ Cmd.execute_successfully("unzip -qo #{pmd_dist_target} -d pmd-dist/target/exploded")
78
+ Cmd.execute_successfully("mv pmd-dist/target/exploded/pmd-bin-#{@pmd_version} #{into_dir}")
79
79
  end
80
80
 
81
81
  def determine_pmd_version
82
82
  version_cmd = "./mvnw -q -Dexec.executable=\"echo\" -Dexec.args='${project.version}' " \
83
83
  '--non-recursive org.codehaus.mojo:exec-maven-plugin:1.5.0:exec'
84
- Cmd.execute(version_cmd)
84
+ Cmd.execute_successfully(version_cmd)
85
85
  end
86
86
 
87
87
  def get_last_commit_sha
88
88
  get_last_commit_sha_cmd = 'git rev-parse HEAD^{commit}'
89
- Cmd.execute(get_last_commit_sha_cmd)
89
+ Cmd.execute_successfully(get_last_commit_sha_cmd)
90
90
  end
91
91
 
92
92
  def get_last_commit_message
93
93
  get_last_commit_message_cmd = 'git log -1 --pretty=%B'
94
- Cmd.execute(get_last_commit_message_cmd)
94
+ Cmd.execute_successfully(get_last_commit_message_cmd)
95
95
  end
96
96
 
97
97
  def generate_pmd_report(project)
98
98
  error_recovery_options = @error_recovery ? 'PMD_JAVA_OPTS="-Dpmd.error_recovery -ea" ' : ''
99
99
  run_path = "#{saved_distro_path(@pmd_branch_details.branch_last_sha)}/bin/run.sh"
100
100
  fail_on_violation = should_use_long_cli_options ? '--fail-on-violation false' : '-failOnViolation false'
101
+ auxclasspath_option = create_auxclasspath_option(project)
101
102
  pmd_cmd = "#{error_recovery_options}" \
102
103
  "#{run_path} pmd -d #{project.local_source_path} -f xml " \
103
104
  "-R #{project.get_config_path(@pmd_branch_name)} " \
104
105
  "-r #{project.get_pmd_report_path(@pmd_branch_name)} " \
105
106
  "#{fail_on_violation} -t #{@threads} " \
106
- "#{project.auxclasspath}"
107
+ "#{auxclasspath_option}" \
108
+ "#{pmd7? ? ' --no-progress' : ''}"
107
109
  start_time = Time.now
110
+ exit_code = nil
108
111
  if File.exist?(project.get_pmd_report_path(@pmd_branch_name))
109
112
  logger.warn "#{@pmd_branch_name}: Skipping PMD run - report " \
110
113
  "#{project.get_pmd_report_path(@pmd_branch_name)} already exists"
111
114
  else
112
- Cmd.execute(pmd_cmd)
115
+ status = Cmd.execute(pmd_cmd, project.get_project_target_dir(@pmd_branch_name))
116
+ exit_code = status.exitstatus
113
117
  end
114
118
  end_time = Time.now
115
- [end_time - start_time, end_time]
119
+ [end_time - start_time, end_time, exit_code]
116
120
  end
117
121
 
118
122
  def generate_config_for(project)
@@ -139,12 +143,12 @@ module PmdTester
139
143
  progress_logger = SimpleProgressLogger.new("generating #{project.name}'s PMD report")
140
144
  progress_logger.start
141
145
  generate_config_for(project)
142
- execution_time, end_time = generate_pmd_report(project)
146
+ execution_time, end_time, exit_code = generate_pmd_report(project)
143
147
  progress_logger.stop
144
148
  sum_time += execution_time
145
149
 
146
- report_details = PmdReportDetail.new(execution_time: execution_time, timestamp: end_time)
147
- report_details.save(project.get_report_info_path(@pmd_branch_name))
150
+ PmdReportDetail.create(execution_time: execution_time, timestamp: end_time,
151
+ exit_code: exit_code, report_info_path: project.get_report_info_path(@pmd_branch_name))
148
152
  logger.info "#{project.name}'s PMD report was generated successfully"
149
153
  end
150
154
 
@@ -167,7 +171,7 @@ module PmdTester
167
171
  def checkout_build_branch
168
172
  logger.info "#{@pmd_branch_name}: Checking out the branch"
169
173
  # note that this would fail if the tree is dirty
170
- Cmd.execute("git checkout #{@pmd_branch_name}")
174
+ Cmd.execute_successfully("git checkout #{@pmd_branch_name}")
171
175
 
172
176
  # determine the version
173
177
  @pmd_version = determine_pmd_version
@@ -193,12 +197,25 @@ module PmdTester
193
197
  end
194
198
 
195
199
  def wd_has_dirty_git_changes
196
- !Cmd.execute('git status --porcelain').empty?
200
+ !Cmd.execute_successfully('git status --porcelain').empty?
197
201
  end
198
202
 
199
203
  def should_use_long_cli_options
200
204
  logger.debug "PMD Version: #{@pmd_version}"
201
205
  Semver.compare(@pmd_version, '6.41.0') >= 0
202
206
  end
207
+
208
+ def create_auxclasspath_option(project)
209
+ auxclasspath_option = ''
210
+ unless project.auxclasspath.empty?
211
+ auxclasspath_option = should_use_long_cli_options ? '--aux-classpath ' : '-auxclasspath '
212
+ auxclasspath_option += project.auxclasspath
213
+ end
214
+ auxclasspath_option
215
+ end
216
+
217
+ def pmd7?
218
+ Semver.compare(@pmd_version, '7.0.0-SNAPSHOT') >= 0
219
+ end
203
220
  end
204
221
  end
@@ -30,7 +30,7 @@ module PmdTester
30
30
  # once but may be used with several tags.
31
31
  clone_cmd = "git clone --no-single-branch --depth 1 #{project.connection} #{path}"
32
32
 
33
- Cmd.execute(clone_cmd)
33
+ Cmd.execute_successfully(clone_cmd)
34
34
  end
35
35
 
36
36
  Dir.chdir(path) do
@@ -71,7 +71,7 @@ module PmdTester
71
71
  if project.auxclasspath_command
72
72
  logger.debug "Executing auxclasspath-command: #{project.auxclasspath_command}"
73
73
  auxclasspath = run_as_script(Dir.getwd, project.auxclasspath_command)
74
- project.auxclasspath = "-auxclasspath #{auxclasspath}"
74
+ project.auxclasspath = auxclasspath
75
75
  else
76
76
  project.auxclasspath = ''
77
77
  end
@@ -87,7 +87,7 @@ module PmdTester
87
87
  if command.start_with?('#!')
88
88
  shell = command.lines[0].chomp[2..] # remove leading "#!"
89
89
  end
90
- stdout = Cmd.execute("#{shell} #{script.path}")
90
+ stdout = Cmd.execute_successfully("#{shell} #{script.path}")
91
91
  ensure
92
92
  script.unlink
93
93
  end
@@ -99,7 +99,7 @@ module PmdTester
99
99
 
100
100
  reset_cmd = "git checkout #{tag}; git reset --hard #{tag}"
101
101
 
102
- Cmd.execute(reset_cmd)
102
+ Cmd.execute_successfully(reset_cmd)
103
103
  end
104
104
  end
105
105
  end
@@ -21,6 +21,9 @@ module PmdTester
21
21
  'base_timestamp' => rdiff.base_report.timestamp,
22
22
  'patch_timestamp' => rdiff.patch_report.timestamp,
23
23
 
24
+ 'base_exit_code' => rdiff.base_report.exit_code,
25
+ 'patch_exit_code' => rdiff.patch_report.exit_code,
26
+
24
27
  'rule_diffs' => rdiff.rule_summaries
25
28
  }
26
29
  end
@@ -176,7 +176,7 @@ module PmdTester
176
176
 
177
177
  # We only need to support git here, since PMD's repo is using git.
178
178
  diff_cmd = "git diff --name-only #{base}..#{patch} #{filepath_filter}"
179
- filenames = Cmd.execute(diff_cmd)
179
+ filenames = Cmd.execute_successfully(diff_cmd)
180
180
  end
181
181
  filenames.split("\n")
182
182
  end
data/lib/pmdtester/cmd.rb CHANGED
@@ -6,9 +6,35 @@ module PmdTester
6
6
  # Containing the common method for executing shell command
7
7
  class Cmd
8
8
  extend PmdTester
9
- def self.execute(cmd)
10
- stdout, _stderr, _status = internal_execute(cmd)
11
- stdout&.chomp!
9
+
10
+ #
11
+ # Executes the given command and returns the process status.
12
+ # stdout and stderr are written to the files "stdout.txt" and "stderr.txt"
13
+ # in path.
14
+ #
15
+ def self.execute(cmd, path)
16
+ stdout, stderr, status = internal_execute(cmd)
17
+
18
+ file = File.new("#{path}/stdout.txt", 'w')
19
+ file.puts stdout
20
+ file.close
21
+
22
+ file = File.new("#{path}/stderr.txt", 'w')
23
+ file.puts stderr
24
+ file.close
25
+
26
+ status
27
+ end
28
+
29
+ def self.execute_successfully(cmd)
30
+ stdout, stderr, status = internal_execute(cmd)
31
+
32
+ unless status.success?
33
+ logger.error stdout
34
+ logger.error stderr
35
+ raise CmdException.new(cmd, stdout, stderr, status)
36
+ end
37
+
12
38
  stdout
13
39
  end
14
40
 
@@ -22,14 +48,12 @@ module PmdTester
22
48
 
23
49
  stdout, stderr, status = Open3.capture3("#{cmd};")
24
50
 
25
- logger.debug stdout
26
- unless status.success?
27
- logger.error stdout
28
- logger.error stderr
29
- raise CmdException.new(cmd, stderr)
30
- end
51
+ logger.debug "status: #{status}"
52
+ logger.debug "stdout: #{stdout}"
53
+ logger.debug "stderr: #{stderr}"
31
54
 
32
55
  stdout&.chomp!
56
+ stderr&.chomp!
33
57
 
34
58
  [stdout, stderr, status]
35
59
  end
@@ -40,15 +64,19 @@ module PmdTester
40
64
  # The exception should be raised when the shell command failed.
41
65
  class CmdException < StandardError
42
66
  attr_reader :cmd
67
+ attr_reader :stdout
43
68
  attr_reader :error
69
+ attr_reader :status
44
70
  attr_reader :message
45
71
 
46
72
  COMMON_MSG = 'An error occurred while executing the shell command'
47
73
 
48
- def initialize(cmd, error)
74
+ def initialize(cmd, stdout, error, status)
49
75
  @cmd = cmd
76
+ @stdout = stdout
50
77
  @error = error
51
- @message = "#{COMMON_MSG} '#{cmd}'"
78
+ @status = status
79
+ @message = "#{COMMON_MSG} '#{cmd}' #{status}"
52
80
  end
53
81
  end
54
82
  end
@@ -8,15 +8,22 @@ module PmdTester
8
8
  attr_accessor :execution_time
9
9
  attr_accessor :timestamp
10
10
  attr_accessor :working_dir
11
+ attr_accessor :exit_code
11
12
 
12
- def initialize(execution_time: 0, timestamp: '', working_dir: Dir.getwd)
13
+ def initialize(execution_time: 0, timestamp: '', working_dir: Dir.getwd, exit_code: nil)
13
14
  @execution_time = execution_time
14
15
  @timestamp = timestamp
15
16
  @working_dir = working_dir
17
+ @exit_code = exit_code.nil? ? '?' : exit_code.to_s
16
18
  end
17
19
 
18
20
  def save(report_info_path)
19
- hash = { execution_time: @execution_time, timestamp: @timestamp, working_dir: @working_dir }
21
+ hash = {
22
+ execution_time: @execution_time,
23
+ timestamp: @timestamp,
24
+ working_dir: @working_dir,
25
+ exit_code: @exit_code
26
+ }
20
27
  file = File.new(report_info_path, 'w')
21
28
  file.puts JSON.generate(hash)
22
29
  file.close
@@ -36,6 +43,13 @@ module PmdTester
36
43
  self.class.convert_seconds(@execution_time)
37
44
  end
38
45
 
46
+ def self.create(execution_time: 0, timestamp: '', working_dir: Dir.getwd, exit_code: nil, report_info_path:)
47
+ detail = PmdReportDetail.new(execution_time: execution_time, timestamp: timestamp,
48
+ working_dir: working_dir, exit_code: exit_code)
49
+ detail.save(report_info_path)
50
+ detail
51
+ end
52
+
39
53
  # convert seconds into HH::MM::SS
40
54
  def self.convert_seconds(seconds)
41
55
  Time.at(seconds.abs).utc.strftime('%H:%M:%S')
@@ -32,7 +32,8 @@ module PmdTester
32
32
  file: report_file,
33
33
 
34
34
  timestamp: report_details.timestamp,
35
- exec_time: report_details.execution_time
35
+ exec_time: report_details.execution_time,
36
+ exit_code: report_details.exit_code
36
37
  )
37
38
  end
38
39
 
@@ -123,6 +123,9 @@ module PmdTester
123
123
  get_report_info_path(base_branch),
124
124
  get_report_info_path(patch_branch),
125
125
  filter_set)
126
+
127
+ report_diff.base_report.report_folder = get_project_target_dir(base_branch)
128
+ report_diff.patch_report.report_folder = get_project_target_dir(patch_branch)
126
129
  end
127
130
  end
128
131
  end
@@ -57,17 +57,22 @@ module PmdTester
57
57
  :configerrors_by_rule,
58
58
  :exec_time,
59
59
  :timestamp,
60
+ :exit_code,
60
61
  :file
61
62
 
63
+ attr_accessor :report_folder
64
+
62
65
  def initialize(report_document: nil,
63
66
  file: '',
64
67
  exec_time: 0,
65
- timestamp: '0')
68
+ timestamp: '0',
69
+ exit_code: '?')
66
70
  initialize_empty
67
71
  initialize_with_report_document report_document unless report_document.nil?
68
72
  @exec_time = exec_time
69
73
  @timestamp = timestamp
70
74
  @file = file
75
+ @exit_code = exit_code
71
76
  end
72
77
 
73
78
  def self.empty
@@ -108,6 +113,7 @@ module PmdTester
108
113
  @violations_by_file = CollectionByFile.new
109
114
  @errors_by_file = CollectionByFile.new
110
115
  @configerrors_by_rule = {}
116
+ @report_folder = ''
111
117
  end
112
118
  end
113
119
 
@@ -97,8 +97,8 @@ module PmdTester
97
97
  unzip_cmd = "unzip -qo #{zip_filename}"
98
98
 
99
99
  Dir.chdir(target_path) do
100
- Cmd.execute(wget_cmd) unless File.exist?(zip_filename)
101
- Cmd.execute(unzip_cmd)
100
+ Cmd.execute_successfully(wget_cmd) unless File.exist?(zip_filename)
101
+ Cmd.execute_successfully(unzip_cmd)
102
102
  end
103
103
 
104
104
  "#{target_path}/#{branch_filename}"
@@ -4,6 +4,12 @@ module PmdTester
4
4
  # Utility to deal with semantic versions
5
5
  class Semver
6
6
  def self.compare(version_a, version_b)
7
+ result = internal_compare(version_a, version_b)
8
+ PmdTester.logger.debug " result: #{result}"
9
+ result
10
+ end
11
+
12
+ private_class_method def self.internal_compare(version_a, version_b)
7
13
  PmdTester.logger.debug "Comparing #{version_a} <=> #{version_b}"
8
14
  m = /(\d+)\.(\d+)\.(\d+)(.*)/.match(version_a)
9
15
  a_major = m[1].to_i
data/lib/pmdtester.rb CHANGED
@@ -33,7 +33,7 @@ require_relative 'pmdtester/parsers/projects_parser'
33
33
  # and unexpected behaviors will not be introduced to PMD project
34
34
  # after fixing an issue and new rules can work as expected.
35
35
  module PmdTester
36
- VERSION = '1.4.1'
36
+ VERSION = '1.5.0'
37
37
  BASE = 'base'
38
38
  PATCH = 'patch'
39
39
  PR_NUM_ENV_VAR = 'PMD_CI_PULL_REQUEST_NUMBER' # see PmdBranchDetail
data/pmdtester.gemspec CHANGED
@@ -1,17 +1,17 @@
1
1
  # DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake hoe:spec`.
2
2
 
3
3
  # -*- encoding: utf-8 -*-
4
- # stub: pmdtester 1.4.1 ruby lib
4
+ # stub: pmdtester 1.5.0 ruby lib
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "pmdtester".freeze
8
- s.version = "1.4.1"
8
+ s.version = "1.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
11
11
  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=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Andreas Dangel".freeze, "Binguo Bao".freeze, "Cl\u00E9ment Fournier".freeze]
14
- s.date = "2022-04-12"
14
+ s.date = "2022-05-06"
15
15
  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
16
16
  s.email = ["andreas.dangel@pmd-code.org".freeze, "djydewang@gmail.com".freeze, "clement.fournier76@gmail.com".freeze]
17
17
  s.executables = ["pmdtester".freeze]
@@ -71,6 +71,12 @@
71
71
  <td class="patch">{{diff.patch_timestamp}}</td>
72
72
  <td class="diff"></td>
73
73
  </tr>
74
+ <tr>
75
+ <td class="item">Exit Code</td>
76
+ <td class="base">{{diff.base_exit_code}} <a href="base_stdout.txt">stdout</a> | <a href="base_stderr.txt">stderr</a></td>
77
+ <td class="patch">{{diff.patch_exit_code}} <a href="patch_stdout.txt">stdout</a> | <a href="patch_stderr.txt">stderr</a></td>
78
+ <td class="diff"></td>
79
+ </tr>
74
80
  <tr>
75
81
  <td class="item">Full Report</td>
76
82
  <td class="base"><a href="base_pmd_report.html">Base PMD Report</a></td>
@@ -53,6 +53,10 @@
53
53
  <td class="item">Timestamp</td>
54
54
  <td class="{{branch}}">{{report.timestamp}}</td>
55
55
  </tr>
56
+ <tr>
57
+ <td class="item">Exit Code</td>
58
+ <td class="{{branch}}">{{report.exit_code}} <a href="{{branch}}_stdout.txt">stdout</a> | <a href="{{branch}}_stderr.txt">stderr</a></td>
59
+ </tr>
56
60
  <tr>
57
61
  <td class="item">Full Report</td>
58
62
  <td class="{{branch}}"><a href="{{branch}}_pmd_report.xml">{{branch}}_pmd_report.xml</a></td>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pmdtester
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Dangel
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-04-12 00:00:00.000000000 Z
13
+ date: 2022-05-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri