Skip to content
This repository was archived by the owner on Feb 28, 2019. It is now read-only.

Commit 61665b7

Browse files
committed
Add supporting build tasks
1 parent 273203a commit 61665b7

File tree

4 files changed

+371
-0
lines changed

4 files changed

+371
-0
lines changed

tasks/custom_pom_patch.rake

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
raise 'Patch already integrated into buildr code' unless Buildr::VERSION.to_s == '1.5.5'
2+
3+
class Buildr::CustomPom
4+
attr_accessor :dependency_filter
5+
6+
def additional_dependencies
7+
@additional_dependencies ||= []
8+
end
9+
10+
def additional_dependencies=(additional_dependencies)
11+
@additional_dependencies = additional_dependencies
12+
end
13+
14+
def include_transitive_dependencies
15+
@include_transitive_dependencies ||= []
16+
end
17+
18+
def include_transitive_dependencies=(include_transitive_dependencies)
19+
@include_transitive_dependencies = include_transitive_dependencies
20+
end
21+
22+
def self.pom_xml(project, package)
23+
Proc.new do
24+
xml = Builder::XmlMarkup.new(:indent => 2)
25+
xml.instruct!
26+
xml.project('xmlns' => 'http://maven.apache.org/POM/4.0.0',
27+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
28+
'xsi:schemaLocation' => 'http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd') do
29+
xml.modelVersion '4.0.0'
30+
xml.parent do
31+
xml.groupId 'org.sonatype.oss'
32+
xml.artifactId 'oss-parent'
33+
xml.version '8'
34+
end
35+
xml.groupId project.group
36+
xml.artifactId project.id
37+
xml.version project.version
38+
candidates = project.packages.select {|p| p.classifier.nil?}.collect {|p| p.type.to_s}
39+
packaging = !candidates.empty? ? candidates[0] : (project.compile.packaging || :zip).to_s
40+
xml.packaging packaging
41+
42+
xml.name project.pom.name if project.pom.name
43+
xml.description project.pom.description if project.pom.description
44+
xml.url project.pom.url if project.pom.url
45+
46+
xml.licenses do
47+
project.pom.licenses.each_pair do |name, url|
48+
xml.license do
49+
xml.name name
50+
xml.url url
51+
xml.distribution 'repo'
52+
end
53+
end
54+
end unless project.pom.licenses.empty?
55+
56+
if project.pom.scm_url || project.pom.scm_connection || project.pom.scm_developer_connection
57+
xml.scm do
58+
xml.connection project.pom.scm_connection if project.pom.scm_connection
59+
xml.developerConnection project.pom.scm_developer_connection if project.pom.scm_developer_connection
60+
xml.url project.pom.scm_url if project.pom.scm_url
61+
end
62+
end
63+
64+
if project.pom.issues_url
65+
xml.issueManagement do
66+
xml.url project.pom.issues_url
67+
xml.system project.pom.issues_system if project.pom.issues_system
68+
end
69+
end
70+
71+
xml.developers do
72+
project.pom.developers.each do |developer|
73+
xml.developer do
74+
xml.id developer.id
75+
xml.name developer.name if developer.name
76+
xml.email developer.email if developer.email
77+
if developer.roles
78+
xml.roles do
79+
developer.roles.each do |role|
80+
xml.role role
81+
end
82+
end
83+
end
84+
end
85+
end
86+
end unless project.pom.developers.empty?
87+
88+
provided_deps = Buildr.artifacts(project.pom.provided_dependencies)
89+
runtime_deps = Buildr.artifacts(project.pom.runtime_dependencies)
90+
additional_deps = Buildr.artifacts(project.pom.additional_dependencies)
91+
include_transitive_deps = Buildr.artifacts(project.pom.include_transitive_dependencies).collect {|dep| dep.to_s}
92+
optional_deps = Buildr.artifacts(project.pom.optional_dependencies).collect{|dep| dep.to_s}
93+
94+
done = []
95+
96+
deps = []
97+
deps += provided_deps.
98+
select {|d| d.is_a?(ActsAsArtifact)}.
99+
select {|d| !done.include?(d.to_s)}.
100+
collect {|dep| done << dep.to_s; dep.to_hash.merge(:scope => 'provided', :optional => optional_deps.include?(dep.to_s), :include_transitive => include_transitive_deps.include?(dep.to_s), :artifact => dep)}
101+
deps += runtime_deps.
102+
select {|d| d.is_a?(ActsAsArtifact)}.
103+
select {|d| !done.include?(d.to_s)}.
104+
collect {|dep| done << dep.to_s; dep.to_hash.merge(:scope => 'runtime', :optional => optional_deps.include?(dep.to_s), :include_transitive => include_transitive_deps.include?(dep.to_s), :artifact => dep)}
105+
deps += additional_deps.
106+
select {|d| d.is_a?(ActsAsArtifact)}.
107+
select {|d| !done.include?(d.to_s)}.
108+
collect {|dep| done << dep.to_s; dep.to_hash.merge(:scope => 'compile', :optional => optional_deps.include?(dep.to_s), :include_transitive => include_transitive_deps.include?(dep.to_s), :artifact => dep)}
109+
110+
deps +=
111+
Buildr.artifacts(project.compile.dependencies).
112+
select {|d| d.is_a?(ActsAsArtifact)}.
113+
select {|d| !done.include?(d.to_s)}.
114+
collect {|d| done << d.to_s; d.to_hash.merge(:scope => 'compile', :optional => optional_deps.include?(d.to_s), :include_transitive => include_transitive_deps.include?(d.to_s), :artifact => d)}
115+
116+
deps += Buildr.artifacts(project.test.compile.dependencies).
117+
select {|d| d.is_a?(ActsAsArtifact)}.
118+
select {|d| !done.include?(d.to_s)}.
119+
collect {|d| d.to_hash.merge(:scope => 'test', :include_transitive => include_transitive_deps.include?(d.to_s), :artifact => d)}
120+
121+
xml.dependencies do
122+
deps.select {|dependency| project.pom.dependency_filter.nil? ? true : project.pom.dependency_filter.call(dependency)}.each do |dependency|
123+
xml.dependency do
124+
xml.groupId dependency[:group]
125+
xml.artifactId dependency[:id]
126+
xml.version dependency[:version]
127+
xml.classifier dependency[:classifier] if dependency[:classifier] && dependency[:classifier].to_s != 'jar'
128+
xml.scope dependency[:scope] unless dependency[:scope] == 'compile'
129+
xml.optional true if dependency[:optional]
130+
unless dependency[:include_transitive]
131+
xml.exclusions do
132+
xml.exclusion do
133+
xml.groupId '*'
134+
xml.artifactId '*'
135+
end
136+
end
137+
end
138+
end
139+
end
140+
end unless deps.empty?
141+
end
142+
end
143+
end
144+
end

