buildr 0.16.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,48 @@
1
+ 0.18 (3/26/2007)
2
+ * Added: manifest attribute on project, used by default when packaging JAR/WAR.
3
+ * Added: default manifest includes build-by, build-jdk and implementation-title.
4
+ * Added: compile.from(sources) in the same vein as compile.with(classpath)
5
+ * Added: load all *.rake files form the tasks directory (if exists) for use in the
6
+ main Rakefile.
7
+ * Added: Java.tools returns a reference to tools.jar on JDKs that include it.
8
+ * Added: brought back experimental test tasks.
9
+ * Added: artifacts task to download all artifacts referenced by project (using
10
+ either artifact or artifacts method).
11
+ * Changed: back to old behavior, compile task only executes if there are any files
12
+ to compile, and compile? method removed.
13
+ * Changed: repositories.remote is now an array instead of a hash, and repositories
14
+ are searched in the order in which they appear.
15
+ * Changed: release task is now a regular task, using the Release object instead
16
+ of being a ReleaseTask.
17
+ * Changed: eclipse task executes artifacts task.
18
+ * Fixed: inherited attributes now cache default value, useful when working with
19
+ arrays/hashes.
20
+ * Fixed: manifest file generated even if manifest attribute is false.
21
+ * Fixed: compile task now properly detects when not all files compiled.
22
+ * Fixed: bug that caused project file tasks to execute twice.
23
+
24
+ 0.17 (3/14/2007)
25
+ * Added: project.task acts like Rake's task but can also fetch a task from
26
+ a project using the project's namespace.
27
+ * Added: project.file acts like Rake's file but resolve relative paths
28
+ based on the project base directory.
29
+ * Added: Rake tasks execute in the directory in which they were defined.
30
+ * Added: enhanced Rake with circular dependency, and you can find all circular
31
+ dependencies by running rake check.
32
+ * Added: enhanced Rake in_namespace, if the namespace starts with colon,
33
+ creates a namespace relative to the root instead of the current namespace.
34
+ * Changed: a project definition is now a task definition.
35
+ * Changed: use enhance to extend the project definition instead of after_define.
36
+ * Changed: LocalDirectoryTask replaced with Project.local_task.
37
+ * Changed: projects method accepts multiple names, returning only these project
38
+ definitions, returns all of them with no arguments.
39
+ * Changed: package only defines the essentials once, so you can call package
40
+ on a project to retrieve a specific package by type/id.
41
+ * Changed: zip task (and jar/war) no longer resolve artifacts for you,
42
+ must call artifacts directly.
43
+ * Changed: cannot access a project before it's defined, but can do that with
44
+ sub-projects to establish dependencies.
45
+
1
46
  0.16 (3/7/2007)
2
47
  * Added: zip.include :as=> to include file under specified name.
3
48
  * Added: zip.merge to include the (expanded) contents of one zip file in another.
data/README CHANGED
@@ -0,0 +1,4 @@
1
+
2
+ This is Buildr, the build system that doesn't suck.
3
+
4
+ http://buildr.rubyforge.org/
@@ -1,20 +1,27 @@
1
- # returning(obj) and with(obj)
1
+ # returning(obj)
2
2
  require "facet/kernel/with"
3
3
  # &:symbol goodness.
4
4
  require "facet/symbol/to_proc"
5
5
  # blank? on string and nil
6
6
  require "facet/string/blank"
7
7
  require "facet/nilclass/blank"
8
+ # x.in?(y) is better than y.include?(x)
9
+ require "facet/kernel/in"
8
10
  # What it says.
11
+ require "facet/kernel/__DIR__"
12
+ require "facet/kernel/instance_exec"
9
13
  require "facet/module/alias_method_chain"
14
+ require "facet/module/memoize"
10
15
  require "facet/string/starts_with"
16
+ require "facet/openobject"
17
+ require "facets/core/kernel/tap"
11
18
 
12
19
 
13
20
  module Buildr
14
- VERSION = "0.16.0"
21
+ VERSION = "0.18.0"
15
22
  end
16
23
 
