realityforge-buildr 1.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE +176 -0
- data/NOTICE +26 -0
- data/README.md +3 -0
- data/Rakefile +50 -0
- data/addon/buildr/checkstyle-report.xsl +104 -0
- data/addon/buildr/checkstyle.rb +254 -0
- data/addon/buildr/git_auto_version.rb +36 -0
- data/addon/buildr/gpg.rb +90 -0
- data/addon/buildr/gwt.rb +413 -0
- data/addon/buildr/jacoco.rb +161 -0
- data/addon/buildr/pmd.rb +185 -0
- data/addon/buildr/single_intermediate_layout.rb +71 -0
- data/addon/buildr/spotbugs.rb +265 -0
- data/addon/buildr/top_level_generate_dir.rb +37 -0
- data/addon/buildr/wsgen.rb +192 -0
- data/bin/buildr +20 -0
- data/buildr.gemspec +61 -0
- data/lib/buildr.rb +86 -0
- data/lib/buildr/core/application.rb +705 -0
- data/lib/buildr/core/assets.rb +96 -0
- data/lib/buildr/core/build.rb +587 -0
- data/lib/buildr/core/common.rb +167 -0
- data/lib/buildr/core/compile.rb +599 -0
- data/lib/buildr/core/console.rb +124 -0
- data/lib/buildr/core/doc.rb +275 -0
- data/lib/buildr/core/environment.rb +128 -0
- data/lib/buildr/core/filter.rb +405 -0
- data/lib/buildr/core/help.rb +114 -0
- data/lib/buildr/core/progressbar.rb +161 -0
- data/lib/buildr/core/project.rb +994 -0
- data/lib/buildr/core/test.rb +776 -0
- data/lib/buildr/core/transports.rb +456 -0
- data/lib/buildr/core/util.rb +77 -0
- data/lib/buildr/ide/idea.rb +1664 -0
- data/lib/buildr/java/commands.rb +230 -0
- data/lib/buildr/java/compiler.rb +85 -0
- data/lib/buildr/java/custom_pom.rb +300 -0
- data/lib/buildr/java/doc.rb +62 -0
- data/lib/buildr/java/packaging.rb +393 -0
- data/lib/buildr/java/pom.rb +191 -0
- data/lib/buildr/java/test_result.rb +54 -0
- data/lib/buildr/java/tests.rb +111 -0
- data/lib/buildr/packaging/archive.rb +586 -0
- data/lib/buildr/packaging/artifact.rb +1113 -0
- data/lib/buildr/packaging/artifact_namespace.rb +1010 -0
- data/lib/buildr/packaging/artifact_search.rb +138 -0
- data/lib/buildr/packaging/package.rb +237 -0
- data/lib/buildr/packaging/version_requirement.rb +189 -0
- data/lib/buildr/packaging/zip.rb +189 -0
- data/lib/buildr/packaging/ziptask.rb +387 -0
- data/lib/buildr/version.rb +18 -0
- data/rakelib/release.rake +99 -0
- data/spec/addon/checkstyle_spec.rb +58 -0
- data/spec/core/application_spec.rb +576 -0
- data/spec/core/build_spec.rb +922 -0
- data/spec/core/common_spec.rb +670 -0
- data/spec/core/compile_spec.rb +656 -0
- data/spec/core/console_spec.rb +65 -0
- data/spec/core/doc_spec.rb +194 -0
- data/spec/core/extension_spec.rb +200 -0
- data/spec/core/project_spec.rb +736 -0
- data/spec/core/test_spec.rb +1131 -0
- data/spec/core/transport_spec.rb +452 -0
- data/spec/core/util_spec.rb +154 -0
- data/spec/ide/idea_spec.rb +1952 -0
- data/spec/java/commands_spec.rb +79 -0
- data/spec/java/compiler_spec.rb +274 -0
- data/spec/java/custom_pom_spec.rb +165 -0
- data/spec/java/doc_spec.rb +55 -0
- data/spec/java/packaging_spec.rb +786 -0
- data/spec/java/pom_spec.rb +162 -0
- data/spec/java/test_coverage_helper.rb +257 -0
- data/spec/java/tests_spec.rb +224 -0
- data/spec/packaging/archive_spec.rb +686 -0
- data/spec/packaging/artifact_namespace_spec.rb +757 -0
- data/spec/packaging/artifact_spec.rb +1351 -0
- data/spec/packaging/packaging_helper.rb +63 -0
- data/spec/packaging/packaging_spec.rb +690 -0
- data/spec/sandbox.rb +166 -0
- data/spec/spec_helpers.rb +420 -0
- data/spec/version_requirement_spec.rb +145 -0
- data/spec/xpath_matchers.rb +123 -0
- metadata +295 -0
@@ -0,0 +1,161 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module Buildr
|
17
|
+
# Initial support for JaCoCo coverage reports.
|
18
|
+
module JaCoCo
|
19
|
+
class << self
|
20
|
+
def agent_spec
|
21
|
+
%w(org.jacoco:org.jacoco.agent:jar:runtime:0.8.6)
|
22
|
+
end
|
23
|
+
|
24
|
+
def dependencies
|
25
|
+
%w[
|
26
|
+
args4j:args4j:jar:2.0.28
|
27
|
+
org.jacoco:org.jacoco.report:jar:0.8.6
|
28
|
+
org.jacoco:org.jacoco.core:jar:0.8.6
|
29
|
+
org.jacoco:org.jacoco.cli:jar:0.8.6
|
30
|
+
org.ow2.asm:asm:jar:8.0.1
|
31
|
+
org.ow2.asm:asm-commons:jar:8.0.1
|
32
|
+
org.ow2.asm:asm-tree:jar:8.0.1
|
33
|
+
org.ow2.asm:asm-analysis:jar:8.0.1
|
34
|
+
org.ow2.asm:asm-util:jar:8.0.1
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def jacoco_report(execution_files, class_paths, source_paths, options = {})
|
39
|
+
|
40
|
+
xml_output_file = options[:xml_output_file]
|
41
|
+
csv_output_file = options[:csv_output_file]
|
42
|
+
html_output_directory = options[:html_output_directory]
|
43
|
+
|
44
|
+
Buildr.artifacts(self.dependencies).each { |a| a.invoke if a.respond_to?(:invoke) }
|
45
|
+
|
46
|
+
args = []
|
47
|
+
args << 'report'
|
48
|
+
args += execution_files
|
49
|
+
class_paths.each do |class_path|
|
50
|
+
args << '--classfiles' << class_path
|
51
|
+
end
|
52
|
+
args << '--csv' << csv_output_file if csv_output_file
|
53
|
+
args << '--encoding' << 'UTF-8'
|
54
|
+
args << '--html' << html_output_directory if html_output_directory
|
55
|
+
source_paths.each do |source_path|
|
56
|
+
args << '--sourcefiles' << source_path
|
57
|
+
end
|
58
|
+
args << '--xml' << xml_output_file if xml_output_file
|
59
|
+
|
60
|
+
Java::Commands.java 'org.jacoco.cli.internal.Main', *(args + [{ :classpath => Buildr.artifacts(self.dependencies), :properties => options[:properties], :java_args => options[:java_args] }])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class Config
|
65
|
+
attr_writer :enabled
|
66
|
+
|
67
|
+
def enabled?
|
68
|
+
@enabled.nil? ? true : @enabled
|
69
|
+
end
|
70
|
+
|
71
|
+
attr_accessor :destfile
|
72
|
+
|
73
|
+
attr_writer :output
|
74
|
+
|
75
|
+
def output
|
76
|
+
@output ||= 'file'
|
77
|
+
end
|
78
|
+
|
79
|
+
attr_accessor :sessionid
|
80
|
+
attr_accessor :address
|
81
|
+
attr_accessor :port
|
82
|
+
attr_accessor :classdumpdir
|
83
|
+
attr_accessor :dumponexit
|
84
|
+
attr_accessor :append
|
85
|
+
attr_accessor :exclclassloader
|
86
|
+
|
87
|
+
def includes
|
88
|
+
@includes ||= []
|
89
|
+
end
|
90
|
+
|
91
|
+
def excludes
|
92
|
+
@excludes ||= []
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
def initialize(destfile)
|
98
|
+
@destfile = destfile
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module ProjectExtension
|
103
|
+
include Extension
|
104
|
+
|
105
|
+
def jacoco
|
106
|
+
@jacoco ||= Buildr::JaCoCo::Config.new(project._(:reports, :jacoco, 'jacoco.cov'))
|
107
|
+
end
|
108
|
+
|
109
|
+
after_define do |project|
|
110
|
+
unless project.test.compile.target.nil? || !project.jacoco.enabled?
|
111
|
+
project.test.setup do
|
112
|
+
agent_jar = Buildr.artifacts(Buildr::JaCoCo.agent_spec).each(&:invoke).map(&:to_s).join('')
|
113
|
+
options = []
|
114
|
+
%w(destfile append exclclassloader sessionid dumponexit output address port classdumpdir).each do |option|
|
115
|
+
value = project.jacoco.send(option.to_sym)
|
116
|
+
options << "#{option}=#{value}" unless value.nil?
|
117
|
+
end
|
118
|
+
options << "includes=#{project.jacoco.includes.join(':')}" unless project.jacoco.includes.empty?
|
119
|
+
options << "excludes=#{project.jacoco.excludes.join(':')}" unless project.jacoco.excludes.empty?
|
120
|
+
|
121
|
+
agent_config = "-javaagent:#{agent_jar}=#{options.join(',')}"
|
122
|
+
existing = project.test.options[:java_args] || []
|
123
|
+
project.test.options[:java_args] = (existing.is_a?(Array) ? existing : [existing]) + [agent_config]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
namespace 'jacoco' do
|
128
|
+
desc 'Generate JaCoCo reports.'
|
129
|
+
task 'report' do
|
130
|
+
|
131
|
+
execution_files = []
|
132
|
+
class_paths = []
|
133
|
+
source_paths = []
|
134
|
+
Buildr.projects.select { |p| p.jacoco.enabled? }.each do |project|
|
135
|
+
execution_files << project.jacoco.destfile if File.exist?(project.jacoco.destfile)
|
136
|
+
target = project.compile.target.to_s
|
137
|
+
class_paths << target.to_s if File.exist?(target)
|
138
|
+
project.compile.sources.flatten.map(&:to_s).each do |src|
|
139
|
+
source_paths << src.to_s if File.exist?(src)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
project = Buildr.projects[0].root_project
|
144
|
+
|
145
|
+
options = {}
|
146
|
+
options[:xml_output_file] = project._(:reports, :jacoco, 'jacoco.xml')
|
147
|
+
options[:csv_output_file] = project._(:reports, :jacoco, 'jacoco.csv')
|
148
|
+
options[:html_output_directory] = project._(:reports, :jacoco, 'docs')
|
149
|
+
|
150
|
+
unless execution_files.empty?
|
151
|
+
Buildr::JaCoCo.jacoco_report(execution_files, class_paths, source_paths, options)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
class Buildr::Project
|
160
|
+
include Buildr::JaCoCo::ProjectExtension
|
161
|
+
end
|
data/addon/buildr/pmd.rb
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module Buildr
|
17
|
+
# Provides the <code>pmd:xml</code> and <code>pmd:html</code> tasks.
|
18
|
+
#
|
19
|
+
# Require explicitly using <code>require 'buildr/pmd'</code>.
|
20
|
+
module Pmd
|
21
|
+
|
22
|
+
class << self
|
23
|
+
|
24
|
+
# The specs for requirements
|
25
|
+
def dependencies
|
26
|
+
%w(
|
27
|
+
net.sourceforge.pmd:pmd-core:jar:6.11.0
|
28
|
+
net.sourceforge.pmd:pmd-java:jar:6.11.0
|
29
|
+
net.sourceforge.pmd:pmd-java8:jar:6.11.0
|
30
|
+
jaxen:jaxen:jar:1.1.6
|
31
|
+
commons-io:commons-io:jar:2.6
|
32
|
+
com.beust:jcommander:jar:1.72
|
33
|
+
org.ow2.asm:asm:jar:7.1
|
34
|
+
com.google.code.gson:gson:jar:2.8.5
|
35
|
+
net.java.dev.javacc:javacc:jar:5.0
|
36
|
+
net.sourceforge.saxon:saxon:jar:9.1.0.8
|
37
|
+
org.apache.commons:commons-lang3:jar:3.8.1
|
38
|
+
org.antlr:antlr4-runtime:jar:4.7
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def pmd(rule_set_files, format, output_file_prefix, source_paths, options = {})
|
43
|
+
dependencies = (options[:dependencies] || []) + self.dependencies
|
44
|
+
cp = Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s)
|
45
|
+
(options[:rule_set_paths] || []).each {|p| cp << p}
|
46
|
+
|
47
|
+
rule_sets = rule_set_files.dup
|
48
|
+
|
49
|
+
Buildr.artifacts(options[:rule_set_artifacts] || []).each do |artifact|
|
50
|
+
a = artifact.to_s
|
51
|
+
dirname = File.dirname(a)
|
52
|
+
rule_sets << a[dirname.length + 1, a.length]
|
53
|
+
cp << File.dirname(a)
|
54
|
+
artifact.invoke
|
55
|
+
end
|
56
|
+
|
57
|
+
puts 'PMD: Analyzing source code...'
|
58
|
+
mkdir_p File.dirname(output_file_prefix)
|
59
|
+
|
60
|
+
args = []
|
61
|
+
args << '-no-cache'
|
62
|
+
args << '-shortnames'
|
63
|
+
args << '-rulesets' << rule_sets.join(',')
|
64
|
+
args << '-format' << format
|
65
|
+
args << '-reportfile' << "#{output_file_prefix}.#{format}"
|
66
|
+
|
67
|
+
files = []
|
68
|
+
source_paths.each do |src|
|
69
|
+
files += Dir["#{src}/**/*.java"] if File.directory?(src)
|
70
|
+
end
|
71
|
+
files = files.sort.uniq
|
72
|
+
|
73
|
+
Tempfile.open('pmd') do |tmp|
|
74
|
+
tmp.write files.join(',')
|
75
|
+
args << '-filelist' << tmp.path.to_s
|
76
|
+
end
|
77
|
+
|
78
|
+
begin
|
79
|
+
Java::Commands.java 'net.sourceforge.pmd.PMD', *(args + [{:classpath => cp, :properties => options[:properties], :java_args => options[:java_args]}])
|
80
|
+
rescue Exception => e
|
81
|
+
raise e if options[:fail_on_error]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class Config
|
87
|
+
|
88
|
+
attr_writer :enabled
|
89
|
+
|
90
|
+
def enabled?
|
91
|
+
!!@enabled
|
92
|
+
end
|
93
|
+
|
94
|
+
attr_writer :rule_set_files
|
95
|
+
|
96
|
+
def rule_set_files
|
97
|
+
@rule_set_files ||= (self.rule_set_artifacts.empty? ? %w(rulesets/java/basic.xml rulesets/java/imports.xml rulesets/java/unusedcode.xml rulesets/java/finalizers.xml rulesets/java/braces.xml) : [])
|
98
|
+
end
|
99
|
+
|
100
|
+
# Support specification of rule sets that are distributed as part of a maven repository
|
101
|
+
def rule_set_artifacts
|
102
|
+
@rule_set_artifacts ||= []
|
103
|
+
end
|
104
|
+
|
105
|
+
attr_writer :rule_set_paths
|
106
|
+
|
107
|
+
def rule_set_paths
|
108
|
+
@rule_set_paths ||= []
|
109
|
+
end
|
110
|
+
|
111
|
+
attr_writer :report_dir
|
112
|
+
|
113
|
+
def report_dir
|
114
|
+
@report_dir || project._(:reports, :pmd)
|
115
|
+
end
|
116
|
+
|
117
|
+
attr_writer :output_file_prefix
|
118
|
+
|
119
|
+
def output_file_prefix
|
120
|
+
@output_file_prefix || "#{self.report_dir}/pmd"
|
121
|
+
end
|
122
|
+
|
123
|
+
def source_paths
|
124
|
+
@source_paths ||= [self.project.compile.sources, self.project.test.compile.sources].flatten.compact
|
125
|
+
end
|
126
|
+
|
127
|
+
# An array of paths that should be excluded no matter how they are added to pmd
|
128
|
+
def exclude_paths
|
129
|
+
@source_paths ||= []
|
130
|
+
end
|
131
|
+
|
132
|
+
# An array of additional projects to scan for main and test sources
|
133
|
+
attr_writer :additional_project_names
|
134
|
+
|
135
|
+
def additional_project_names
|
136
|
+
@additional_project_names ||= []
|
137
|
+
end
|
138
|
+
|
139
|
+
def flat_source_paths
|
140
|
+
paths = source_paths.dup
|
141
|
+
|
142
|
+
self.additional_project_names.each do |project_name|
|
143
|
+
p = self.project.project(project_name)
|
144
|
+
paths << [p.compile.sources, p.test.compile.sources].flatten.compact
|
145
|
+
end
|
146
|
+
|
147
|
+
paths.flatten.select{|p|!self.exclude_paths.include?(p)}.compact
|
148
|
+
end
|
149
|
+
|
150
|
+
protected
|
151
|
+
|
152
|
+
def initialize(project)
|
153
|
+
@project = project
|
154
|
+
end
|
155
|
+
|
156
|
+
attr_reader :project
|
157
|
+
end
|
158
|
+
|
159
|
+
module ProjectExtension
|
160
|
+
include Extension
|
161
|
+
|
162
|
+
def pmd
|
163
|
+
@pmd ||= Buildr::Pmd::Config.new(project)
|
164
|
+
end
|
165
|
+
|
166
|
+
after_define do |project|
|
167
|
+
if project.pmd.enabled?
|
168
|
+
desc 'Generate pmd xml report.'
|
169
|
+
project.task('pmd:xml') do
|
170
|
+
Buildr::Pmd.pmd(project.pmd.rule_set_files, 'xml', project.pmd.output_file_prefix, project.pmd.flat_source_paths, :rule_set_paths => project.pmd.rule_set_paths, :rule_set_artifacts => project.pmd.rule_set_artifacts)
|
171
|
+
end
|
172
|
+
|
173
|
+
desc 'Generate pmd html report.'
|
174
|
+
project.task('pmd:html') do
|
175
|
+
Buildr::Pmd.pmd(project.pmd.rule_set_files, 'html', project.pmd.output_file_prefix, project.pmd.flat_source_paths, :rule_set_paths => project.pmd.rule_set_paths, :rule_set_artifacts => project.pmd.rule_set_artifacts)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
class Buildr::Project
|
184
|
+
include Buildr::Pmd::ProjectExtension
|
185
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module Buildr #nodoc
|
17
|
+
class Project #nodoc
|
18
|
+
class << self
|
19
|
+
|
20
|
+
alias :original_define :define
|
21
|
+
|
22
|
+
# Monkey patch the built-in define so that there is a single root directory for
|
23
|
+
# all of the generated artifacts within a project hierarchy.
|
24
|
+
#
|
25
|
+
def define(name, properties = nil, &block) #:yields:project
|
26
|
+
|
27
|
+
properties = properties.nil? ? {} : properties.dup
|
28
|
+
|
29
|
+
parent_name = name.split(':')[0...-1]
|
30
|
+
parent = parent_name.empty? ? nil : Buildr.application.lookup(parent_name.join(':'))
|
31
|
+
|
32
|
+
# Follow the same algorithm as in project code
|
33
|
+
if properties[:base_dir]
|
34
|
+
base_dir = properties[:base_dir]
|
35
|
+
elsif parent
|
36
|
+
base_dir = File.expand_path(name.split(':').last, parent.base_dir)
|
37
|
+
else
|
38
|
+
base_dir = Dir.pwd
|
39
|
+
end
|
40
|
+
|
41
|
+
# The top directory is the base directory of the root project
|
42
|
+
top_dir = base_dir
|
43
|
+
while parent
|
44
|
+
top_dir = parent.base_dir
|
45
|
+
parent = parent.parent
|
46
|
+
end
|
47
|
+
|
48
|
+
target_dir = "#{top_dir}/target/#{name.gsub(':', '_')}"
|
49
|
+
reports_dir = "#{top_dir}/reports/#{name.gsub(':', '_')}"
|
50
|
+
target_dir = ::Buildr::Util.relative_path(target_dir, File.expand_path(base_dir))
|
51
|
+
reports_dir = ::Buildr::Util.relative_path(reports_dir, File.expand_path(base_dir))
|
52
|
+
|
53
|
+
properties[:layout] = Buildr::Layout::Default.new unless properties[:layout]
|
54
|
+
properties[:layout][:target] = target_dir
|
55
|
+
properties[:layout][:reports] = reports_dir
|
56
|
+
properties[:layout][:target, :main] = target_dir
|
57
|
+
|
58
|
+
Project.original_define(name, properties) do
|
59
|
+
project.instance_eval &block
|
60
|
+
if top_dir == base_dir && project.iml?
|
61
|
+
project.iml.excluded_directories << "#{base_dir}/target"
|
62
|
+
project.iml.excluded_directories << "#{base_dir}/reports"
|
63
|
+
clean { rm_rf "#{base_dir}/target" }
|
64
|
+
clean { rm_rf "#{base_dir}/reports" }
|
65
|
+
end
|
66
|
+
project
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,265 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module Buildr
|
17
|
+
# Provides the <code>spotbugs:html</code> and <code>spotbugs:xml</code> tasks.
|
18
|
+
# Require explicitly using <code>require "buildr/spotbugs"</code>.
|
19
|
+
module Spotbugs
|
20
|
+
|
21
|
+
class << self
|
22
|
+
|
23
|
+
# The specs for requirements
|
24
|
+
def dependencies
|
25
|
+
%w(
|
26
|
+
com.github.spotbugs:spotbugs:jar:4.2.1
|
27
|
+
com.github.spotbugs:spotbugs-annotations:jar:4.2.1
|
28
|
+
com.google.code.findbugs:jsr305:jar:3.0.2
|
29
|
+
net.jcip:jcip-annotations:jar:1.0
|
30
|
+
org.apache.bcel:bcel:jar:6.5.0
|
31
|
+
org.apache.commons:commons-lang3:jar:3.11
|
32
|
+
org.apache.commons:commons-text:jar:1.9
|
33
|
+
org.dom4j:dom4j:jar:2.1.3
|
34
|
+
org.json:json:jar:20201115
|
35
|
+
org.ow2.asm:asm:jar:9.0
|
36
|
+
org.ow2.asm:asm-analysis:jar:9.0
|
37
|
+
org.ow2.asm:asm-tree:jar:9.0
|
38
|
+
org.ow2.asm:asm-commons:jar:9.0
|
39
|
+
org.ow2.asm:asm-util:jar:9.0
|
40
|
+
org.slf4j:slf4j-api:jar:1.7.30
|
41
|
+
org.slf4j:slf4j-jdk14:jar:1.7.30
|
42
|
+
jaxen:jaxen:jar:1.2.0
|
43
|
+
net.sf.saxon:Saxon-HE:jar:10.3
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def fb_contrib_dependencies
|
48
|
+
%w(com.mebigfatguy.fb-contrib:fb-contrib:jar:7.4.2.sb)
|
49
|
+
end
|
50
|
+
|
51
|
+
def spotbugs(output_file, source_paths, analyze_paths, options = {})
|
52
|
+
plugins = self.fb_contrib_dependencies
|
53
|
+
Buildr.artifacts(self.dependencies).each { |a| a.invoke if a.respond_to?(:invoke) }
|
54
|
+
|
55
|
+
args = []
|
56
|
+
args << '-textui'
|
57
|
+
packages_to_analyze = options[:packages_to_analyze] || []
|
58
|
+
if packages_to_analyze.size > 0
|
59
|
+
args << '-onlyAnalyze' << (packages_to_analyze.collect{|p| "#{p}.-"}.join(',') + ':')
|
60
|
+
end
|
61
|
+
args << '-effort:max'
|
62
|
+
args << '-medium'
|
63
|
+
args << ('html' == options[:output] ? '-html' : '-xml:withMessages')
|
64
|
+
args << '-output' << output_file
|
65
|
+
args << '-sourcepath' << source_paths.map(&:to_s).join(File::PATH_SEPARATOR)
|
66
|
+
args << '-pluginList' << Buildr.artifacts(plugins).map(&:to_s).join(File::PATH_SEPARATOR)
|
67
|
+
|
68
|
+
extra_dependencies = (options[:extra_dependencies] || []) + plugins
|
69
|
+
if 0 != extra_dependencies.size
|
70
|
+
args << '-auxclasspath' << Buildr.artifacts(extra_dependencies).each { |a| a.invoke if a.respond_to?(:invoke) }.map(&:to_s).join(File::PATH_SEPARATOR)
|
71
|
+
end
|
72
|
+
if options[:exclude_filter]
|
73
|
+
args << '-exclude' << options[:exclude_filter]
|
74
|
+
end
|
75
|
+
|
76
|
+
analyze_paths.each do |dep|
|
77
|
+
a = dep.is_a?(String) ? file(dep) : dep
|
78
|
+
a.invoke
|
79
|
+
args << a.to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
mkdir_p File.dirname(output_file)
|
83
|
+
|
84
|
+
begin
|
85
|
+
Java::Commands.java 'edu.umd.cs.findbugs.LaunchAppropriateUI', *(args + [{:classpath => Buildr.artifacts(dependencies), :properties => options[:properties], :java_args => options[:java_args]}])
|
86
|
+
rescue Exception => e
|
87
|
+
puts e
|
88
|
+
raise e if options[:fail_on_error]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class Config
|
94
|
+
|
95
|
+
attr_accessor :enabled
|
96
|
+
|
97
|
+
def enabled?
|
98
|
+
!!@enabled
|
99
|
+
end
|
100
|
+
|
101
|
+
attr_writer :config_directory
|
102
|
+
|
103
|
+
def config_directory
|
104
|
+
@config_directory || project._(:source, :main, :etc, :spotbugs)
|
105
|
+
end
|
106
|
+
|
107
|
+
attr_writer :report_dir
|
108
|
+
|
109
|
+
def report_dir
|
110
|
+
@report_dir || project._(:reports, :spotbugs)
|
111
|
+
end
|
112
|
+
|
113
|
+
attr_writer :fail_on_error
|
114
|
+
|
115
|
+
def fail_on_error?
|
116
|
+
@fail_on_error.nil? ? false : @fail_on_error
|
117
|
+
end
|
118
|
+
|
119
|
+
attr_writer :xml_output_file
|
120
|
+
|
121
|
+
def xml_output_file
|
122
|
+
@xml_output_file || "#{self.report_dir}/spotbugs.xml"
|
123
|
+
end
|
124
|
+
|
125
|
+
attr_writer :html_output_file
|
126
|
+
|
127
|
+
def html_output_file
|
128
|
+
@html_output_file || "#{self.report_dir}/spotbugs.html"
|
129
|
+
end
|
130
|
+
|
131
|
+
attr_writer :filter_file
|
132
|
+
|
133
|
+
def filter_file
|
134
|
+
@filter_file || "#{self.config_directory}/filter.xml"
|
135
|
+
end
|
136
|
+
|
137
|
+
def properties
|
138
|
+
@properties ||= {}
|
139
|
+
end
|
140
|
+
|
141
|
+
attr_writer :java_args
|
142
|
+
|
143
|
+
def java_args
|
144
|
+
@java_args || '-server -Xss1m -Xmx1.4G -Duser.language=en -Duser.region=EN'
|
145
|
+
end
|
146
|
+
|
147
|
+
def packages_to_analyze
|
148
|
+
@packages_to_analyze ||= [self.project.java_package_name]
|
149
|
+
end
|
150
|
+
|
151
|
+
def source_paths
|
152
|
+
@source_paths ||= [self.project.compile.sources, self.project.test.compile.sources].flatten.compact
|
153
|
+
end
|
154
|
+
|
155
|
+
def analyze_paths
|
156
|
+
@analyze_path ||= [self.project.compile.target]
|
157
|
+
end
|
158
|
+
|
159
|
+
def extra_dependencies
|
160
|
+
@extra_dependencies ||= [self.project.compile.dependencies, self.project.test.compile.dependencies].flatten.compact
|
161
|
+
end
|
162
|
+
|
163
|
+
# An array of additional projects to scan for main and test sources
|
164
|
+
attr_writer :additional_project_names
|
165
|
+
|
166
|
+
def additional_project_names
|
167
|
+
@additional_project_names ||= []
|
168
|
+
end
|
169
|
+
|
170
|
+
def complete_source_paths
|
171
|
+
paths = self.source_paths.dup
|
172
|
+
|
173
|
+
self.additional_project_names.each do |project_name|
|
174
|
+
p = self.project.project(project_name)
|
175
|
+
paths << [p.compile.sources, p.test.compile.sources].flatten.compact
|
176
|
+
end
|
177
|
+
|
178
|
+
paths.flatten.compact
|
179
|
+
end
|
180
|
+
|
181
|
+
def complete_analyze_paths
|
182
|
+
paths = self.analyze_paths.dup
|
183
|
+
|
184
|
+
self.additional_project_names.each do |project_name|
|
185
|
+
paths << self.project.project(project_name).compile.target
|
186
|
+
end
|
187
|
+
|
188
|
+
paths.flatten.compact
|
189
|
+
end
|
190
|
+
|
191
|
+
def complete_extra_dependencies
|
192
|
+
deps = self.extra_dependencies.dup
|
193
|
+
|
194
|
+
self.additional_project_names.each do |project_name|
|
195
|
+
p = self.project.project(project_name)
|
196
|
+
deps << [p.compile.dependencies, p.test.compile.dependencies].flatten.compact
|
197
|
+
end
|
198
|
+
|
199
|
+
deps.flatten.compact
|
200
|
+
end
|
201
|
+
|
202
|
+
protected
|
203
|
+
|
204
|
+
def initialize(project)
|
205
|
+
@project = project
|
206
|
+
end
|
207
|
+
|
208
|
+
attr_reader :project
|
209
|
+
end
|
210
|
+
|
211
|
+
module ProjectExtension
|
212
|
+
include Extension
|
213
|
+
|
214
|
+
def spotbugs
|
215
|
+
@spotbugs ||= Buildr::Spotbugs::Config.new(project)
|
216
|
+
end
|
217
|
+
|
218
|
+
after_define do |project|
|
219
|
+
if project.spotbugs.enabled?
|
220
|
+
desc 'Generate spotbugs xml report.'
|
221
|
+
project.task('spotbugs:xml') do
|
222
|
+
puts 'Spotbugs: Analyzing source code...'
|
223
|
+
options =
|
224
|
+
{
|
225
|
+
:packages_to_analyze => project.spotbugs.packages_to_analyze,
|
226
|
+
:properties => project.spotbugs.properties,
|
227
|
+
:fail_on_error => project.spotbugs.fail_on_error?,
|
228
|
+
:extra_dependencies => project.spotbugs.complete_extra_dependencies
|
229
|
+
}
|
230
|
+
options[:exclude_filter] = project.spotbugs.filter_file if File.exist?(project.spotbugs.filter_file)
|
231
|
+
options[:output] = 'xml:withMessages'
|
232
|
+
|
233
|
+
Buildr::Spotbugs.spotbugs(project.spotbugs.xml_output_file,
|
234
|
+
project.spotbugs.complete_source_paths,
|
235
|
+
project.spotbugs.complete_analyze_paths,
|
236
|
+
options)
|
237
|
+
end
|
238
|
+
|
239
|
+
desc 'Generate spotbugs html report.'
|
240
|
+
project.task('spotbugs:html') do
|
241
|
+
puts 'Spotbugs: Analyzing source code...'
|
242
|
+
options =
|
243
|
+
{
|
244
|
+
:packages_to_analyze => project.spotbugs.packages_to_analyze,
|
245
|
+
:properties => project.spotbugs.properties,
|
246
|
+
:fail_on_error => project.spotbugs.fail_on_error?,
|
247
|
+
:extra_dependencies => project.spotbugs.complete_extra_dependencies
|
248
|
+
}
|
249
|
+
options[:exclude_filter] = project.spotbugs.filter_file if File.exist?(project.spotbugs.filter_file)
|
250
|
+
options[:output] = 'html'
|
251
|
+
|
252
|
+
Buildr::Spotbugs.spotbugs(project.spotbugs.html_output_file,
|
253
|
+
project.spotbugs.complete_source_paths,
|
254
|
+
project.spotbugs.complete_analyze_paths,
|
255
|
+
options)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
class Buildr::Project
|
264
|
+
include Buildr::Spotbugs::ProjectExtension
|
265
|
+
end
|