tasks/gwt.rake

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#
2+
# Enhance the Buildr project to compile gwt sources.
3+
# For each of the discovered gwt modules, this task will create
4+
# a synthetic gwt module that includes a single entrypoint to
5+
# compile against. It will also create a gwt classifier jar
6+
# that includes all the sources.
7+
#
8+
def gwt_enhance(project, options = {})
9+
modules_complete = !!options[:modules_complete]
10+
package_jars = options[:package_jars].nil? ? true : !!options[:package_jars]
11+
12+
extra_deps = project.iml.main_generated_resource_directories.flatten.compact.collect do |a|
13+
a.is_a?(String) ? file(a) : a
14+
end + project.iml.main_generated_source_directories.flatten.compact.collect do |a|
15+
a.is_a?(String) ? file(a) : a
16+
end
17+
18+
if project.enable_annotation_processor?
19+
extra_deps += [project.file(project._(:generated, 'processors/main/java'))]
20+
end
21+
22+
dependencies = project.compile.dependencies + extra_deps + [Buildr.artifact(:gwt_user)]
23+
24+
gwt_modules = []
25+
source_paths = project.compile.sources + project.iml.main_generated_resource_directories.flatten.compact + project.iml.main_generated_source_directories.flatten.compact
26+
source_paths.each do |base_dir|
27+
Dir["#{base_dir}/**/*.gwt.xml"].each do |filename|
28+
gwt_modules << filename.gsub("#{base_dir}/", '').gsub('.gwt.xml', '').gsub('/', '.')
29+
end
30+
end
31+
32+
unless modules_complete
33+
base_synthetic_module_dir = project._(:generated, :synthetic_gwt_module, :main, :resources)
34+
t = project.task('gwt_synthetic_module') do
35+
gwt_modules.each do |gwt_module|
36+
file = "#{base_synthetic_module_dir}/#{gwt_module.gsub('.', '/')}Test.gwt.xml"
37+
mkdir_p File.dirname(file)
38+
IO.write(file, <<CONTENT)
39+
<module>
40+
<inherits name="#{gwt_module}"/>
41+
<inherits name="com.google.gwt.user.User"/>
42+
<collapse-all-properties/>
43+
</module>
44+
CONTENT
45+
end
46+
end
47+
dir = project.file(base_synthetic_module_dir => [t.name])
48+
dependencies += [dir]
49+
end
50+
51+
if ENV['GWT'].nil? || ENV['GWT'] == project.name
52+
modules = modules_complete ? gwt_modules : gwt_modules.collect {|gwt_module| "#{gwt_module}Test"}
53+
modules.each do |m|
54+
project.gwt([m], { :java_args => %w(-Xms512M -Xmx1024M),
55+
:dependencies => dependencies,
56+
:output_key => options[:output_key] || m })
57+
end
58+
end
59+
60+
project.package(:jar).tap do |j|
61+
extra_deps.each do |dep|
62+
j.enhance([dep])
63+
j.include("#{dep}/*")
64+
end
65+
j.include(project._(:generated, 'processors/main/java/react4j')) if project.enable_annotation_processor?
66+
project.assets.paths.each do |path|
67+
j.include("#{path}/*")
68+
end
69+
j.include("#{project._(:source, :main, :java)}/*")
70+
end if package_jars
71+
72+
config = {}
73+
gwt_modules.each do |gwt_module|
74+
config[gwt_module] = false
75+
end
76+
project.iml.add_gwt_facet(config, :settings => {
77+
:compilerMaxHeapSize => '1024',
78+
:compilerParameters => '-draftCompile -localWorkers 2 -strict'
79+
}, :gwt_dev_artifact => :gwt_dev)
80+
end