17
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__))
24
+ $LOAD_PATH.unshift File.join(__DIR__)
18
25
  require "core/core.rb"
19
26
  require "core/project.rb"
20
27
  require "core/artifact.rb"
@@ -26,7 +33,9 @@ require "tasks/filter"
26
33
  require "tasks/zip"
27
34
 
28
35
  require "java/java"
36
+ require "java/jetty"
29
37
  require "java/compile"
38
+ require "java/eclipse"
30
39
  require "java/test"
31
40
  require "java/javacc"
32
41
  require "java/openjpa"
@@ -46,3 +55,6 @@ end
46
55
  if File.exist?(File.join(Rake.application.original_dir, "buildr.rb"))
47
56
  load File.join(Rake.application.original_dir, "buildr.rb")
48
57
  end
58
+
59
+ #Load local tasks that can be used in the Rakefile.
60
+ Dir["#{Dir.pwd}/tasks/*.rake"].each { |ext| load ext }
@@ -1,5 +1,8 @@
1
1
  module Buildr
2
2
 
3
+ desc "Download all artifacts"
4
+ task "artifacts"
5
+
3
6
  # This module gives you a way to access the individual properties of an
4
7
  # artifact: id, group, type, classifier and version. It also provides other
5
8
  # methods commonly used on an artifact, specifically #to_hash and #to_spec.
@@ -183,32 +186,27 @@ module Buildr
183
186
  File.join(local, spec[:group].split("."), spec[:id], spec[:version], Artifact.hash_to_file_name(spec))
184
187
  end
185
188
 
186
- # Returns a hash of all the remote repositories. The key is the repository
187
- # identifier, and the value is the repository base URL.
189
+ # Returns an array of all the remote repositories. When downloading an artifact,
190
+ # the default behavior is to try repositories in the order in which they show in
191
+ # the array.
188
192
  def remote()
189
- @remote ||= {}
193
+ @remote ||= []
190
194
  end
191
195
 
192
- # Sets the remote repositories from a hash. See #remote.
193
- def remote=(hash)
194
- case hash
196
+ # With a string argument, sets the remote repository (only one) to this URL.
197
+ # With an array argument, sets the remote repository to that set of URLs.
198
+ # Passing nil is equivalent to an empty array.
199
+ def remote=(urls)
200
+ case urls
195
201
  when nil
196
- @remote = {}
197
- when Hash
198
- @remote = hash.clone
202
+ @remote = nil
203
+ when Array
204
+ @remote = urls.dup
199
205
  else
200
- raise ArgumentError, "Expecting a hash" unless Hash === hash
206
+ @remote = [urls.to_s]
201
207
  end
202
208
  end
203
209
 
204
- # Adds more remote repositories from a hash. See #remote.
205
- #
206
- # For example:
207
- # repositories.remote.add :ibiblio=>"http://www.ibiblio.org/maven2"
208
- def add(hash)
209
- remote.merge!(hash)
210
- end
211
-
212
210
  # Attempts to download the artifact from one of the remote repositories
213
211
  # and store it in the local repository. Returns the path if downloaded,
214
212
  # otherwise raises an exception.
@@ -217,7 +215,7 @@ module Buildr
217
215
  path = locate(spec)
218
216
 
219
217
  puts "Downloading #{Artifact.to_spec(spec)}" if Rake.application.options.trace
220
- return path if remote.any? do |repo_id, repo_url|
218
+ return path if remote.any? do |repo_url|
221
219
  begin
222
220
  rel_path = spec[:group].gsub(".", "/") +
223
221
  "/#{spec[:id]}/#{spec[:version]}/#{Artifact.hash_to_file_name(spec)}"
@@ -235,7 +233,7 @@ module Buildr
235
233
  false
236
234
  end
237
235
  end
238
- fail "Failed to download #{Artifact.to_spec(spec)}, tried the following repositories:\n#{repositories.remote.values.join("\n")}"
236
+ fail "Failed to download #{Artifact.to_spec(spec)}, tried the following repositories:\n#{repositories.remote.join("\n")}"
239
237
  end
240
238
 
241
239
  # Specifies the deployment repository. Accepts a hash with the different
