buildr 1.3.5-x86-mswin32 → 1.4.0-x86-mswin32

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.
Files changed (151) hide show
  1. data/CHANGELOG +153 -8
  2. data/README.rdoc +1 -1
  3. data/addon/buildr/antlr.rb +5 -5
  4. data/addon/buildr/drb.rb +18 -18
  5. data/addon/buildr/hibernate.rb +18 -14
  6. data/addon/buildr/javacc.rb +4 -4
  7. data/addon/buildr/jetty.rb +5 -5
  8. data/addon/buildr/nailgun.rb +23 -23
  9. data/addon/buildr/openjpa.rb +1 -1
  10. data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
  11. data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
  12. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  13. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  14. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  15. data/addon/buildr/protobuf.rb +75 -0
  16. data/addon/buildr/xmlbeans.rb +5 -5
  17. data/buildr.buildfile +2 -2
  18. data/buildr.gemspec +8 -7
  19. data/doc/_layouts/default.html +2 -2
  20. data/doc/artifacts.textile +4 -4
  21. data/doc/building.textile +35 -3
  22. data/doc/contributing.textile +5 -0
  23. data/doc/download.textile +16 -5
  24. data/doc/extending.textile +38 -12
  25. data/doc/installing.textile +6 -5
  26. data/doc/languages.textile +182 -42
  27. data/doc/more_stuff.textile +2 -2
  28. data/doc/packaging.textile +14 -15
  29. data/doc/projects.textile +7 -2
  30. data/doc/quick_start.textile +4 -4
  31. data/doc/scripts/buildr-git.rb +63 -63
  32. data/doc/scripts/gitflow.rb +21 -21
  33. data/doc/settings_profiles.textile +9 -2
  34. data/doc/testing.textile +16 -5
  35. data/etc/KEYS +38 -0
  36. data/lib/buildr.rb +1 -1
  37. data/lib/buildr/core.rb +1 -0
  38. data/lib/buildr/core/application.rb +33 -27
  39. data/lib/buildr/core/build.rb +41 -28
  40. data/lib/buildr/core/cc.rb +172 -0
  41. data/lib/buildr/core/checks.rb +1 -1
  42. data/lib/buildr/core/common.rb +7 -6
  43. data/lib/buildr/core/compile.rb +7 -8
  44. data/lib/buildr/core/doc.rb +263 -0
  45. data/lib/buildr/core/environment.rb +6 -6
  46. data/lib/buildr/core/filter.rb +77 -35
  47. data/lib/buildr/core/generate.rb +7 -7
  48. data/lib/buildr/core/help.rb +1 -1
  49. data/lib/buildr/core/osx.rb +6 -6
  50. data/lib/buildr/core/progressbar.rb +4 -4
  51. data/lib/buildr/core/project.rb +144 -36
  52. data/lib/buildr/core/shell.rb +34 -34
  53. data/lib/buildr/core/test.rb +89 -20
  54. data/lib/buildr/core/transports.rb +8 -7
  55. data/lib/buildr/core/util.rb +77 -23
  56. data/lib/buildr/groovy/bdd.rb +5 -5
  57. data/lib/buildr/groovy/compiler.rb +19 -15
  58. data/lib/buildr/groovy/shell.rb +6 -6
  59. data/lib/buildr/ide/eclipse.rb +148 -75
  60. data/lib/buildr/ide/eclipse/java.rb +3 -3
  61. data/lib/buildr/ide/eclipse/plugin.rb +8 -5
  62. data/lib/buildr/ide/eclipse/scala.rb +4 -2
  63. data/lib/buildr/ide/idea.rb +2 -2
  64. data/lib/buildr/ide/idea7x.rb +23 -4
  65. data/lib/buildr/java.rb +1 -0
  66. data/lib/buildr/java/ant.rb +4 -4
  67. data/lib/buildr/java/bdd.rb +51 -54
  68. data/lib/buildr/java/cobertura.rb +57 -35
  69. data/lib/buildr/java/commands.rb +14 -5
  70. data/lib/buildr/java/compiler.rb +3 -217
  71. data/lib/buildr/java/deprecated.rb +4 -4
  72. data/lib/buildr/java/doc.rb +70 -0
  73. data/lib/buildr/java/emma.rb +22 -22
  74. data/lib/buildr/java/jruby.rb +4 -4
  75. data/lib/buildr/java/jtestr_runner.rb.erb +27 -25
  76. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  77. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +8 -3
  78. data/lib/buildr/java/packaging.rb +30 -29
  79. data/lib/buildr/java/pom.rb +4 -4
  80. data/lib/buildr/java/rjb.rb +6 -6
  81. data/lib/buildr/java/test_result.rb +61 -85
  82. data/lib/buildr/java/tests.rb +44 -27
  83. data/lib/buildr/java/version_requirement.rb +8 -8
  84. data/lib/buildr/packaging/archive.rb +55 -22
  85. data/lib/buildr/packaging/artifact.rb +75 -36
  86. data/lib/buildr/packaging/artifact_namespace.rb +90 -78
  87. data/lib/buildr/packaging/artifact_search.rb +5 -5
  88. data/lib/buildr/packaging/gems.rb +11 -7
  89. data/lib/buildr/packaging/package.rb +10 -7
  90. data/lib/buildr/packaging/tar.rb +14 -14
  91. data/lib/buildr/packaging/version_requirement.rb +30 -10
  92. data/lib/buildr/packaging/ziptask.rb +51 -13
  93. data/lib/buildr/scala.rb +1 -0
  94. data/lib/buildr/scala/bdd.rb +25 -20
  95. data/lib/buildr/scala/compiler.rb +87 -40
  96. data/lib/buildr/scala/doc.rb +106 -0
  97. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  98. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.java +57 -0
  99. data/lib/buildr/scala/shell.rb +14 -9
  100. data/lib/buildr/scala/tests.rb +33 -26
  101. data/lib/buildr/shell.rb +33 -33
  102. data/rakelib/all-in-one.rake +113 -0
  103. data/rakelib/checks.rake +1 -1
  104. data/rakelib/doc.rake +7 -0
  105. data/rakelib/package.rake +1 -1
  106. data/rakelib/release.rake +9 -6
  107. data/rakelib/rspec.rake +26 -7
  108. data/rakelib/setup.rake +15 -3
  109. data/rakelib/stage.rake +18 -11
  110. data/spec/addon/drb_spec.rb +25 -25
  111. data/spec/core/application_spec.rb +111 -21
  112. data/spec/core/build_spec.rb +16 -15
  113. data/spec/core/cc_spec.rb +174 -0
  114. data/spec/core/checks_spec.rb +34 -34
  115. data/spec/core/common_spec.rb +51 -5
  116. data/spec/core/compile_spec.rb +89 -14
  117. data/spec/core/extension_spec.rb +127 -19
  118. data/spec/core/generate_spec.rb +2 -2
  119. data/spec/core/project_spec.rb +10 -10
  120. data/spec/core/test_spec.rb +144 -35
  121. data/spec/core/transport_spec.rb +8 -8
  122. data/spec/core/util_spec.rb +63 -5
  123. data/spec/groovy/bdd_spec.rb +5 -5
  124. data/spec/groovy/compiler_spec.rb +29 -18
  125. data/spec/ide/eclipse_spec.rb +185 -9
  126. data/spec/ide/idea7x_spec.rb +22 -10
  127. data/spec/java/ant_spec.rb +9 -5
  128. data/spec/java/bdd_spec.rb +29 -37
  129. data/spec/java/cobertura_spec.rb +12 -12
  130. data/spec/java/commands_spec.rb +34 -0
  131. data/spec/java/compiler_spec.rb +53 -53
  132. data/spec/java/emma_spec.rb +11 -11
  133. data/spec/java/java_spec.rb +10 -10
  134. data/spec/java/packaging_spec.rb +67 -20
  135. data/spec/java/test_coverage_helper.rb +18 -18
  136. data/spec/java/tests_spec.rb +13 -9
  137. data/spec/packaging/archive_spec.rb +187 -20
  138. data/spec/packaging/artifact_namespace_spec.rb +172 -83
  139. data/spec/packaging/artifact_spec.rb +83 -18
  140. data/spec/packaging/packaging_spec.rb +41 -14
  141. data/spec/sandbox.rb +23 -12
  142. data/spec/scala/bdd_spec.rb +13 -8
  143. data/spec/scala/compiler_spec.rb +18 -13
  144. data/spec/scala/scala.rb +3 -3
  145. data/spec/scala/tests_spec.rb +46 -24
  146. data/spec/spec_helpers.rb +28 -10
  147. data/spec/version_requirement_spec.rb +25 -11
  148. metadata +149 -133
  149. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  150. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +0 -35
  151. data/rakelib/stage.rake~ +0 -213
