buildr 1.5.3-x86-mswin32 → 1.5.4-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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +25 -1
  3. data/addon/buildr/bnd.rb +8 -2
  4. data/addon/buildr/findbugs.rb +2 -2
  5. data/addon/buildr/gpg.rb +7 -1
  6. data/addon/buildr/gwt.rb +41 -1
  7. data/addon/buildr/jacoco.rb +18 -18
  8. data/addon/buildr/jetty.rb +14 -5
  9. data/addon/buildr/jetty6.rb +243 -0
  10. data/addon/buildr/org/apache/buildr/Jetty6Wrapper$1.class +0 -0
  11. data/addon/buildr/org/apache/buildr/Jetty6Wrapper$BuildrHandler.class +0 -0
  12. data/addon/buildr/org/apache/buildr/Jetty6Wrapper.class +0 -0
  13. data/addon/buildr/org/apache/buildr/Jetty6Wrapper.java +144 -0
  14. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  15. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  16. data/addon/buildr/org/apache/buildr/JettyWrapper.java +13 -13
  17. data/buildr.buildfile +7 -1
  18. data/doc/contributing.textile +0 -19
  19. data/doc/download.textile +18 -6
  20. data/doc/index.textile +20 -12
  21. data/doc/languages.textile +23 -1
  22. data/doc/packaging.textile +21 -0
  23. data/lib/buildr/ide/idea.rb +4 -2
  24. data/lib/buildr/java/commands.rb +1 -1
  25. data/lib/buildr/kotlin.rb +17 -0
  26. data/lib/buildr/kotlin/compiler.rb +282 -0
  27. data/lib/buildr/kotlin/org/apache/buildr/KotlinMessageCollector$1.class +0 -0
  28. data/lib/buildr/kotlin/org/apache/buildr/KotlinMessageCollector.class +0 -0
  29. data/lib/buildr/kotlin/org/apache/buildr/KotlinMessageCollector.java +46 -0
  30. data/lib/buildr/packaging/archive.rb +47 -11
  31. data/lib/buildr/packaging/package.rb +3 -2
  32. data/lib/buildr/packaging/tar.rb +51 -16
  33. data/lib/buildr/packaging/ziptask.rb +45 -17
  34. data/lib/buildr/version.rb +1 -1
  35. data/spec/addon/bnd_spec.rb +80 -20
  36. data/spec/kotlin/compiler_spec.rb +274 -0
  37. data/spec/packaging/archive_spec.rb +30 -0
  38. data/spec/sandbox.rb +1 -0
  39. metadata +13 -3
  40. data/lib/buildr/scala/org/apache/buildr/Specs2Runner.class +0 -0
