buildr 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,7 @@
1
+ require "net/http"
1
2
  require "net/ssh"
2
3
  require "net/sftp"
4
+ require "uri"
3
5
  require "uri/sftp"
4
6
  require "digest/md5"
5
7
  require "digest/sha1"
@@ -100,7 +100,7 @@ module Buildr
100
100
  puts "All source files are up to date" if Rake.application.options.trace && !sources.empty?
101
101
  elsif target
102
102
  mkpath target, :verbose=>false
103
- Java.javac files, :sourcepath=>sourcepath, :classpath=>classpath,
103
+ Java.javac files, :sourcepath=>sourcepath, :classpath=>real_classpath,
104
104
  :output=>target, :javac_args=>options.javac_args, :name=>task.name
105
105
  # By touching the target we let other tasks know we did something,
106
106
  # and also prevent recompiling again for classpath dependencies.
@@ -176,6 +176,10 @@ module Buildr
176
176
  @files && !@files.empty?
177
177
  end
178
178
 
179
+ def timestamp()
180
+ File.exist?(target) ? File.stat(target).mtime : Rake::EARLY
181
+ end
182
+
179
183
  protected
180
184
 
181
185
  # Returns the real classpath. Uses the values of #classpath, but resolves
@@ -295,20 +299,21 @@ module Buildr
295
299
  end
296
300
 
297
301
 
298
- Project.on_create do |project|
302
+ Project.on_define do |project|
299
303
  # Prepare is prerequisite for compile, resources follows compile.
300
304
  project.compile.enhance([project.prepare]) { |task| project.resources.invoke }
301
305
  project.recursive_task("compile")
302
306
  task("build").enhance [ project.compile ]
303
307
  task("clean") { rm_rf project.path_to(:target_dir), :verbose=>false }
304
308
 
305
- project.enhance do |project|
309
+ project.after_block do |project|
306
310
  # Automagic compilation only if the source directory exists.
307
311
  project.compile.sources << project.path_to(:java_src_dir) if File.exist?(project.path_to(:java_src_dir))
308
312
  project.compile.target ||= project.path_to(:java_target_dir)
309
313
  project.resources.include project.path_to(:resources_dir, "*") if File.exist?(project.path_to(:resources_dir))
310
314
  project.resources.target ||= project.compile.target
311
- file(project.compile.target).enhance([ project.compile, project.resources ])
315
+ file(project.compile.target).enhance [ project.compile ]
316
+ file(project.resources.target).enhance [ project.resources ]
312
317
  end
313
318
 
314
319
  end
@@ -11,12 +11,12 @@ module Buildr
11
11
  name = options[:name] || "java #{args.first}"
12
12
  cmd_args = []
13
13
  classpath = classpath_from(options)
14
- cmd_args << "-cp" << classpath unless classpath.empty?
14
+ cmd_args << "-cp" << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
15
15
  cmd_args += options[:java_args].flatten if options[:java_args]
16
16
  cmd_args += args.flatten.compact
17
17
  cmd_args << { :verbose=>options[:verbose] }
18
18
  unless options[:noop]
19
- verbose { puts "Running #{name}" }
19
+ puts "Running #{name}" if verbose
20
20
  sh(path_to_bin("java"), *cmd_args) { |ok, res| fail "Failed to execute #{name}, see errors above" unless ok }
21
21
  end
22
22
  end
@@ -24,7 +24,7 @@ module Buildr
24
24
  def self.apt(*args)
25
25
  options = Hash === args.last ? args.pop : {}
26
26
  options[:verbose] ||= Rake.application.options.trace || false
27
- fu_check_options options, :verbose, :noop, :compile, :source, :output, :cp, :classpath, :sourcepath
27
+ fu_check_options options, :verbose, :noop, :compile, :source, :output, :cp, :classpath
28
28
 
29
29
  files = args.collect { |arg| File.directory?(arg) ? FileList[File.join(arg, "**", "*.java")] : arg }.flatten
30
30
  args = [ options[:verbose] ? "-verbose" : "-nowarn" ]
@@ -35,13 +35,11 @@ module Buildr
35
35
  end