@@ -0,0 +1,263 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ module Buildr
17
+ module Doc
18
+ include Extension
19
+
20
+ class << self
21
+ def select_by_lang(lang)
22
+ fail 'Unable to define doc task for nil language' if lang.nil?
23
+ engines.detect { |e| e.language.to_sym == lang.to_sym }
24
+ end
25
+
26
+ alias_method :select, :select_by_lang
27
+
28
+ def select_by_name(name)
29
+ fail 'Unable to define doc task for nil' if name.nil?
30
+ engines.detect { |e| e.to_sym == name.to_sym }
31
+ end
32
+
33
+ def engines
34
+ @engines ||= []
35
+ end
36
+ end
37
+
38
+
39
+ # Base class for any documentation provider. Defines most
40
+ # common functionality (things like @into@, @from@ and friends).
41
+ class Base
42
+ class << self
43
+ attr_accessor :language, :source_ext
44
+
45
+ def specify(options)
46
+ @language = options[:language]
47
+ @source_ext = options[:source_ext]
48
+ end
49
+
50
+ def to_sym
51
+ @symbol ||= name.split('::').last.downcase.to_sym
52
+ end
53
+ end
54
+
55
+ attr_reader :project
56
+
57
+ def initialize(project)
58
+ @project = project
59
+ end
60
+ end
61
+
62
+
63
+ class DocTask < Rake::Task
64
+
65
+ # The target directory for the generated documentation files.
66
+ attr_reader :target
67
+
68
+ # Classpath dependencies.
69
+ attr_accessor :classpath
70
+
71
+ # Additional sourcepaths that are not part of the documented files.
72
+ attr_accessor :sourcepath
73
+
74
+ # Returns the documentation tool options.
75
+ attr_reader :options
76
+
77
+
78
+ attr_reader :project # :nodoc:
79
+
80
+ def initialize(*args) #:nodoc:
81
+ super
82
+ @options = {}
83
+ @classpath = []
84
+ @sourcepath = []
85
+ @files = FileList[]
86
+ enhance do |task|
87
+ rm_rf target.to_s
88
+ mkdir_p target.to_s
89
+
90
+ engine.generate(source_files, File.expand_path(target.to_s),
91
+ options.merge(:classpath => classpath, :sourcepath => sourcepath))
92
+
93
+ touch target.to_s
94
+ end
95
+ end
96
+
97
+ # :call-seq:
98
+ # into(path) => self
99
+ #
100
+ # Sets the target directory and returns self. This will also set the Javadoc task
101
+ # as a prerequisite to a file task on the target directory.
102
+ #
103
+ # For example:
104
+ # package :zip, :classifier=>'docs', :include=>doc.target
105
+ def into(path)
106
+ @target = file(path.to_s).enhance([self]) unless @target && @target.to_s == path.to_s
107
+ self
108
+ end
109
+
110
+ # :call-seq:
111
+ # include(*files) => self
112
+ #
113
+ # Includes additional source files and directories when generating the documentation
114
+ # and returns self. When specifying a directory, includes all source files in that directory.
115
+ def include(*files)
116
+ @files.include *files.flatten.compact
117
+ self
118
+ end
119
+
120
+ # :call-seq:
121
+ # exclude(*files) => self
122
+ #
123
+ # Excludes source files and directories from generating the documentation.
124
+ def exclude(*files)
125
+ @files.exclude *files
126
+ self
127
+ end
128
+
129
+ # :call-seq:
130
+ # with(*artifacts) => self
131
+ #
132
+ # Adds files and artifacts as classpath dependencies, and returns self.
133
+ def with(*specs)
134
+ @classpath |= Buildr.artifacts(specs.flatten).uniq
135
+ self
136
+ end
137
+
138
+ # :call-seq:
139
+ # using(options) => self
140
+ #
141
+ # Sets the documentation tool options from a hash and returns self.
142
+ #
143
+ # For example:
144
+ # doc.using :windowtitle=>'My application'
145
+ # doc.using :vscaladoc
146
+ def using(*args)
147
+ args.pop.each { |key, value| @options[key.to_sym] = value } if Hash === args.last
148
+
149
+ until args.empty?
150
+ new_engine = Doc.select_by_name(args.pop)
151
+ @engine = new_engine.new(project) unless new_engine.nil?
152
+ end
153
+
154
+ self
155
+ end
156
+
157
+ def engine
158
+ @engine ||= guess_engine
159
+ end
160
+
161
+ # :call-seq:
162
+ # from(*sources) => self
163
+ #
164
+ # Includes files, directories and projects in the documentation and returns self.
165
+ #
166
+ # You can call this method with source files and directories containing source files
167
+ # to include these files in the documentation, similar to #include. You can also call
168
+ # this method with projects. When called with a project, it includes all the source files compiled
169
+ # by that project and classpath dependencies used when compiling.
170
+ #
171
+ # For example:
172
+ # doc.from projects('myapp:foo', 'myapp:bar')
173
+ def from(*sources)
174
+ sources.flatten.each do |source|
175
+ case source
176
+ when Project
177
+ self.enhance source.prerequisites
178
+ self.include source.compile.sources
179
+ self.with source.compile.dependencies
180
+ when Rake::Task, String
181
+ self.include source
182
+ else
183
+ fail "Don't know how to generate documentation from #{source || 'nil'}"
184
+ end
185
+ end
186
+ self
187
+ end
188
+
189
+ def prerequisites #:nodoc:
190
+ super + @files + classpath + sourcepath
191
+ end
192
+
193
+ def source_files #:nodoc:
194
+ @source_files ||= @files.map(&:to_s).map do |file|
195
+ File.directory?(file) ? FileList[File.join(file, "**/*.#{engine.class.source_ext}")] : file
196
+ end.flatten.reject { |file| @files.exclude?(file) }
197
+ end
198
+
199
+ def needed? #:nodoc:
200
+ return false if source_files.empty?
201
+ return true unless File.exist?(target.to_s)
202
+ source_files.map { |src| File.stat(src.to_s).mtime }.max > File.stat(target.to_s).mtime
203
+ end
204
+
205
+ private
206
+
207
+ def guess_engine
208
+ doc_engine = Doc.select project.compile.language
209
+ fail 'Unable to guess documentation provider for project.' unless doc_engine
210
+ doc_engine.new project
211
+ end
212
+
213
+ def associate_with(project)
214
+ @project ||= project
215
+ end
216
+ end
217
+
218
+
219
+ first_time do
220
+ desc 'Create the documentation for this project'
221
+ Project.local_task :doc
222
+ end
223
+
224
+ before_define do |project|
225
+ DocTask.define_task('doc').tap do |doc|
226
+ doc.send(:associate_with, project)
227
+ doc.into project.path_to(:target, :doc)
228
+ doc.using :windowtitle=>project.comment || project.name
229
+ end
230
+ end
231
+
232
+ after_define do |project|
233
+ project.doc.from project
234
+ end
235
+
236
+ # :call-seq:
237
+ # doc(*sources) => JavadocTask
238
+ #
239
+ # This method returns the project's documentation task. It also accepts a list of source files,
240
+ # directories and projects to include when generating the docs.
241
+ #
242
+ # By default the doc task uses all the source directories from compile.sources and generates
243
+ # documentation in the target/doc directory. This method accepts sources and adds them by calling
244
+ # Buildr::Doc::Base#from.
245
+ #
246
+ # For example, if you want to generate documentation for a given project that includes all source files
247
+ # in two of its sub-projects:
248
+ # doc projects('myapp:foo', 'myapp:bar').using(:windowtitle=>'Docs for foo and bar')
249
+ def doc(*sources, &block)
250
+ task('doc').from(*sources).enhance &block
251
+ end
252
+
253
+ def javadoc(*sources, &block)
254
+ warn 'The javadoc method is deprecated and will be removed in a future release.'
255
+ doc(*sources, &block)
256
+ end
257
+ end
258
+
259
+
260
+ class Project
261
+ include Doc
262
+ end
263
+ end
@@ -21,19 +21,19 @@ module Buildr
21
21
 
