buildr 0.16.0 → 0.18.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.
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