@@ -293,6 +291,7 @@ module Buildr
293
291
  spec = Artifact.to_hash(spec)
294
292
  unless task = Artifact.lookup(spec)
295
293
  task = Artifact.define_task(repositories.locate(spec))
294
+ Rake::Task["rake:artifacts"].enhance [ task ]
296
295
  Artifact.register(task)
297
296
  end
298
297
  task.apply_spec spec
@@ -336,11 +335,11 @@ module Buildr
336
335
  when /:/
337
336
  set |= [artifact(spec)]
338
337
  when String
339
- set |= [file(spec)]
340
- when Rake::Task
341
- set |= [spec]
338
+ set |= [File.expand_path(spec)]
342
339
  when Project
343
340
  set |= artifacts(spec.packages)
341
+ when Rake::Task
342
+ set |= [spec]
344
343
  when Array
345
344
  set |= artifacts(*spec)
346
345
  else
@@ -13,7 +13,7 @@ module Buildr
13
13
  }
14
14
 
15
15
  # Handles the build and clean tasks.
16
- BUILD_TASKS.each { |name, comment| LocalDirectoryTask.define_task(name).add_comment(comment) }
16
+ BUILD_TASKS.each { |name, comment| Project.local_task(task(name)).add_comment(comment) }
17
17
 
18
18
  Project.on_define do |project|
19
19
  BUILD_TASKS.each { |name, comment| project.recursive_task name }
@@ -21,25 +21,22 @@ module Buildr
21
21
 
22
22
  class Project
23
23
  def build(*args, &block)
24
- returning(@build_task ||= task("build")) do |task|
25
- task.enhance args, &block
26
- end
24
+ task("build").enhance args, &block
27
25
  end
28
26
 
29
27
  def clean(*args, &block)
30
- returning(@clean_task ||= task("clean")) do |task|
31
- task.enhance args, &block
32
- end
28
+ task("clean").enhance args, &block
33
29
  end
34
30
  end
35
31
 
36
32
  Project.on_define do |project|
33
+ # Make sure these tasks are defined in the project.
37
34
  project.build
38
35
  project.clean
39
36
  end
40
37
 
41
38
 
42
- class ReleaseTask < Rake::Task
39
+ class Release
43
40
 