36
36
  args << "-source" << options[:source] if options[:source]
37
37
  classpath = classpath_from(options)
38
- args << "-cp" << classpath unless classpath.empty?
39
- sourcepath = (options[:sourcepath] || []).collect.join(File::PATH_SEPARATOR)
40
- args << "-sourcepath" << sourcepath unless sourcepath.empty?
38
+ args << "-cp" << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
41
39
  args += files
42
40
  args << { :verbose=>options[:verbose] }
43
41
  unless options[:noop]
44
- verbose { puts "Running apt" }
42
+ puts "Running apt" if verbose
45
43
  sh(path_to_bin("apt"), *args) { |ok, res| fail "Failed to execute apt, see errors above" unless ok }
46
44
  end
47
45
  end
@@ -84,14 +82,14 @@ module Buildr
84
82
  cmd_args = []
85
83
  classpath = classpath_from(options)
86
84
  #classpath += options[:output] if options[:output]
87
- cmd_args << "-cp" << classpath unless classpath.empty?
85
+ cmd_args << "-cp" << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
88
86
  cmd_args << "-sourcepath" << options[:sourcepath].join(File::PATH_SEPARATOR) if options[:sourcepath]
89
87
  cmd_args << "-d" << options[:output] if options[:output]
90
88
  cmd_args += options[:javac_args].flatten if options[:javac_args]
91
89
  cmd_args += files
92
90
  cmd_args << { :verbose=>options[:verbose] }
93
91
  unless options[:noop] || files.empty?
94
- verbose { puts "Compiling #{files.size} source files in #{name}" }
92
+ puts "Compiling #{files.size} source files in #{name}" if verbose
95
93
  sh(path_to_bin("javac"), *cmd_args) { |ok, res| fail "Failed to compile, see errors above" unless ok }
96
94
  end
97
95
  end
@@ -104,8 +102,7 @@ module Buildr
104
102
 
105
103
  def self.classpath_from(options)
106
104
  classpath = (options[:classpath] || []).collect | (options[:cp] || []).collect
107
- artifacts(classpath).each { |t| t.invoke if t.respond_to?(:invoke) }.
108
- map(&:to_s).join(File::PATH_SEPARATOR)
105
+ artifacts(classpath).each { |t| t.invoke if t.respond_to?(:invoke) }.map(&:to_s)
109
106
  end
110
107
 
111
108
  end
@@ -21,7 +21,8 @@ module Buildr
21
21
  fu_check_options options, *OPTIONS + [:output]
22
22
 
23
23
  runtool options.merge(:class=>"org.apache.openjpa.enhance.PCEnhancer", :name=>"Enhancer",
24
- :args=>{ "-p"=>options[:properties], "-d"=>options[:output] })
24
+ :args=>{ "-p"=>options[:properties], "-d"=>options[:output] },
25
+ :classpath=>options[:classpath] + [options[:output]])
25
26
  end
26
27
 
27
28
  def self.mapping_tool(options)
@@ -80,17 +80,6 @@ module Buildr
80
80
  end
81
81
 
82
82
 
83
- # Global task packages all projects.
84
- desc "Package all projects"
85
- LocalDirectoryTask.define_task "package"
86
- desc "Install packages created by this project"
87
- LocalDirectoryTask.define_task "install"
88
- desc "Uninstall packages created by this project"
89
- LocalDirectoryTask.define_task "uninstall"
90
- desc "Deploy packages created by this project"
91
- LocalDirectoryTask.define_task "deploy"
92
-
93
-
94
83
  class Project
95
84
 
96
85
  # Group used for packaging. Inherited from parent project.
@@ -98,6 +87,12 @@ module Buildr
98
87
  # Version used for packaging. Inherited from parent project.
99
88
  inherited_attr :version
100
89
 
90
+ # The project ID is the project name, and for a sub-project the
91
+ # parent project ID followed by the project name, separated with a
92
+ # hyphen. For example, "foo" and "foo-bar".
93
+ def id()
94
+ name.gsub(":", "-")
95
+ end
101
96
  inherited_attr :webapp_src_dir do File.join(src_dir, "main", "webapp") end
102
97
 