tasks/processor_path.rake

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
module Buildr
2+
module ProcessorPath
3+
module ProjectExtension
4+
include Extension
5+
6+
attr_writer :enable_annotation_processor
7+
8+
def enable_annotation_processor?
9+
@enable_annotation_processor.nil? ? !self.processorpath.empty? : !!@enable_annotation_processor
10+
end
11+
12+
def processorpath
13+
@processorpath ||= []
14+
end
15+
16+
before_define do |project|
17+
t = project.task('processors_setup') do
18+
mkdir_p project._(:generated, 'processors/main/java') if project.enable_annotation_processor?
19+
end
20+
project.compile.enhance([t.name])
21+
22+
if project.iml?
23+
project.iml.instance_variable_set('@main_generated_source_directories', [])
24+
project.iml.instance_variable_set('@processorpath', {})
25+
end
26+
end
27+
28+
after_define do |project|
29+
if project.enable_annotation_processor?
30+
project.file(project._(:generated, 'processors/main/java')).enhance([project.compile])
31+
32+
project.compile.options.merge!(:other => ['-s', project._(:generated, 'processors/main/java')])
33+
if project.iml? && project.enable_annotation_processor?
34+
project.iml.main_generated_source_directories << project._(:generated, 'processors/main/java')
35+
end
36+
project.clean do
37+
# Clean the IDE generated sources
38+
rm_rf project._(:generated, 'processors/main/java')
39+
end
40+
end
41+
42+
unless project.processorpath.empty?
43+
processor_deps = Buildr.artifacts(project.processorpath)
44+
project.compile.enhance(processor_deps)
45+
pp = processor_deps.collect {|d| d.to_s}.join(File::PATH_SEPARATOR)
46+
project.compile.options[:other] += ['-processorpath', pp]
47+
end
48+
49+
if project.ipr?
50+
project.ipr.add_component('CompilerConfiguration') do |component|
51+
component.annotationProcessing do |xml|
52+
xml.profile(:default => true, :name => 'Default', :enabled => true) do
53+
xml.sourceOutputDir :name => 'generated/processors/main/java'
54+
xml.sourceTestOutputDir :name => 'generated/processors/test/java'
55+
xml.outputRelativeToContentRoot :value => true
56+
xml.processorPath :useClasspath => true
57+
end
58+
enabled = Buildr.projects(:no_invoke => true).select {|p| p.iml? && p.enable_annotation_processor?}
59+
enabled.each do |prj|
60+
xml.profile(:name => "#{prj.name}", :enabled => true) do
61+
xml.sourceOutputDir :name => 'generated/processors/main/java'
62+
xml.sourceTestOutputDir :name => 'generated/processors/test/java'
63+
xml.outputRelativeToContentRoot :value => true
64+
xml.module :name => prj.iml.name
65+
if prj.processorpath.empty?
66+
xml.processorPath :useClasspath => true
67+
else
68+
xml.processorPath :useClasspath => false do
69+
Buildr.artifacts(prj.processorpath).each do |path|
70+
xml.entry :name => project.ipr.send(:resolve_path, path.to_s)
71+
end
72+
end
73+
end
74+
end
75+
end
76+
disabled = Buildr.projects(:no_invoke => true).select {|p| p.iml? && !p.enable_annotation_processor?}
77+
unless disabled.empty?
78+
xml.profile(:name => 'Disabled') do
79+
disabled.each do |p|
80+
xml.module :name => p.name
81+
end
82+
end
83+
end
84+
end
85+
end
86+
end
87+
end
88+
end
89+
end
90+
end
91+
92+
class Buildr::Project
93+
include Buildr::ProcessorPath::ProjectExtension
94+
end