44
41
  VERSION_NUMBER_PATTERN = /VERSION_NUMBER\s*=\s*(["'])(.*)\1/
45
42
  NEXT_VERSION_PATTERN = /NEXT_VERSION\s*=\s*(["'])(.*)\1/
@@ -50,27 +47,30 @@ module Buildr
50
47
  end
51
48
  end
52
49
 
53
- def initialize(*args)
54
- super
55
- enhance do |task|
56
- # Make sure we don't have anything uncommitted in SVN.
57
- check_status
58
- # Update current version to next version before deploying.
59
- next_ver = update_version
60
- # Run the deployment externally using the new version number
61
- # (from the modified Rakefile).
62
- sh "rake deploy"
63
- # Update the next version as well to the next increment and commit.
64
- update_next_version next_ver
65
- # Tag the repository for this release.
66
- tag_repository next_ver
67
- # Update the next version to end with -SNAPSHOT.
68
- update_version_to_snapshot next_ver
69
- end
50
+ def initialize(rakefile = nil)
51
+ @rakefile = rakefile || File.read(Rake.application.rakefile)
52
+ end
53
+
54
+ attr_reader :rakefile
55
+
56
+ def invoke()
57
+ # Make sure we don't have anything uncommitted in SVN.
58
+ check_status
59
+ # Update current version to next version before deploying.
60
+ next_ver = update_version
61
+ # Run the deployment externally using the new version number
62
+ # (from the modified Rakefile).
63
+ sh "rake deploy"
64
+ # Update the next version as well to the next increment and commit.
65
+ update_next_version next_ver
66
+ # Tag the repository for this release.
67
+ tag_repository next_ver
68
+ # Update the next version to end with -SNAPSHOT.
69
+ update_version_to_snapshot next_ver
70
70
  end
71
71
 
72
72
  def check_status()
73
- ignores = ReleaseTask.svn_ignores
73
+ ignores = Release.svn_ignores
74
74
  status = svn("status", "--ignore-externals", :verbose=>false).
75
75
  reject { |line| line =~ /^X\s/ || ignores.any? { |pat| line =~ pat } }
76
76
  fail "Uncommitted SVN files violate the First Principle Of Release!\n#{status}" unless
@@ -81,7 +81,7 @@ module Buildr
81
81
  # next version number (VERSION_NUMBER = NEXT_VERSION). We need this
82
82
  # before making a release with the next version. Return the next version.
83
83
  def update_version()
84
- rakefile = File.read(Rake.application.rakefile)
84
+ rakefile = read_rakefile
85
85
  version = rakefile.scan(VERSION_NUMBER_PATTERN)[0][1] or
86
86
  fail "Looking for VERSION_NUMBER = \"...\" in your Rakefile, none found"
87
87
  next_ver = rakefile.scan(NEXT_VERSION_PATTERN)[0][1] or
@@ -90,11 +90,8 @@ module Buildr
90
90
  puts "Current version: #{version}"
91
91
  puts "Next version: #{next_ver}"
92
92
  end
93
-
94
93
  # Switch version numbers.
95
- rakefile.gsub!(VERSION_NUMBER_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{next_ver}"}) }
96
- File.open(Rake.application.rakefile, "w") { |file| file.write rakefile }
97
-
94
+ write_rakefile rakefile.gsub(VERSION_NUMBER_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{next_ver}"}) }
98
95
  next_ver
99
96
  end
100
97
 
@@ -106,12 +103,9 @@ module Buildr
106
103
  nums = version.split(".")
107
104
  nums[-1] = nums[-1].to_i + 1
108
105
  next_ver = nums.join(".")
109
- rakefile = File.read(Rake.application.rakefile)
110
- rakefile.gsub!(NEXT_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{next_ver}"}) }
111
- File.open(Rake.application.rakefile, "w") { |file| file.write rakefile }
112
-
106
+ write_rakefile read_rakefile.gsub(NEXT_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{next_ver}"}) }
113
107
  # Commit new version number.
114
- svn "commit", "-m", "Changed version number to #{version}", Rake.application.rakefile
108
+ svn "commit", "-m", "Changed version number to #{version}", rakefile
115
109
  end
116
110
 
117
111
  # Create a tag in the SVN repository.
@@ -125,11 +119,19 @@ module Buildr
125
119
 
126
120
  def update_version_to_snapshot(version)
127
121
  version += "-SNAPSHOT"
128
- rakefile = File.read(Rake.application.rakefile)
129
- rakefile.gsub!(VERSION_NUMBER_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{version}"}) }
130
- File.open(Rake.application.rakefile, "w") { |file| file.write rakefile }
122
+ write_rakefile read_rakefile.gsub(VERSION_NUMBER_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{version}"}) }
131
123
  # Commit new version number.
132
- svn "commit", "-m", "Changed version number to #{version}", Rake.application.rakefile
124
+ svn "commit", "-m", "Changed version number to #{version}", rakefile
125
+ end
126
+
127
+ protected
128
+
129
+ def read_rakefile()
130
+ File.read(rakefile)
131
+ end
132
+
133
+ def write_rakefile(contents)
134
+ File.open(rakefile, "w") { |file| file.write contents }
133
135
  end
134
136
 
135
137
  def svn(*args)
@@ -146,8 +148,17 @@ module Buildr
146
148
  returning(stdout.read) { |output| puts output if Rake.application.options.trace }
147
149
  end
148
150
  end
151
+
149
152
  end
150
153
 
154
+
151
155
  desc "Make a release"
152
- ReleaseTask.define_task "release"
156
+ task("release").tap do |release|
157
+ class << release
158
+ def release()
159
+ @release ||= Release.new
160
+ end
161
+ end
162
+ release.enhance { release.invoke }
163
+ end
153
164
  end
@@ -28,13 +28,128 @@ module Buildr
28
28
  # inherited_attr :java_src_dir do src_dir + "/main/java"
29
29
  def inherited_attr(symbol, default = nil, &block)
30
30
  block ||= proc { default }
31
- define_method symbol do
32
- instance_variable_get("@#{symbol}") || (parent ? parent.send(symbol) : self.instance_eval(&block))
31
+ attr_accessor symbol
32
+ define_method "#{symbol}_with_inheritence" do
33
+ unless value = send("#{symbol}_without_inheritence")
34
+ value = parent ? parent.send(symbol) : self.instance_eval(&block)
35
+ send "#{symbol}=", value
36
+ end
37
+ value
33
38
  end
34
- define_method "#{symbol}=" do |value|
35
- instance_variable_set("@#{symbol}", value)
39
+ alias_method_chain symbol, :inheritence
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ class Rake::Task
46
+ def invoke
47
+ tasks = (Thread.current[:tasks] || [])
48
+ if tasks.include?(name)
49
+ fail "Circular dependency " + (tasks + [name]).join("=>")
50
+ end
51
+ @lock.synchronize do
52
+ if application.options.trace
53
+ puts "** Invoke #{name} #{format_trace_flags}"
54
+ end
55
+ return if @already_invoked
56
+ begin
57
+ Thread.current[:tasks] = tasks + [name]
58
+ @already_invoked = true
59
+ invoke_prerequisites
60
+ execute if needed?
61
+ ensure
62
+ Thread.current[:tasks] = tasks
36
63
  end
37
64
  end
38
65
  end
66
+ end
67
+
68
+ class Rake::Task
39
69
 
70
+ # Access the base directory. The base directory is set when the class
71
+ # is defined from the current directory. The current directory is set
72
+ # to the base directory when the class is executed.
73
+ attr_accessor :base_dir
74
+
75
+ # :nodoc:
76
+ def invoke_with_base_dir()
77
+ Dir.chdir(@base_dir || Dir.pwd) { invoke_without_base_dir }
78
+ end
79
+ alias_method_chain :invoke, :base_dir
80
+
81
+ # :nodoc:
82
+ def initialize_with_base_dir(*args)
83
+ @base_dir = Dir.pwd
84
+ initialize_without_base_dir *args
85
+ end
86
+ alias_method_chain :initialize, :base_dir
87
+
88
+ end
89
+
90
+
91
+ class Rake::Application
92
+
93
+ def in_namespace_with_global_scope(name, &block)
94
+ if name =~ /^:/
95
+ begin
96
+ scope, @scope = @scope, name.split(":")[1...-1]
97
+ in_namespace_without_global_scope name.split(":").last, &block
98
+ ensure
99
+ @scope = scope
100
+ end
101
+ else
102
+ in_namespace_without_global_scope name, &block
103
+ end
104
+ end
105
+ alias_method_chain :in_namespace, :global_scope
106
+
107
+ end
108
+
109
+
110
+ class CheckTask < Rake::Task
111
+
112
+ def execute()
113
+ @warnings = []
114
+ super
115
+ report if verbose
116
+ end
117
+
118
+ def note(*msg)
119
+ @warnings += msg
120
+ end
121
+
122
+ def report()
123
+ if @warnings.empty?
124
+ puts HighLine.new.color("No warnings", :green)
125
+ else
126
+ warn "These are possible problems with your Rakefile"
127
+ @warnings.each { |msg| warn " #{msg}" }
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+
134
+ desc "Check your Rakefile for common errors"
135
+ CheckTask.define_task "check"
136
+
137
+ # Check for circular dependencies
138
+ task "check" do
139
+ depends = {}
140
+ expand = lambda do |stack, checking|
141
+ if depends[checking]
142
+ if stack.include?(checking)
143
+ fail "Circular " + (stack + [checking]).join("=>")
144
+ end
145
+ else
146
+ depends[checking] = []
147
+ depends[checking] |= Rake.application[checking].prerequisites.
148
+ map { |prereq| expand[stack + [checking.to_s], prereq.to_s] }.flatten.map(&:to_s)
149
+ end
150
+ depends[checking]
151
+ end
152
+ Rake.application.tasks.each do |checking|
153
+ expand[ [], checking.to_s ]
154
+ end
40
155
  end