103
98
  def package(*args)
@@ -106,7 +101,7 @@ module Buildr
106
101
  else
107
102
  options = {}
108
103
  end
109
- options[:type] = args.shift if Symbol === args.first
104
+ options[:type] = args.shift.to_s if Symbol === args.first
110
105
  fail "No packaging type specified" unless options[:type]
111
106
  options[:group] ||= self.group
112
107
  options[:version] ||= self.version
@@ -133,15 +128,15 @@ module Buildr
133
128
 
134
129
  task "uninstall" do |task|
135
130
  verbose(Rake.application.options.trace) do
136
- rm repositories.locate(package)
137
- rm repositories.locate(package.pom)
131
+ [ package, package.pom ].map { |artifact| repositories.locate(artifact) }.
132
+ each { |file| rm file if File.exist?(file) }
138
133
  end
139
134
  end
140
135
 
141
136
  task("deploy") { deploy(package, package.pom) }
142
137
 
143
138
  packages << package
144
- Artifact.register package
139
+ Artifact.register package, package.pom
145
140
  package
146
141
  end
147
142
 
@@ -202,16 +197,4 @@ module Buildr
202
197
  end
203
198
 
204
199
 
205
- Project.on_create do |project|
206
- # Recursive tasks must be defined in before_create.
207
- desc "Create packages in this project"
208
- project.recursive_task "package"=>"build"
209
- desc "Install packages created by this project"
210
- project.recursive_task "install"=>"package"
211
- desc "Uninstall packages created by this project"
212
- project.recursive_task "uninstall"
213
- desc "Deploy packages created by this project"
214
- project.recursive_task "deploy"=>"package"
215
- end
216
-
217
200
  end
@@ -0,0 +1,105 @@
1
+ module Buildr
2
+
3
+ class JUnitTask < Rake::Task
4
+
5
+ attr_accessor :base_dir
6
+ attr_accessor :target
7
+ attr_accessor :classpath
8
+
9
+ def initialize(*args)
10
+ super
11
+ @classpath = []
12
+ enhance do |task|
13
+ test_cases.each do |test|
14
+ Dir.chdir base_dir
15
+ java "junit.textui.TestRunner", test, :classpath=>real_classpath, :name=>"tests in #{test}"
16
+ end
17
+ end
18
+ end
19
+
20
+ def test_cases()
21
+ target = File.expand_path(self.target)
22
+ return [] unless File.exist?(target)
23
+ prefix = Regexp.new("^" + Regexp.escape(target) + "/")
24
+ FileList[File.join(target, "**", "*Test.class")].
25
+ map { |path| path.sub(prefix, "").ext("").gsub(File::SEPARATOR, ".") }.sort
26
+ end
27
+
28
+ def real_classpath()
29
+ @real_classpath ||= artifacts(@classpath).map(&:to_s)
30
+ end
31
+
32
+ end
33
+
34
+ class Tests
35
+ def prepare(*tasks, &block)
36
+ returning(@prepare_task ||= task("prepare")) { |task| task.enhance tasks, &block }
37
+ end
38
+
39
+ def compile(*sources, &block)
40
+ unless @compile_task
41
+ @compile_task = Java::CompileTask.define_task("compile"=>prepare) { |task| resources.invoke }
42
+ end
43
+ returning(@compile_task) { |task| task.sources |= sources ; task.enhance &block }
44
+ end
45
+
46
+ def resources(*tasks, &block)
47
+ returning(@resources_task ||= Filter.define_task("resources")) { |task| task.enhance tasks, &block }
48
+ end
49
+
50
+ def junit(*tasks, &block)
51
+ unless @junit_task
52
+ @junit_task = JUnitTask.define_task("junit"=>compile)
53
+ end
54
+ returning(@junit_task) { |task| task.enhance tasks, &block }
55
+ end
56
+ end
57
+
58
+ class Project
59
+ inherited_attr :test_src_dir do File.join(src_dir, "test", "java") end
60
+ inherited_attr :test_resources_dir do File.join(src_dir, "test", "resources") end
61
+ inherited_attr :test_target_dir do File.join(target_dir, "test-classes") end
62
+
63
+ def tests()
64
+ @tests ||= Tests.new
65
+ end
66
+
67
+ def test(*tasks, &block)
68
+ @tests.junit *tasks, &block
69
+ end
70
+ end
71
+
72
+ # Global task compiles all projects.
73
+ desc "Run all test cases"
74
+ LocalDirectoryTask.define_task "test"
75
+
76
+ Project.on_define do |project|
77
+ tests = nil
78
+ namespace "test" do
79
+ tests = project.tests
80
+ #tests.compile.enhance([tests.prepare]) { |task| tests.resources.invoke }
81
+ tests.compile.classpath += [ "junit:junit:jar:3.8.1", "jmock:jmock:jar:1.1.0" ]
82
+ tests.junit
83
+ end
84
+ tests.compile.enhance [ project.compile ]
85
+ project.recursive_task("test"=>project.test)
86
+
87
+ #project.recursive_task("compile")
88
+ #task("build").enhance [ project.compile ]
89
+ #task("clean") { rm_rf project.path_to(:target_dir), :verbose=>false }
90
+
91
+ project.after_block do |project|
92
+ tests.compile.sources << project.path_to(:test_src_dir) if File.exist?(project.path_to(:test_src_dir))
93
+ tests.compile.target ||= project.path_to(:test_target_dir)
94
+ tests.compile.classpath << project.compile.target
95
+ tests.resources.include project.path_to(:test_resources_dir, "*") if File.exists?(project.path_to(:test_resources_dir))
96
+ tests.resources.target ||= tests.compile.target
97
+ tests.junit.target = tests.compile.target
98
+ tests.junit.classpath += tests.compile.classpath
99
+ tests.junit.classpath += [ tests.compile.target, project.compile.target ]
100
+ tests.junit.base_dir = project.base_dir
101
+ file(tests.compile.target).enhance [ tests.compile ]
102
+ file(tests.resources.target).enhance [ tests.resources ]
103
+ end
104
+ end
105
+ end
@@ -9,11 +9,136 @@ module Buildr
9
9
  # directories.