22
22
  # We use this to present environment variable as arrays.
23
23
  class EnvArray < Array #:nodoc:
24
-
24
+
25
25
  def initialize(name)
26
26
  @name = name.upcase
27
27
  replace((ENV[@name] || ENV[@name.downcase] || '').split(/\s*,\s*/).reject(&:empty?))
28
28
  end
29
29
 
30
- (Array.instance_methods - Object.instance_methods - Enumerable.instance_methods).sort.each do |method|
31
- class_eval %{def #{method}(*args, &block) ; result = super ; write ; result ; end}
30
+ (Array.instance_methods - Object.instance_methods - Enumerable.instance_methods - ['each']).sort.each do |method|
31
+ class_eval %{def #{method}(*args, &block) ; result = super ; write_envarray ; result ; end}
32
32
  end
33
33
 
34
34
  private
35
35
 
36
- def write
36
+ def write_envarray
37
37
  ENV[@name.downcase] = nil
38
38
  ENV[@name] = map(&:to_s).join(',')
39
39
  end
@@ -57,7 +57,7 @@ module Buildr
57
57
  ENV['http_proxy'] = nil
58
58
  ENV['HTTP_PROXY'] = url
59
59
  end
60
-
60
+
61
61
  # Returns the HTTPS_PROXY URL.
62
62
  def https
63
63
  ENV['HTTPS_PROXY'] || ENV['https_proxy']
@@ -69,7 +69,7 @@ module Buildr
69
69
  ENV['HTTPS_PROXY'] = url
70
70
  end
71
71
 
72
- # Returns list of hosts to exclude from proxying (NO_PROXY).
72
+ # Returns list of hosts to exclude from proxying (NO_PROXY).
73
73
  def exclude
74
74
  @exclude ||= EnvArray.new('NO_PROXY')
75
75
  end
@@ -41,6 +41,9 @@ module Buildr
41
41
  # relative to the source directories, so:
42
42
  # filter.include '*.png'
43
43
  # will only include PNG files from any of the source directories.
44
+ # In the same way, you can use regular expressions, so:
45
+ # filter.include /picture_.*\.png/
46
+ # will only include PNG files starting with picture_ from any of the sources directories.
44
47
  #
45
48
  # See Buildr#filter.
46
49
  class Filter
@@ -52,9 +55,9 @@ module Buildr
52
55
  # Returns the list of source directories (each being a file task).
53
56
  attr_reader :sources
54
57
 
55
- # :call-seq:
58
+ # :call-seq:
56
59
  # clear => self
57
- #
60
+ #
58
61
  # Clear filter sources and include/exclude patterns
59
62
  def clear
60
63
  @include = []
@@ -77,7 +80,16 @@ module Buildr
77
80
  end
78
81
 
79
82
  # The target directory as a file task.
80
- attr_reader :target
83
+ def target
84
+ return nil unless @target_dir
85
+ unless @target
86
+ @target = file(File.expand_path(@target_dir)) { |task| run if @target == task }
87
+ @target.enhance @include.select {|f| f.is_a?(Rake::FileTask)}
88
+ @target.enhance @exclude.select {|f| f.is_a?(Rake::FileTask)}
89
+ @target.enhance copy_map.values
90
+ end
91
+ @target
92
+ end
81
93
 
82
94
  # :call-seq:
83
95
  # into(dir) => self
@@ -87,7 +99,8 @@ module Buildr
87
99
  # For example:
88
100
  # filter.from('src').into('target').using('build'=>Time.now)
89
101
  def into(dir)
90
- @target = file(File.expand_path(dir.to_s)) { |task| run if target == task }
102
+ @target_dir = dir.to_s
103
+ @target = nil
91
104
  self
92
105
  end
93
106
 
@@ -99,17 +112,17 @@ module Buildr
99
112
  # By default all files are included. You can use this method to only include specific
100
113
  # files from the source directory.
101
114
  def include(*files)
102
- @include += files
115
+ @include += files.flatten
103
116
  self
104
117
  end
105
- alias :add :include
118
+ alias :add :include
106
119
 
107
120
  # :call-seq:
108
121
  # exclude(*files) => self
109
122
  #
110
123
  # Specifies files to exclude and returns self. See FileList#exclude.
111
124
  def exclude(*files)
112
- @exclude += files
125
+ @exclude += files.flatten
113
126
  self
114
127
  end
115
128
 
@@ -159,21 +172,8 @@ module Buildr
159
172
  #
160
173
  # Runs the filter.
161
174
  def run
162
- sources.each { |source| raise "Source directory #{source} doesn't exist" unless File.exist?(source.to_s) }
163
- raise 'No target directory specified, where am I going to copy the files to?' if target.nil?
175
+ copy_map = copy_map()
164
176
 
165
- copy_map = sources.flatten.map(&:to_s).inject({}) do |map, source|
166
- files = Util.recursive_with_dot_files(source).
167
- map { |file| Util.relative_path(file, source) }.
168
- select { |file| @include.empty? || @include.any? { |pattern| File.fnmatch(pattern, file) } }.
169
- reject { |file| @exclude.any? { |pattern| File.fnmatch(pattern, file) } }
170
- files.each do |file|
171
- src, dest = File.expand_path(file, source), File.expand_path(file, target.to_s)
172
- map[file] = src if !File.exist?(dest) || File.stat(src).mtime >= File.stat(dest).mtime
173
- end
174
- map
175
- end
176
-
177
177
  mkpath target.to_s
178
178
  return false if copy_map.empty?
179
179
 
@@ -196,30 +196,71 @@ module Buildr
196
196
  true
197
197
  end
198
198
 
199
- # Returns the target directory.
199
+ # Returns the target directory.
200
200
  def to_s
201
- @target.to_s
201
+ target.to_s
202
+ end
203
+
204
+ protected
205
+
206
+ # :call-seq:
207
+ # pattern_match(file, pattern) => boolean
208
+ #
209
+ # This method returns true if the file name matches the pattern.
210
+ # The pattern may be a String, a Regexp or a Proc.
211
+ #
212
+ def pattern_match(file, pattern)
213
+ case
214
+ when pattern.is_a?(Regexp)
215
+ return file.match(pattern)
216
+ when pattern.is_a?(String)
217
+ return File.fnmatch(pattern, file)
218
+ when pattern.is_a?(Proc)
219
+ return pattern.call(file)
220
+ when pattern.is_a?(Rake::FileTask)
221
+ return pattern.to_s.match(file)
222
+ else
223
+ raise "Cannot interpret pattern #{pattern}"
224
+ end
225
+ end
226
+
227
+ private
228
+ def copy_map
229
+ sources.each { |source| raise "Source directory #{source} doesn't exist" unless File.exist?(source.to_s) }
230
+ raise 'No target directory specified, where am I going to copy the files to?' if target.nil?
231
+
232
+ sources.flatten.map(&:to_s).inject({}) do |map, source|
233
+ files = Util.recursive_with_dot_files(source).
234
+ map { |file| Util.relative_path(file, source) }.
235
+ select { |file| @include.empty? || @include.any? { |pattern| pattern_match(file, pattern) } }.
236
+ reject { |file| @exclude.any? { |pattern| pattern_match(file, pattern) } }
237
+ files.each do |file|
238
+ src, dest = File.expand_path(file, source), File.expand_path(file, target.to_s)
239
+ map[file] = src if !File.exist?(dest) || File.stat(src).mtime >= File.stat(dest).mtime
240
+ end
241
+ map
242
+ end
202
243
  end
203
244
 
204
245
  # This class implements content replacement logic for Filter.
205
246
  #
206
- # To register a new template engine @:foo@, extend this class with a method like:
207
- #
247
+ # To register a new template engine @:foo@, extend this class with a method like:
248
+ #
208
249
  # def foo_transform(content, path = nil)
209
250
  # # if this method yields a key, the value comes from the mapping hash
210
251
  # content.gsub(/world/) { |str| yield :bar }
211
252
  # end
212
253
  #
213
254
  # Then you can use :foo mapping type on a Filter
214
- #
255
+ #
215
256
  # filter.using :foo, :bar => :baz
216
257
  #
217
258
  # Or all by your own, simply
218
259
  #
219
260
  # Mapper.new(:foo, :bar => :baz).transform("Hello world") # => "Hello baz"
220
- #
261
+ #
221
262
  # You can handle configuration arguments by providing a @*_config@ method like:
222
- #
263
+ #
223
264
  # # The return value of this method is available with the :config accessor.
224
265
  # def moo_config(*args, &block)
225
266
  # raise ArgumentError, "Expected moo block" unless block_given?
@@ -235,7 +276,7 @@ module Buildr
235
276
  # end
236
277
  #
237
278
  # Usage for the @:moo@ mapper would be something like:
238
- #
279
+ #
239
280
  # mapper = Mapper.new(:moo, 'ooone', 'twoo') do |str|
240
281
  # i = nil; str.capitalize.gsub(/\w/) { |s| s.send( (i = !i) ? 'upcase' : 'downcase' ) }
241
282
  # end
@@ -247,7 +288,7 @@ module Buildr
247
288
  def initialize(*args, &block) #:nodoc:
248
289
  using(*args, &block)
249
290
  end
250
-
291
+
251
292
  def using(*args, &block)
252
293
  case args.first
253
294
  when Hash # Maven hash mapping
@@ -285,7 +326,8 @@ module Buildr
285
326
  @config = configurer.call(*args, &block)
286
327
  else
287
328
  raise ArgumentError, "Missing hash argument after :#{mapper_type}" unless args.size == 1 && Hash === args[0]
288
- @config = args.first
329
+ @config = {} unless Hash === @config
330
+ args.first.each_pair { |k, v| @config[k] = v.to_s }
289
331
  end
290
332
  @mapper_type = mapper_type
291
333
  end
@@ -293,15 +335,15 @@ module Buildr
293
335
  def maven_transform(content, path = nil)
294
336
  content.gsub(/\$\{.*?\}/) { |str| yield(str[2..-2]) || str }
295
337
  end
296
-
338
+
297
339
  def ant_transform(content, path = nil)
298
340
  content.gsub(/@.*?@/) { |str| yield(str[1..-2]) || str }
299
341
  end
300
-
342
+
301
343
  def ruby_transform(content, path = nil)
302
344
  content.gsub(/#\{.*?\}/) { |str| yield(str[2..-2]) || str }
303
345
  end
304
-
346
+
305
347
  def regexp_transform(content, path = nil)
306
348
  content.gsub(mapper_type) { |str| yield(str.scan(mapper_type).join) || str }
307
349
  end
@@ -309,7 +351,7 @@ module Buildr
309
351
  def callback_transform(content, path = nil)
310
352
  config.call(path, content)
311
353
  end
312
-
354
+
313
355
  def erb_transform(content, path = nil)
314
356
  case config
315
357
  when Binding