@@ -0,0 +1,17 @@
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
+
17
+ require 'buildr/kotlin/compiler'
@@ -0,0 +1,282 @@
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
+ # The Kotlin Module
17
+ module Buildr::Kotlin
18
+ DEFAULT_VERSION = '1.1.3-2'
19
+
20
+ class << self
21
+
22
+ def installed_version
23
+ unless @installed_version
24
+ @installed_version = if Kotlinc.installed?
25
+ begin
26
+ # try to read the value from the build.txt file
27
+ version_str = File.read(File.expand_path('build.txt', Kotlinc.kotlin_home))
28
+
29
+ if version_str
30
+ md = version_str.match(/\d+\.\d[\d\.]*/) or
31
+ fail "Unable to parse Kotlin version: #{version_str}"
32
+
33
+ md[0].sub(/.$/, "") # remove trailing dot, if any
34
+ end
35
+ rescue => e
36
+ warn "Unable to parse library.properties in $KOTLIN_HOME/build.txt: #{e}"
37
+ nil
38
+ end
39
+ end
40
+ end
41
+
42
+ @installed_version
43
+ end
44
+
45
+ def version
46
+ Buildr.settings.build['kotlin.version'] || installed_version || DEFAULT_VERSION
47
+ end
48
+
49
+ # check if version matches any of the given prefixes
50
+ def version?(*v)
51
+ v.any? { |v| version.index(v.to_s) == 0 }
52
+ end
53
+
54
+ end
55
+
56
+ # Kotlin compiler:
57
+ # compile.using(:kotlin)
58
+ # Used by default if .kt files are found in the src/main/kotlin directory (or src/test/kotlin)
59
+ # and sets the target directory to target/classes (or target/test/classes).
60
+ # Accepts the following options:
61
+ # * :warnings -- Issue warnings when compiling. True when running in verbose mode.
62
+ # * :debug -- Generates bytecode with debugging information. Set from the debug
63
+ # environment variable/global option.
64
+ # * :optimize -- Optimize the byte code generation. False by default.
65
+ # * :target -- Bytecode compatibility.
66
+ # * :noStdlib -- Include the Kotlin runtime. False by default.
67
+ # * :javac -- Arguments for javac compiler.
68
+ class Kotlinc < Buildr::Compiler::Base
69
+
70
+ class << self
71
+ def kotlin_home
72
+ env_home = ENV['KOTLIN_HOME']
73
+
74
+ @home ||= if !env_home.nil? && File.exists?(env_home + '/lib/kotlin-compiler.jar')
75
+ env_home
76
+ else
77
+ nil
78
+ end
79
+ end
80
+
81
+ def installed?
82
+ !kotlin_home.nil?
83
+ end
84
+
85
+ def use_installed?
86
+ if installed? && Buildr.settings.build['kotlin.version']
87
+ Buildr.settings.build['kotlin.version'] == Kotlin.installed_version
88
+ else
89
+ Buildr.settings.build['kotlin.version'].nil? && installed?
90
+ end
91
+ end
92
+
93
+ def dependencies
94
+ kotlin_dependencies = if use_installed?
95
+ %w(kotlin-stdlib kotlin-compiler).map { |s| File.expand_path("lib/#{s}.jar", kotlin_home) }
96
+ else
97
+ REQUIRES.artifacts.map(&:to_s)
98
+ end
99
+ # Add Java utilities (eg KotlinMessageCollector)
100
+ kotlin_dependencies |= [ File.join(File.dirname(__FILE__)) ]
101
+ (kotlin_dependencies).compact
102
+ end
103
+
104
+ def applies_to?(project, task) #:nodoc:
105
+ paths = task.sources + [sources].flatten.map { |src| Array(project.path_to(:source, task.usage, src.to_sym)) }
106
+ paths.flatten!
107
+
108
+ # Just select if we find .kt files
109
+ paths.any? { |path| !Dir["#{path}/**/*.kt"].empty? }
110
+ end
111
+ end
112
+
113
+ # The kotlin compiler jars are added to classpath at load time,
114
+ # if you want to customize artifact versions, you must set them on the
115
+ #
116
+ # artifact_ns['Buildr::Compiler::Kotlinc'].library = '1.1.3-2'
117
+ #
118
+ # namespace before this file is required. This is of course, only
119
+ # if KOTLIN_HOME is not set or invalid.
120
+ REQUIRES = ArtifactNamespace.for(self) do |ns|
121
+ version = Buildr.settings.build['kotlin.version'] || DEFAULT_VERSION
122
+ ns.compiler! 'org.jetbrains.kotlin:kotlin-compiler:jar:>=' + version
123
+ end
124
+
125
+ Javac = Buildr::Compiler::Javac
126
+
127
+ OPTIONS = [:warnings, :optimize, :target, :debug, :noStdlib, :javac]
128
+
129
+ # Lazy evaluation to allow change in buildfile
130
+ Java.classpath << lambda { dependencies }
131
+
132
+ specify :language=>:kotlin, :sources => [:kotlin, :java], :source_ext => [:kt, :java],
133
+ :target=>'classes', :target_ext=>'class', :packaging=>:jar
134
+
135
+ def initialize(project, options) #:nodoc:
136
+ super
137
+ # use common options also for javac
138
+
139
+ options[:javac] ||= Buildr::Compiler::Javac::OPTIONS.inject({}) do |hash, option|
140
+ hash[option] = options[option]
141
+ hash
142
+ end
143
+
144
+ options[:debug] = Buildr.options.debug || trace?(:kotlinc) if options[:debug].nil?
145
+ options[:warnings] = verbose if options[:warnings].nil?
146
+ options[:optimize] = false if options[:optimize].nil?
147
+ options[:noStdlib] = true if options[:noStdlib].nil?
148
+ @java = Javac.new(project, options[:javac])
149
+ end
150
+
151
+
152
+
153
+ def compile(sources, target, dependencies) #:nodoc:
154
+ check_options(options, OPTIONS)
155
+
156
+ java_sources = java_sources(sources)
157
+
158
+ unless Buildr.application.options.dryrun
159
+ messageCollector = Java.org.apache.buildr.KotlinMessageCollector.new
160
+
161
+ Java.load
162
+ begin
163
+ compiler = Java.org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.new
164
+ compilerArguments = kotlinc_args
165
+ compilerArguments.destination = File.expand_path(target)
166
+ compilerArguments.classpath = dependencies.join(File::PATH_SEPARATOR)
167
+ sources.each do |source|
168
+ compilerArguments.freeArgs.add(File.expand_path(source))
169
+ end
170
+ services = Buildr::Util.java_platform? ? Java.org.jetbrains.kotlin.config.Services::EMPTY : Java.org.jetbrains.kotlin.config.Services.EMPTY
171
+ compiler.exec(messageCollector, services, compilerArguments)
172
+ rescue => e
173
+ fail "Kotlin compiler crashed:\n#{e.inspect}"
174
+ end
175
+
176
+ unless java_sources.empty?
177
+ trace 'Compiling mixed Java/Kotlin sources'
178
+
179
+ deps = dependencies + Kotlinc.dependencies + [ File.expand_path(target) ]
180
+ @java.compile(java_sources, target, deps)
181
+ end
182
+ end
183
+ end
184
+
185
+ protected
186
+
187
+ # :nodoc: see Compiler:Base
188
+ def compile_map(sources, target)
189
+ target_ext = self.class.target_ext
190
+ ext_glob = Array(self.class.source_ext).join(',')
191
+ sources.flatten.map{|f| File.expand_path(f)}.inject({}) do |map, source|
192
+ sources = if File.directory?(source)
193
+ FileList["#{source}/**/*.{#{ext_glob}}"].reject { |file| File.directory?(file) }
194
+ else
195
+ [source]
196
+ end
197
+
198
+ sources.each do |source|
199
+ # try to extract package name from .java or .kt files
200
+ if %w(.java .kt).include? File.extname(source)
201
+ name = File.basename(source).split(".")[0]
202
+ package = findFirst(source, /^\s*package\s+([^\s;]+)\s*;?\s*/)
203
+ packages = count(source, /^\s*package\s+([^\s;]+)\s*;?\s*/)
204
+ found = findFirst(source, /((class)|(object))\s+(#{name})Kt/)
205
+
206
+ # if there's only one package statement and we know the target name, then we can depend
207
+ # directly on a specific file, otherwise, we depend on the general target
208
+ if (found && packages == 1)
209
+ map[source] = package ? File.join(target, package[1].gsub('.', '/'), name.ext(target_ext)) : target
210
+ else
211
+ map[source] = target
212
+ end
213
+
214
+ elsif
215
+ map[source] = target
216
+ end
217
+ end
218
+
219
+ map.each do |key,value|
220
+ map[key] = first_file unless map[key]
221
+ end
222
+
223
+ map
224
+ end
225
+ end
226
+
227
+ private
228
+
229
+ def count(file, pattern)
230
+ count = 0
231
+ File.open(file, 'r') do |infile|
232
+ while (line = infile.gets)
233
+ count += 1 if line.match(pattern)
234
+ end
235
+ end
236
+ count
237
+ end
238
+
239
+ def java_sources(sources)
240
+ sources.flatten.map { |source| File.directory?(source) ? FileList["#{source}/**/*.java"] : source } .
241
+ flatten.reject { |file| File.directory?(file) || File.extname(file) != '.java' }.map { |file| File.expand_path(file) }.uniq
242
+ end
243
+
244
+ # Returns Kotlinc arguments from the set of options.
245
+ def kotlinc_args #:nodoc:
246
+ compilerArguments = Java.org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments.new
247
+ compilerArguments.verbose = options[:debug]
248
+ compilerArguments.suppressWarnings = !options[:warnings]
249
+ compilerArguments.noStdlib = options[:noStdlib]
250
+ compilerArguments.noOptimize = !options[:optimize]
251
+ compilerArguments.reportOutputFiles = compilerArguments.verbose
252
+ compilerArguments.jvmTarget = options[:target] unless options[:target].nil?
253
+ compilerArguments
254
+ end
255
+ end
256
+
257
+ module ProjectExtension
258
+ def kotlinc_options
259
+ @kotlinc ||= KotlincOptions.new(self)
260
+ end
261
+ end
262
+
263
+ class KotlincOptions
264
+ attr_writer :incremental
265
+
266
+ def initialize(project)
267
+ @project = project
268
+ end
269
+
270
+ def incremental
271
+ @incremental || (@project.parent ? @project.parent.kotlinc_options.incremental : nil)
272
+ end
273
+ end
274
+ end
275
+
276
+ # Kotlin compiler comes first, ahead of Javac, this allows it to pick
277
+ # projects that mix Kotlin and Java code by spotting Kotlin code first.
278
+ Buildr::Compiler.compilers.unshift Buildr::Kotlin::Kotlinc
279
+
280
+ class Buildr::Project #:nodoc:
281
+ include Buildr::Kotlin::ProjectExtension
282
+ end
@@ -0,0 +1,46 @@
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
14
+ * under the License.
15
+ */
16
+
17
+
18
+ package org.apache.buildr;
19
+
20
+ import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
21
+ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity;
22
+ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation;
23
+
24
+
25
+ public class KotlinMessageCollector implements MessageCollector {
26
+
27
+ public void report(CompilerMessageSeverity severity, String message, CompilerMessageLocation location) {
28
+ switch(severity) {
29
+ case ERROR:
30
+ case EXCEPTION:
31
+ System.err.println((location != null ? (location.toString() + " ") : "") + message);
32
+ break;
33
+ default:
34
+ System.out.println((location != null ? (location.toString() + " ") : "") + message);
35
+ break;
36
+ }
37
+ }
38
+
39
+ public boolean hasErrors() {
40
+ return false;
41
+ }
42
+
43
+ public void clear() {
44
+ // not implemented
45
+ }
46
+ }
@@ -112,9 +112,9 @@ module Buildr #:nodoc:
112
112
  expanders = files.collect do |file|
113
113
  @sources << proc { file.to_s }
114
114
  expander = ZipExpander.new(file)
115
- @actions << proc do |file_map|
115
+ @actions << proc do |file_map, transform_map|
116
116
  file.invoke() if file.is_a?(Rake::Task)
117
- expander.expand(file_map, path)
117
+ expander.expand(file_map, transform_map, path)
118
118
  end
119
119
  expander
120
120
  end
@@ -133,8 +133,8 @@ module Buildr #:nodoc:
133
133
  @sources.map{ |source| source.call }.flatten
134
134
  end
135
135
 
136
- def add_files(file_map) #:nodoc:
137
- @actions.each { |action| action.call(file_map) }
136
+ def add_files(file_map, transform_map) #:nodoc:
137
+ @actions.each { |action| action.call(file_map, transform_map) }
138
138
  end
139
139
 
140
140
  # :call-seq:
@@ -267,6 +267,16 @@ module Buildr #:nodoc:
267
267
  @expanders.each { |expander| expander.exclude(*files) }
268
268
  self
269
269
  end
270
+
271
+ def concatenate(*files)
272
+ @expanders.each { |expander| expander.concatenate(*files) }
273
+ self
274
+ end
275
+
276
+ def transform(*files, &block)
277
+ @expanders.each { |expander| expander.transform(*files, &block) }
278
+ self
279
+ end
270
280
  end
271
281
 
272
282
 
@@ -277,6 +287,8 @@ module Buildr #:nodoc:
277
287
  @zip_file = zip_file.to_s
278
288
  @includes = []
279
289
  @excludes = []
290
+ @concatenates = []
291
+ @transforms = {}
280
292
  end
281
293
 
282
294
  def include(*files)
@@ -289,8 +301,18 @@ module Buildr #:nodoc:
289
301
  @excludes |= files
290
302
  self
291
303
  end
304
+
305
+ def concatenate(*files)
306
+ @concatenates |= files
307
+ self
308
+ end
309
+
310
+ def transform(*files, &block)
311
+ @transforms[[files].flatten] = block
312
+ self
313
+ end
292
314
 
293
- def expand(file_map, path)
315
+ def expand(file_map, transform_map, path)
294
316
  @includes = ['*'] if @includes.empty?
295
317
  Zip::File.open(@zip_file) do |source|
296
318
  source.entries.reject { |entry| entry.directory? }.each do |entry|
@@ -298,7 +320,19 @@ module Buildr #:nodoc:
298
320
  !@excludes.any? { |pattern| File.fnmatch(pattern, entry.name) }
299
321
  dest = path =~ /^\/?$/ ? entry.name : Util.relative_path(path + "/" + entry.name)
300
322
  trace "Adding #{dest}"
301
- file_map[dest] = ZipEntryData.new(source, entry)
323
+ if @concatenates.any? { |pattern| File.fnmatch(pattern, entry.name) }
324
+ file_map[dest] << ZipEntryData.new(source, entry)
325
+ elsif @transforms.each_pair.detect do |transform, transform_block|\
326
+ if transform.any? { |pattern| File.fnmatch(pattern, entry.name) }
327
+ file_map[dest] << ZipEntryData.new(source, entry)
328
+
329
+ transform_map[dest] = transform_block
330
+ true
331
+ end
332
+ end
333
+ else
334
+ file_map[dest] = ZipEntryData.new(source, entry)
335
+ end
302
336
  end
303
337
  end
304
338
  end
@@ -327,7 +361,8 @@ module Buildr #:nodoc:
327
361
 
328
362
  # Make sure we're the last enhancements, so other enhancements can add content.
329
363
  enhance do
330
- @file_map = {}
364
+ @file_map = Hash.new {|h,k| h[k]=[]}
365
+ @transform_map = {}
331
366
  enhance do
332
367
  send 'create' if respond_to?(:create)
333
368
  # We're here because the archive file does not exist, or one of the files is newer than the archive contents;
@@ -338,9 +373,9 @@ module Buildr #:nodoc:
338
373
  begin
339
374
  @paths.each do |name, object|
340
375
  @file_map[name] = nil unless name.empty?
341
- object.add_files(@file_map)
376
+ object.add_files(@file_map, @transform_map)
342
377
  end
343
- create_from @file_map
378
+ create_from @file_map, @transform_map
344
379
  rescue
345
380
  rm name rescue nil
346
381
  raise
@@ -485,9 +520,10 @@ module Buildr #:nodoc:
485
520
  @prepares.each { |prepare| prepare.call(self) }
486
521
  @prepares.clear
487
522
 
488
- file_map = {}
523
+ file_map = Hash.new {|h,k| h[k]=[]}
524
+ transform_map = {}
489
525
  @paths.each do |name, path|
490
- path.add_files(file_map)
526
+ path.add_files(file_map, transform_map)
491
527
  end
492
528
 
493
529
  # filter out Procs (dynamic content), nils and others