10
10
  class ZipTask < Rake::FileTask
11
11
 
12
+ # :nodoc:
13
+ module IncludeFiles
14
+
15
+ # Include the specified files or directories.
16
+ def include(*files)
17
+ if Hash === files.last
18
+ options = files.pop
19
+ else
20
+ options = {}
21
+ end
22
+
23
+ if options[:path]
24
+ path(options[:path]).include *files +[ options.reject { |k,v| k == :path } ]
25
+ elsif options[:as]
26
+ raise "You can only use the :as option in combination with the :path option" unless options.keys.size == 1
27
+ raise "You can only use one file with the :as option" unless files.size == 1
28
+ include_as(files.first, options[:as])
29
+ elsif options[:merge]
30
+ raise "You can only use the :merge option in combination with the :path option" unless options.keys.size == 1
31
+ files.each { |file| merge file }
32
+ elsif options.keys.empty?
33
+ (@files ||= FileList[]).include *files
34
+ else
35
+ raise "Unrecognized option #{options.keys.join(", ")}"
36
+ end
37
+ self
38
+ end
39
+
40
+ # Exclude the specified file or directories.
41
+ def exclude(*files)
42
+ (@files ||= FileList[]).exclude *files
43
+ self
44
+ end
45
+ alias :add :include
46
+
47
+ def merge(*files)
48
+ if Hash === files.last
49
+ options = files.pop
50
+ else
51
+ options = {}
52
+ end
53
+
54
+ if options[:path]
55
+ path(options[:path]).merge *files +[ options.reject { |k,v| k == :path } ]
56
+ elsif options.keys.empty?
57
+ files.collect do |file|
58
+ @expand_sources << proc { artifacts(file).map(&:to_s) }
59
+ expander = ZipExpander.new(file)
60
+ @add_files << proc { |zip| expander.expand(zip, @path) }
61
+ expander
62
+ end.first
63
+ else
64
+ raise "Unrecognized option #{options.keys.join(", ")}"
65
+ end
66
+ end
67
+
68
+ protected
69
+
70
+ def setup_path(path = nil)
71
+ @path = "#{path}/" if path
72
+ expand_src = proc { artifacts(*@files || []).map(&:to_s) }
73
+ @expand_sources = [ expand_src ]
74
+ @add_files = [] << proc do |zip|
75
+ expand_src.call.each do |file|
76
+ if File.directory?(file)
77
+ in_directory(file, @files) do |file, rel_path|
78
+ puts "Adding #{@path}#{rel_path}" if Rake.application.options.trace
79
+ zip.add "#{@path}#{rel_path}", file
80
+ end
81
+ else
82
+ puts "Adding #{@path}#{File.basename(file)}" if Rake.application.options.trace
83
+ zip.add "#{@path}#{File.basename(file)}", file
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def include_as(source, as)
90
+ @expand_sources << proc { artifacts(source).map(&:to_s) }
91
+ @add_files << proc do |zip|
92
+ file = artifacts(source).first.to_s
93
+ if File.directory?(file)
94
+ in_directory(file) do |file, rel_path|
95
+ puts "Adding #{@path}#{as}/#{rel_path}" if Rake.application.options.trace
96
+ zip.add file, "#{@path}#{as}/#{rel_path}"
97
+ end
98
+ else
99
+ puts "Adding #{@path}#{as}" if Rake.application.options.trace
100
+ zip.add "#{@path}#{as}", file
101
+ end
102
+ end
103
+ end
104
+
105
+ def in_directory(dir, excludes = nil)
106
+ prefix = Regexp.new("^" + Regexp.escape(File.dirname(dir) + File::SEPARATOR))
107
+ Dir[File.join(dir, "**", "*")].
108
+ reject { |file| File.directory?(file) || (excludes && excludes.exclude?(file)) }.
109
+ each { |file| yield file, file.sub(prefix, "") }
110
+ end
111
+
112
+ def expand_sources()
113
+ @expand_sources.map(&:call).flatten
114
+ end
115
+
116
+ def add_file(zip)
117
+ @add_files.each { |action| action.call zip }
118
+ end
119
+
120
+ end
121
+
122
+
123
+ # Which files go where.
124
+ class Path
125
+
126
+ include IncludeFiles
127
+
128
+ def initialize(path)
129
+ setup_path path
130
+ end
131
+
132
+ end
133
+
134
+ include IncludeFiles
135
+
12
136
  def initialize(*args)