tasks/publish.rake

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
require 'mcrt'
2+
3+
desc 'Publish release on maven central'
4+
task 'publish_to_maven_central' do
5+
project = Buildr.projects[0].root_project
6+
password = ENV['MAVEN_CENTRAL_PASSWORD'] || (raise "Unable to locate environment variable with name 'MAVEN_CENTRAL_PASSWORD'")
7+
MavenCentralPublishTool.buildr_release(project, 'org.realityforge', 'realityforge', password)
8+
end
9+
10+
def get_head_tag_if_any
11+
version = `git describe --exact-match --tags 2>&1`
12+
if 0 == $?.exitstatus && version =~ /^v[0-9]/ && (ENV['TRAVIS_BUILD_ID'].nil? || ENV['TRAVIS_TAG'].to_s != '')
13+
version.strip
14+
else
15+
nil
16+
end
17+
end
18+
19+
def is_tag_on_branch?(tag, branch)
20+
output = `git tag --merged #{branch} 2>&1`
21+
tags = output.split
22+
tags.include?(tag)
23+
end
24+
25+
def is_tag_on_candidate_branches?(tag, branches)
26+
sh 'git fetch origin'
27+
branches.each do |branch|
28+
if is_tag_on_branch?(tag, branch)
29+
puts "Tag #{tag} is on branch: #{branch}"
30+
return true
31+
elsif is_tag_on_branch?(tag, "origin/#{branch}")
32+
puts "Tag #{tag} is on branch: origin/#{branch}"
33+
return true
34+
else
35+
puts "Tag #{tag} is not on branches: #{branch} or origin/#{branch}"
36+
end
37+
end
38+
false
39+
end
40+
41+
desc 'Publish release to maven central iff current HEAD is a tag'
42+
task 'publish_if_tagged' do
43+
candidate_branches = %w(master)
44+
tag = get_head_tag_if_any
45+
if tag.nil?
46+
puts 'Current HEAD is not a tag. Skipping publish step.'
47+
else
48+
puts "Current HEAD is a tag: #{tag}"
49+
if is_tag_on_candidate_branches?(tag, candidate_branches)
50+
task('publish_to_maven_central').invoke
51+
end
52+
end
53+
end

0 commit comments

Comments
 (0)