BuildMaster 1.1.9 → 1.1.12
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/buildmaster/algorithms.rb +2 -2
- data/lib/buildmaster/auto.rb +27 -0
- data/lib/buildmaster/auto/classpath.rb +86 -0
- data/lib/buildmaster/auto/git.rb +38 -0
- data/lib/buildmaster/auto/java.rb +23 -0
- data/lib/buildmaster/auto/java_project.rb +185 -0
- data/lib/buildmaster/auto/javac_ant.rb +64 -0
- data/lib/buildmaster/auto/junit_ant.rb +226 -0
- data/lib/buildmaster/auto/mysql_server.rb +30 -0
- data/lib/buildmaster/auto/package_ant.rb +60 -0
- data/lib/buildmaster/auto/ruby_platform.rb +51 -0
- data/lib/buildmaster/common.rb +3 -3
- data/lib/buildmaster/cotta.rb +8 -3
- data/lib/buildmaster/cotta/command_runner.rb +19 -3
- data/lib/buildmaster/cotta/cotta.rb +42 -12
- data/lib/buildmaster/cotta/cotta_dir.rb +18 -14
- data/lib/buildmaster/cotta/cotta_file.rb +5 -8
- data/lib/buildmaster/cotta/in_memory_system.rb +15 -4
- data/lib/buildmaster/cotta/physical_system.rb +13 -7
- data/lib/buildmaster/project.rb +3 -9
- data/lib/buildmaster/project/ant_driver.rb +11 -7
- data/lib/buildmaster/project/ci.rb +2 -2
- data/lib/buildmaster/project/pscp_driver.rb +0 -4
- data/lib/buildmaster/project/ruby_forge_project.rb +0 -3
- data/lib/buildmaster/project/svn_admin_driver.rb +0 -4
- data/lib/buildmaster/project/svn_driver.rb +0 -6
- data/lib/buildmaster/project/svn_helper.rb +0 -6
- data/lib/buildmaster/project/svn_server_driver.rb +0 -5
- data/lib/buildmaster/project/windows/iis_driver.rb +0 -4
- data/lib/buildmaster/project/windows/sql_server_driver.rb +0 -1
- data/lib/buildmaster/site.rb +16 -4
- data/lib/buildmaster/site/about_handler.rb +0 -4
- data/lib/buildmaster/site/content_engine_repository.rb +0 -2
- data/lib/buildmaster/site/element_processor_by_name.rb +0 -4
- data/lib/buildmaster/site/file_processor.rb +0 -4
- data/lib/buildmaster/site/site.rb +0 -4
- data/lib/buildmaster/site/site_server.rb +1 -4
- data/lib/buildmaster/site/site_spec.rb +4 -15
- data/lib/buildmaster/site/source_file_handler.rb +0 -3
- data/lib/buildmaster/site/template_error.rb +0 -2
- data/lib/buildmaster/site/template_runner.rb +0 -4
- data/lib/buildmaster/site/templatelets.rb +9 -10
- data/lib/buildmaster/site/templatelets/href.rb +0 -5
- data/lib/buildmaster/site/templatelets/when.rb +0 -4
- data/lib/buildmaster/site/xtemplate.rb +0 -3
- data/lib/buildmaster/version +1 -1
- data/lib/buildmaster/win32/auto_it.rb +4 -0
- data/lib/buildmaster/win32/auto_it_driver.rb +45 -0
- data/lib/buildmaster/win32/auto_it_window.rb +82 -0
- data/lib/buildmaster/win32/autoit/AutoItX3.dll +0 -0
- data/lib/buildmaster/win32/autoit/README +1 -0
- data/lib/buildmaster/windows.rb +3 -3
- data/test/buildmaster/algorithms/tc_opn_compare.rb +2 -2
- data/test/buildmaster/auto/javac/src/org/rubyforge/buildmaster/javac/One.java +5 -0
- data/test/buildmaster/auto/javac/src/resource.txt +1 -0
- data/test/buildmaster/auto/javac/src2/org/rubyforge/buildmaster/javac/Two.java +9 -0
- data/test/buildmaster/auto/tc_classpath.rb +79 -0
- data/test/buildmaster/auto/tc_git.rb +32 -0
- data/test/buildmaster/auto/tc_java.rb +12 -0
- data/test/buildmaster/auto/tc_java_project.rb +78 -0
- data/test/buildmaster/auto/tc_java_project_slow.rb +89 -0
- data/test/buildmaster/auto/tc_javac_ant.rb +38 -0
- data/test/buildmaster/auto/tc_junit_ant.rb +187 -0
- data/test/buildmaster/auto/tc_package_ant.rb +29 -0
- data/test/buildmaster/auto/tc_ruby_platform.rb +10 -0
- data/test/buildmaster/common/tc_properties.rb +1 -3
- data/test/buildmaster/common/tc_tree_to_object.rb +1 -3
- data/test/buildmaster/cotta/cotta_dir_behaviors.rb +46 -8
- data/test/buildmaster/cotta/cotta_file_behaviors.rb +6 -6
- data/test/buildmaster/cotta/cotta_specifications.rb +1 -6
- data/test/buildmaster/cotta/file_system_behaviors.rb +1 -3
- data/test/buildmaster/cotta/physical_system_stub.rb +22 -3
- data/test/buildmaster/cotta/system_file_specifications.rb +1 -3
- data/test/buildmaster/cotta/tc_command_interface.rb +1 -3
- data/test/buildmaster/cotta/tc_command_runner.rb +1 -4
- data/test/buildmaster/cotta/tc_cotta.rb +5 -8
- data/test/buildmaster/cotta/tc_cotta_dir_in_memory.rb +6 -9
- data/test/buildmaster/cotta/tc_cotta_dir_physical.rb +3 -6
- data/test/buildmaster/cotta/tc_cotta_file_in_memory.rb +3 -7
- data/test/buildmaster/cotta/tc_cotta_file_physical.rb +4 -4
- data/test/buildmaster/cotta/tc_cotta_zip_support.rb +1 -5
- data/test/buildmaster/cotta/tc_in_memory_system.rb +3 -7
- data/test/buildmaster/cotta/tc_io_chain.rb +3 -8
- data/test/buildmaster/cotta/tc_pathname.rb +1 -3
- data/test/buildmaster/cotta/tc_physical_system.rb +7 -8
- data/test/buildmaster/project/tc_ant_driver.rb +1 -4
- data/test/buildmaster/project/tc_build_number_file.rb +1 -6
- data/test/buildmaster/project/tc_cvs_driver.rb +1 -5
- data/test/buildmaster/project/tc_java_manifest.rb +1 -5
- data/test/buildmaster/project/tc_release.rb +1 -3
- data/test/buildmaster/project/tc_server_manager.rb +1 -4
- data/test/buildmaster/project/tc_svn_driver.rb +1 -5
- data/test/buildmaster/project/tc_svn_status_info.rb +1 -3
- data/test/buildmaster/project/tc_version_number_file.rb +1 -6
- data/test/buildmaster/project/windows/tc_iis_driver.rb +2 -3
- data/test/buildmaster/project/windows/tc_sql_server_driver.rb +2 -5
- data/test/buildmaster/site/content/tc_content_engine_repository.rb +1 -5
- data/test/buildmaster/site/tc_element_processor_by_name.rb +1 -4
- data/test/buildmaster/site/tc_file_processor.rb +1 -7
- data/test/buildmaster/site/tc_site.rb +1 -6
- data/test/buildmaster/site/tc_site_server.rb +2 -8
- data/test/buildmaster/site/tc_site_spec.rb +8 -5
- data/test/buildmaster/site/tc_source_file_handler.rb +1 -4
- data/test/buildmaster/site/tc_template_builder.rb +1 -4
- data/test/buildmaster/site/tc_template_error.rb +1 -3
- data/test/buildmaster/site/tc_template_runner.rb +2 -7
- data/test/buildmaster/site/tc_templatelets.rb +2 -6
- data/test/buildmaster/site/tc_xtemplate.rb +1 -5
- data/test/buildmaster/site/templatelets/common_templatelet_test.rb +1 -8
- data/test/buildmaster/site/templatelets/tc_attribute.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_code.rb +2 -2
- data/test/buildmaster/site/templatelets/tc_each.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_href.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_include.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_link.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_text.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_when.rb +4 -4
- data/test/buildmaster/site/test.rb +1 -0
- data/test/buildmaster/test.rb +21 -0
- data/test/buildmaster/win32/tc_auto_it.rb +18 -0
- data/test/buildmaster/win32/tc_auto_it_window.rb +17 -0
- data/test/manual/bms.rb +2 -4
- data/test/tmp/svn_test/repository/conf/authz +14 -3
- data/test/tmp/svn_test/repository/conf/svnserve.conf +21 -4
- data/test/tmp/svn_test/repository/db/current +1 -1
- data/test/tmp/svn_test/repository/db/format +2 -1
- data/test/tmp/svn_test/repository/db/revprops/0/0 +5 -0
- data/test/tmp/svn_test/repository/db/revprops/{1 → 0/1} +1 -1
- data/test/tmp/svn_test/repository/db/revprops/{2 → 0/2} +1 -1
- data/test/tmp/svn_test/repository/db/revprops/{3 → 0/3} +1 -1
- data/test/tmp/svn_test/repository/db/revprops/{4 → 0/4} +1 -1
- data/test/tmp/svn_test/repository/db/revs/{0 → 0/0} +0 -0
- data/test/tmp/svn_test/repository/db/revs/0/1 +25 -0
- data/test/tmp/svn_test/repository/db/revs/{2 → 0/2} +9 -9
- data/test/tmp/svn_test/repository/db/revs/0/3 +33 -0
- data/test/tmp/svn_test/repository/db/revs/{4 → 0/4} +0 -0
- data/test/tmp/svn_test/repository/db/txn-current +1 -0
- data/{lib/buildmaster/project/java/class_path.rb → test/tmp/svn_test/repository/db/txn-current-lock} +0 -0
- data/test/tmp/svn_test/repository/db/uuid +1 -1
- data/test/tmp/svn_test/repository/hooks/post-revprop-change.tmpl +1 -1
- data/test/tmp/svn_test/repository/hooks/pre-unlock.tmpl +1 -0
- data/test/tmp/svn_test/repository/hooks/start-commit.tmpl +13 -2
- data/test/ts_buildmaster.rb +2 -2
- metadata +100 -46
- data/lib/buildmaster/project/java.rb +0 -4
- data/lib/buildmaster/project/java/javac.rb +0 -9
- data/test/tmp/svn_test/repository/db/revprops/0 +0 -5
- data/test/tmp/svn_test/repository/db/revs/1 +0 -25
- data/test/tmp/svn_test/repository/db/revs/3 +0 -33
@@ -1,3 +1,3 @@
|
|
1
|
-
|
1
|
+
dir = File.dirname(__FILE__)
|
2
2
|
|
3
|
-
require 'opn_compare'
|
3
|
+
require dir + '/algorithms/opn_compare'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require dir + '/cotta'
|
3
|
+
|
4
|
+
project = dir + '/project'
|
5
|
+
require project + '/build_number_file'
|
6
|
+
require project + '/java_manifest'
|
7
|
+
require project + '/ant_driver'
|
8
|
+
require project + '/cvs_driver'
|
9
|
+
require project + '/pscp_driver'
|
10
|
+
require project + '/svn_admin_driver'
|
11
|
+
require project + '/svn_driver'
|
12
|
+
require project + '/svn_status_info'
|
13
|
+
require project + '/server_manager'
|
14
|
+
require project + '/version_number_file'
|
15
|
+
require project + '/release'
|
16
|
+
require project + '/ci'
|
17
|
+
|
18
|
+
auto = dir + '/auto'
|
19
|
+
require auto + '/classpath'
|
20
|
+
require auto + '/git'
|
21
|
+
require auto + '/java'
|
22
|
+
require auto + '/javac_ant'
|
23
|
+
require auto + '/junit_ant'
|
24
|
+
require auto + '/package_ant'
|
25
|
+
require auto + '/java_project'
|
26
|
+
require auto + '/mysql_server'
|
27
|
+
require auto + '/ruby_platform'
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
class ClasspathEntry
|
3
|
+
attr_reader :path
|
4
|
+
|
5
|
+
def initialize(path)
|
6
|
+
@path = path
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_ant
|
10
|
+
" <pathelement location=\"#{@path}\"/>\n"
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
other.class == ClasspathEntry and other.path == path
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class ClasspathEntries
|
19
|
+
def initialize(dir)
|
20
|
+
@dir = dir
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_ant
|
24
|
+
return <<RESULT
|
25
|
+
<fileset dir="#{@dir}">
|
26
|
+
<include name="**/*.jar"/>
|
27
|
+
</fileset>
|
28
|
+
RESULT
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Classpath
|
33
|
+
|
34
|
+
def initialize(root = nil)
|
35
|
+
@entries = Array.new
|
36
|
+
@root = root
|
37
|
+
end
|
38
|
+
|
39
|
+
def include?(entry)
|
40
|
+
@entries.include?(convert(entry))
|
41
|
+
end
|
42
|
+
|
43
|
+
def insert(entry)
|
44
|
+
@entries.unshift(convert(entry))
|
45
|
+
end
|
46
|
+
|
47
|
+
def add(entry)
|
48
|
+
@entries.push(convert(entry))
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_all(dir)
|
52
|
+
@entries.push(ClasspathEntries.new(dir))
|
53
|
+
end
|
54
|
+
|
55
|
+
def empty?
|
56
|
+
@entries.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_ant(id=nil)
|
60
|
+
return '' if empty?
|
61
|
+
result = entries_to_ant
|
62
|
+
if (not id.nil?)
|
63
|
+
result = <<RESULT
|
64
|
+
<path id="#{id}">
|
65
|
+
#{result} </path>
|
66
|
+
RESULT
|
67
|
+
end
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def entries_to_ant
|
73
|
+
io = StringIO.new
|
74
|
+
@entries.each {|entry| io << "#{entry.to_ant}"}
|
75
|
+
io.string
|
76
|
+
end
|
77
|
+
|
78
|
+
def convert(entry)
|
79
|
+
if (entry.respond_to? :to_ant)
|
80
|
+
entry
|
81
|
+
else
|
82
|
+
ClasspathEntry.new(entry)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
class Git
|
3
|
+
attr_reader :work_dir
|
4
|
+
def initialize(work_dir)
|
5
|
+
@work_dir = work_dir
|
6
|
+
end
|
7
|
+
|
8
|
+
def status
|
9
|
+
command('status')
|
10
|
+
end
|
11
|
+
|
12
|
+
def pull
|
13
|
+
command('pull')
|
14
|
+
end
|
15
|
+
|
16
|
+
def add(entry=nil)
|
17
|
+
path = '.'
|
18
|
+
path = entry.to_s if entry
|
19
|
+
command("add #{path}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def commit(comment)
|
23
|
+
comment = comment.sub(/"/, '\""')
|
24
|
+
command("commit -m \"#{comment}\"")
|
25
|
+
end
|
26
|
+
|
27
|
+
def tag(name)
|
28
|
+
command("tag #{name}")
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def command(command)
|
33
|
+
@work_dir.chdir do
|
34
|
+
@work_dir.cotta.shell("git #{command}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
class Java
|
3
|
+
def initialize(java_home=nil)
|
4
|
+
@home = java_home
|
5
|
+
if @home.nil?
|
6
|
+
@cotta = Cotta.new
|
7
|
+
else
|
8
|
+
@cotta = @home.cotta
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def version
|
13
|
+
@cotta.shell("#{java_exe} -version")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def java_exe
|
18
|
+
exe = 'java'
|
19
|
+
exe = @home.file('bin/java') if @home
|
20
|
+
exe
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
# Java project that knows how to compile the production and test source
|
3
|
+
class JavaProject
|
4
|
+
attr_accessor :output, :name, :target_version
|
5
|
+
attr_reader :root, :prod, :test, :output
|
6
|
+
|
7
|
+
def initialize(root)
|
8
|
+
@root = root
|
9
|
+
@prod = ProjectInfo.new(self)
|
10
|
+
@prod.classpath = Classpath.new(root)
|
11
|
+
@test = ProjectInfo.new(self)
|
12
|
+
@test.classpath = Classpath.new(root)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def src=(dir)
|
19
|
+
prod.src = dir
|
20
|
+
end
|
21
|
+
|
22
|
+
def src
|
23
|
+
prod.src
|
24
|
+
end
|
25
|
+
|
26
|
+
def resource=(dir)
|
27
|
+
prod.resource = dir
|
28
|
+
end
|
29
|
+
|
30
|
+
def resource
|
31
|
+
prod.resource
|
32
|
+
end
|
33
|
+
|
34
|
+
def output=(dir)
|
35
|
+
@output = dir(dir)
|
36
|
+
@prod.output=@output.dir('prod')
|
37
|
+
@test.output=@output.dir('test')
|
38
|
+
end
|
39
|
+
|
40
|
+
# Specifies that the current project uses the entry
|
41
|
+
# The entry can be one of the three things:
|
42
|
+
# It can be another JavaProject, in which case it will be added as a classpath element.
|
43
|
+
# In this case, the project output and its classpath will be part of the current project
|
44
|
+
# classpath. It can also be a CottaDirectory or CottaFile, in which case it will be added
|
45
|
+
# to the classpath. It can also be a path string, in which case it will be converted to
|
46
|
+
# CottaFile or CottaDirectory based on whether or not the extname is empty
|
47
|
+
def uses(*entries)
|
48
|
+
add_entry(@prod, entries)
|
49
|
+
end
|
50
|
+
|
51
|
+
def uses_files_in(*dirs)
|
52
|
+
dirs.each {|dir| @prod.classpath.add_all(dir(dir))}
|
53
|
+
end
|
54
|
+
|
55
|
+
def tests_with(*entries)
|
56
|
+
add_entry(@test, entries)
|
57
|
+
end
|
58
|
+
|
59
|
+
def tests_with_files_in(*dirs)
|
60
|
+
dirs.each {|dir| @test.classpath.add_all(dir(dir))}
|
61
|
+
end
|
62
|
+
|
63
|
+
def classpath
|
64
|
+
@prod.classpath
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_project(project)
|
68
|
+
@prod.classpath.add project
|
69
|
+
end
|
70
|
+
|
71
|
+
def javac(buildfile = nil)
|
72
|
+
javac = JavacAnt.new(prod.output, buildfile)
|
73
|
+
javac.target_version = target_version
|
74
|
+
javac.src = prod.src
|
75
|
+
javac.classpath.add prod.classpath unless prod.classpath.empty?
|
76
|
+
javac.resource = prod.resource if prod.resource
|
77
|
+
result = nil
|
78
|
+
if (test.src.nil?)
|
79
|
+
result = [javac]
|
80
|
+
else
|
81
|
+
javac_test = JavacAnt.new(test.output, buildfile)
|
82
|
+
javac_test.target_version = target_version
|
83
|
+
javac_test.src = test.src
|
84
|
+
javac_test.resource = test.resource if test.resource
|
85
|
+
javac_test.classpath.add prod.output
|
86
|
+
javac_test.classpath.add prod.classpath unless prod.classpath.empty?
|
87
|
+
javac_test.classpath.add test.classpath unless test.classpath.empty?
|
88
|
+
result = [javac, javac_test]
|
89
|
+
end
|
90
|
+
result
|
91
|
+
end
|
92
|
+
|
93
|
+
def junit(report_dir)
|
94
|
+
junit = JUnitAnt.new(report_dir, self)
|
95
|
+
junit.classpath.add test.output
|
96
|
+
junit.classpath.add prod.output
|
97
|
+
junit.classpath.add test.classpath
|
98
|
+
junit.classpath.add prod.classpath
|
99
|
+
junit
|
100
|
+
end
|
101
|
+
|
102
|
+
def make(buildfile = nil)
|
103
|
+
javac(buildfile).each {|javac| javac.compile}
|
104
|
+
end
|
105
|
+
|
106
|
+
def package(dir, name)
|
107
|
+
ant = PackageAnt.new(dir, name)
|
108
|
+
ant.add(prod.output, prod.src)
|
109
|
+
yield ant if block_given?
|
110
|
+
ant.run
|
111
|
+
end
|
112
|
+
|
113
|
+
def jar(file)
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
def clean
|
118
|
+
output.delete
|
119
|
+
end
|
120
|
+
|
121
|
+
def rebuild
|
122
|
+
clean
|
123
|
+
make
|
124
|
+
end
|
125
|
+
|
126
|
+
# create XML classpath element for ANT build file
|
127
|
+
def to_ant
|
128
|
+
io = StringIO.new
|
129
|
+
io << ClasspathEntry.new(prod.output).to_ant
|
130
|
+
io << classpath.to_ant
|
131
|
+
io.string
|
132
|
+
end
|
133
|
+
|
134
|
+
def dir(path)
|
135
|
+
if (path.class == String)
|
136
|
+
@root.dir(path)
|
137
|
+
else
|
138
|
+
path
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def file(path)
|
143
|
+
if (path.class == String)
|
144
|
+
@root.file(path)
|
145
|
+
else
|
146
|
+
path
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
def guess_entry(entry)
|
152
|
+
path = Pathname.new(entry)
|
153
|
+
if (path.extname.empty?)
|
154
|
+
dir(entry)
|
155
|
+
else
|
156
|
+
file(entry)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def add_entry(target, entries)
|
161
|
+
entries.each do |entry|
|
162
|
+
if (entry.class == String)
|
163
|
+
entry = guess_entry(entry)
|
164
|
+
end
|
165
|
+
target.classpath.add(entry)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class ProjectInfo
|
171
|
+
attr_accessor :src, :classpath, :output, :resource
|
172
|
+
|
173
|
+
def initialize(project)
|
174
|
+
@project = project
|
175
|
+
end
|
176
|
+
|
177
|
+
def src=(source)
|
178
|
+
@src = @project.dir(source)
|
179
|
+
end
|
180
|
+
|
181
|
+
def resource=(resource)
|
182
|
+
@resource = @project.dir(resource)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
# Javac Ant driver.
|
3
|
+
# This class utilize ANT to perform the javac tasks
|
4
|
+
class JavacAnt
|
5
|
+
attr_reader :output_dir, :classpath
|
6
|
+
attr_accessor :src, :resource, :target_version
|
7
|
+
|
8
|
+
def initialize(output_dir, buildfile = nil)
|
9
|
+
@output_dir = output_dir
|
10
|
+
@classpath = Classpath.new
|
11
|
+
if (buildfile.nil?)
|
12
|
+
@buildfile = 'buildmaster.xml'
|
13
|
+
else
|
14
|
+
@buildfile = buildfile
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def compile()
|
19
|
+
output_dir.mkdirs
|
20
|
+
ant_file = output_dir.parent.file(@buildfile)
|
21
|
+
classpath_ref = 'javac'
|
22
|
+
ant_file.save <<ANT
|
23
|
+
<!-- ANT file generated by BuildMaster -->
|
24
|
+
<project name="buildmaster">
|
25
|
+
#{@classpath.to_ant(classpath_ref)}
|
26
|
+
<target name="javac">
|
27
|
+
<javac srcdir="#{src}" destdir="#{output_dir}" debug="on"#{target_attribute}>
|
28
|
+
#{to_ant_ref(classpath_ref)}
|
29
|
+
</javac>
|
30
|
+
<copy todir="#{output_dir}">
|
31
|
+
#{resource_file_set}
|
32
|
+
</copy>
|
33
|
+
</target>
|
34
|
+
</project>
|
35
|
+
ANT
|
36
|
+
AntDriver.from_file(ant_file).target("javac")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def to_ant_ref(refid)
|
41
|
+
if (@classpath.empty?)
|
42
|
+
''
|
43
|
+
else
|
44
|
+
"<classpath refid=\"#{refid}\"/>"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def resource_file_set
|
49
|
+
if (resource.nil?)
|
50
|
+
"<fileset dir=\"#{src}\" excludes=\"**/*.java\"/>"
|
51
|
+
else
|
52
|
+
"<fileset dir=\"#{resource}\"/>"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def target_attribute
|
57
|
+
if target_version.nil?
|
58
|
+
''
|
59
|
+
else
|
60
|
+
" target=\"#{@target_version}\""
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
module BuildMaster
|
2
|
+
# JUnit ANT invocation
|
3
|
+
class JUnitAnt
|
4
|
+
attr_reader :report, :test, :classpath, :jvmargs, :project
|
5
|
+
|
6
|
+
def initialize(report, project = nil)
|
7
|
+
@report = report
|
8
|
+
@classpath = Classpath.new
|
9
|
+
@jvmargs = Array.new
|
10
|
+
@coverage = NilCoverage.new
|
11
|
+
@project = project
|
12
|
+
end
|
13
|
+
|
14
|
+
def target_name
|
15
|
+
'junit-ant'
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_report
|
19
|
+
report.dir('test')
|
20
|
+
end
|
21
|
+
|
22
|
+
def coverage_report
|
23
|
+
report.dir('coverage')
|
24
|
+
end
|
25
|
+
|
26
|
+
def for_test(name)
|
27
|
+
@test = JUnitAntTest.new(self, name)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def for_tests(pattern)
|
32
|
+
@test = JUnitAntBatchTest.new(self, pattern)
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def with_coverage(jar)
|
37
|
+
if (jar.basename.include?('cobertura'))
|
38
|
+
@coverage = CobertunaCoverage.new(jar, project)
|
39
|
+
else
|
40
|
+
raise "do not know how to set up coverage tasks for #{jar}"
|
41
|
+
end
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def generate(buildfile = nil)
|
46
|
+
if (test.nil?)
|
47
|
+
raise 'test is not specified for junit task'
|
48
|
+
end
|
49
|
+
buildfile = report.file('junit-ant.xml') unless buildfile
|
50
|
+
classpath_id = 'refid'
|
51
|
+
@coverage.modify_classpath(classpath)
|
52
|
+
buildfile.write do |file|
|
53
|
+
file.puts <<BUILD
|
54
|
+
<!-- ANT file generated by buildmaste JUnitAnt -->
|
55
|
+
<project name="junit-ant" default="junit-ant">
|
56
|
+
#{@coverage.task_def}
|
57
|
+
#{classpath.to_ant(classpath_id)}
|
58
|
+
<target name="#{target_name}">
|
59
|
+
#{@coverage.instrument_task}
|
60
|
+
<junit printsummary="yes" fork="yes" forkmode="perBatch" errorproperty="error" failureproperty="failure" haltonerror="no" haltonfailure="no">
|
61
|
+
<formatter type="xml"/>
|
62
|
+
#{@coverage.sysproperty}#{classpath_ref(classpath_id)}#{jvmarg_elements}#{test.to_ant} </junit>
|
63
|
+
<junitreport todir="#{test_report}">
|
64
|
+
<fileset dir="#{test_report}">
|
65
|
+
<include name="TEST-*.xml"/>
|
66
|
+
</fileset>
|
67
|
+
<report todir="#{test_report}" format="frames"/>
|
68
|
+
</junitreport>
|
69
|
+
#{@coverage.report_task(coverage_report)}
|
70
|
+
<fail message="test failed">
|
71
|
+
<condition>
|
72
|
+
<or>
|
73
|
+
<isset property="fail"/>
|
74
|
+
<isset property="error"/>
|
75
|
+
</or>
|
76
|
+
</condition>
|
77
|
+
</fail>
|
78
|
+
</target>
|
79
|
+
</project>
|
80
|
+
BUILD
|
81
|
+
end
|
82
|
+
buildfile
|
83
|
+
end
|
84
|
+
|
85
|
+
def run(buildfile = nil)
|
86
|
+
buildfile = generate(buildfile)
|
87
|
+
@coverage.clean_instrumented_files
|
88
|
+
test_report.mkdirs
|
89
|
+
coverage_report.mkdirs
|
90
|
+
AntDriver.new(buildfile).target(target_name)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def classpath_ref(classpath_id)
|
96
|
+
if (classpath.empty?)
|
97
|
+
''
|
98
|
+
else
|
99
|
+
" <classpath refid=\"#{classpath_id}\"/>\n"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def jvmarg_elements
|
104
|
+
if @jvmargs.empty?
|
105
|
+
''
|
106
|
+
else
|
107
|
+
buffer = StringIO.new
|
108
|
+
@jvmargs.each {|jvm| buffer << " <jvmarg line=\"#{jvm}\"/>\n"}
|
109
|
+
buffer.string
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class JUnitAntTest
|
115
|
+
attr_reader :name
|
116
|
+
|
117
|
+
def initialize(junit, name)
|
118
|
+
@name = name
|
119
|
+
@junit = junit
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_ant
|
123
|
+
return <<RESULT
|
124
|
+
<test name="#{name}" todir="#{@junit.test_report}"/>
|
125
|
+
RESULT
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class JUnitAntBatchTest
|
130
|
+
def initialize(junit, pattern)
|
131
|
+
@junit = junit
|
132
|
+
@pattern = pattern
|
133
|
+
end
|
134
|
+
|
135
|
+
def to_ant
|
136
|
+
return <<RESULT
|
137
|
+
<batchtest fork="yes" todir="#{@junit.test_report}">
|
138
|
+
<fileset dir="#{@junit.project.test.src}">
|
139
|
+
<include name="**/#{@pattern}"/>
|
140
|
+
</fileset>
|
141
|
+
</batchtest>
|
142
|
+
RESULT
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class NilCoverage
|
147
|
+
def task_def
|
148
|
+
''
|
149
|
+
end
|
150
|
+
|
151
|
+
def modify_classpath(classpath)
|
152
|
+
end
|
153
|
+
|
154
|
+
def instrument_task
|
155
|
+
''
|
156
|
+
end
|
157
|
+
|
158
|
+
def sysproperty
|
159
|
+
''
|
160
|
+
end
|
161
|
+
|
162
|
+
def report_task(report_dir)
|
163
|
+
''
|
164
|
+
end
|
165
|
+
|
166
|
+
def clean_instrumented_files
|
167
|
+
''
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
class CobertunaCoverage
|
172
|
+
def initialize(jar, project)
|
173
|
+
@jar = jar
|
174
|
+
@project = project
|
175
|
+
@instrumented_dir = @project.output.dir('instrumented')
|
176
|
+
@datafile = @project.output.file('cobertuna.ser')
|
177
|
+
end
|
178
|
+
|
179
|
+
def task_def
|
180
|
+
return <<TASK_DEF
|
181
|
+
<path id="coverage">
|
182
|
+
<pathelement location="#{@jar}"/>
|
183
|
+
<fileset dir="#{@jar.parent.dir('lib')}">
|
184
|
+
<include name="**/*.jar"/>
|
185
|
+
</fileset>
|
186
|
+
</path>
|
187
|
+
<taskdef classpathref="coverage" resource="tasks.properties"/>
|
188
|
+
TASK_DEF
|
189
|
+
end
|
190
|
+
|
191
|
+
def modify_classpath(classpath)
|
192
|
+
classpath.insert @jar
|
193
|
+
classpath.insert @instrumented_dir
|
194
|
+
end
|
195
|
+
|
196
|
+
def instrument_task
|
197
|
+
return <<RESULT
|
198
|
+
<cobertura-instrument todir="#{@instrumented_dir}" datafile="#{@datafile}">
|
199
|
+
<fileset dir="#{@project.prod.output}">
|
200
|
+
<include name="**/*.class"/>
|
201
|
+
</fileset>
|
202
|
+
</cobertura-instrument>
|
203
|
+
<copy todir="#{@instrumented_dir}">
|
204
|
+
<fileset dir="#{@project.prod.output}" excludes="**/*.class"/>
|
205
|
+
</copy>
|
206
|
+
RESULT
|
207
|
+
end
|
208
|
+
|
209
|
+
def sysproperty
|
210
|
+
return <<SYSPROPERTY
|
211
|
+
<sysproperty key="net.sourceforge.cobertura.datafile" file="#{@datafile}" />
|
212
|
+
SYSPROPERTY
|
213
|
+
end
|
214
|
+
|
215
|
+
def report_task(report_dir)
|
216
|
+
return <<REPORT
|
217
|
+
<cobertura-report srcdir="#{@project.src}" destdir="#{report_dir}" datafile="#{@datafile}"/>
|
218
|
+
REPORT
|
219
|
+
end
|
220
|
+
|
221
|
+
def clean_instrumented_files
|
222
|
+
@instrumented_dir.delete
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|