13
137
  super
14
- @paths = {}
138
+ @paths = { nil=>self }
139
+ setup_path
15
140
  enhance do |task|
16
- verbose { puts "Creating #{task.name}" }
141
+ puts "Creating #{task.name}" if verbose
17
142
  # We're here because the Zip file does not exist, or one of the files is
18
143
  # newer than the Zip contents; in the later case, opening the Zip file
19
144
  # will add to its contents instead of replacing it, so we want the Zip
@@ -29,38 +154,50 @@ module Buildr
29
154
  end
30
155
  end
31
156
 
32
- # Include the specified files and directories. Returns self.
33
- #
34
- # You can specify a path for inclusion by passing :path=> as the
35
- # last argument. For example:
36
- # task.include "src" # Include the src directory
37
- # task.include foobar, :path=>"libs" # Include under /libs/
38
- def include(*files)
39
- if Hash === files.last
40
- path = files.pop[:path]
157
+
158
+ class ZipExpander
159
+
160
+ def initialize(zip_file)
161
+ @zip_file = zip_file
41
162
  end
42
- (@paths[path] ||= FileList[]).include *files
43
- self
44
- end
45
- alias :add :include
46
163
 
47
- # Excludes the specified files and directories. Returns self. Use this
48
- # in combination with include; make sure to use the same path.
49
- def exclude(*files)
50
- if Hash === files.last
51
- path = files.pop[:path]
164
+ def include(*files)
165
+ (@includes ||= [])
166
+ @includes |= files
167
+ self
52
168
  end
53
- (@paths[path] ||= FileList[]).exclude *files
54
- self
169
+
170
+ def exclude(*files)
171
+ (@excludes ||= [])
172
+ @excludes |= files
173
+ self
174
+ end
175
+
176
+ def expand(zip, path)
177
+ @includes ||= ["*"]
178
+ @excludes ||= []
179
+ Zip::ZipFile.open(artifacts(@zip_file).map(&:to_s).first) do |source|
180
+ source.entries.reject { |entry| entry.directory? }.each do |entry|
181
+ if @includes.any? { |pattern| File.fnmatch(pattern, entry.name) } &&
182
+ !@excludes.any? { |pattern| File.fnmatch(pattern, entry.name) }
183
+ puts "Adding #{path}#{entry.name}" if Rake.application.options.trace
184
+ zip.get_output_stream("#{path}#{entry.name}") { |output| output.write source.read(entry) }
185
+ # TODO: read and write file
186
+ end
187
+ end
188
+ end
189
+ end
190
+
55
191
  end
56
192
 
193
+
57
194
  # Returns a path to which you can include/exclude files.
58
195
  #
59
196
  # zip(..).include("foo", :path=>"bar")
60
197
  # is equivalen to:
61
198
  # zip(..).path("bar").include("foo")
62
199
  def path(path)
63
- @paths[path] ||= FileList[]
200
+ path.blank? ? @paths[nil] : (@paths[path] ||= Path.new(path))
64
201
  end
65
202
 
66
203
  # Pass options to the task. Returns self.
@@ -77,34 +214,31 @@ module Buildr
77
214
 
78
215
  def invoke_prerequisites()
79
216
  super
80
- @paths.each { |p, files| artifacts(*files).each { |f| file(f).invoke } }
217
+ @paths.collect { |name, path| path.expand_sources }.flatten.each { |src| file(src).invoke }
81
218
  end
82
219
 
83
220
  def needed?()
221
+ return true unless File.exist?(name)
84
222
  # You can do something like:
85
223
  # include("foo", :path=>"foo").exclude("foo/bar", path=>"foo").
86
224
  # include("foo/bar", :path=>"foo/bar")
87
225
  # This will play havoc if we handled all the prerequisites together
88
226
  # under the task, so instead we handle them individually for each path.
89
- #@paths.collect{ |p, files| files }.flatten.each { |f| file(f).invoke }
90
- return true unless File.exist?(name)
227
+ #
91
228
  # We need to check that any file we include is not newer than the
92
229
  # contents of the ZIP. The file itself but also the directory it's
93
230
  # coming from, since some tasks touch the directory, e.g. when the
94
231
  # content of target/classes is included into a WAR.
95
- files = @paths.collect { |path, files| files.map(&:to_s) }.flatten
96
- files = files.collect { |f| File.directory?(f) ? FileList[File.join(f, "**", "*")].collect | [f] : f }.flatten
97
- most_recent = files.select { |f| File.exist?(f) }.collect { |f| File.stat(f).mtime }.max
232
+ most_recent = @paths.collect { |name, path| path.expand_sources }.flatten.
233
+ each { |src| File.directory?(src) ? FileList[File.join(src, "**", "*")] | [src] : src }.flatten.
234
+ select { |file| File.exist?(file) }.collect { |file| File.stat(file).mtime }.max
98
235
  File.stat(name).mtime < (most_recent || Rake::EARLY)
99
236
  end
100
237
 
101
238
  protected
102
239
 
103
240
  def create(zip)
104
- zip_map.keys.sort.each do |path|
105
- puts "Adding #{path}" if Rake.application.options.trace
106
- zip.add path, zip_map[path]
107
- end
241
+ @paths.each { |name, obj| obj.add_file zip }
108
242
  end
109
243
 
110
244
  def zip_map()
@@ -244,9 +378,10 @@ module Buildr
244
378
  end
245
379
 
246
380
  def needed?()
247
- return true unless target && File.exist?(target)
248
- return true if prerequisites.any? { |prereq| File.stat(prereq).mtime > File.stat(target).mtime }
249
- false
381
+ #return true unless target && File.exist?(target)
382
+ #return true if prerequisites.any? { |prereq| File.stat(prereq).mtime > File.stat(target).mtime }
383
+ #false
384
+ true
250
385
  end
251
386
 
252
387
  # :nodoc: