buildr 1.3.0-java → 1.3.1-java

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.
@@ -403,7 +403,7 @@ module Buildr
403
403
  @filter = Buildr::Filter.new
404
404
  @filter.using Buildr.settings.profile['filter'] if Hash === Buildr.settings.profile['filter']
405
405
  enhance do
406
- filter.run if target && !sources.empty?
406
+ filter.run if target
407
407
  end
408
408
  end
409
409
 
@@ -83,7 +83,7 @@ module Buildr
83
83
  # For example:
84
84
  # filter.from('src').into('target').using('build'=>Time.now)
85
85
  def into(dir)
86
- @target = file(File.expand_path(dir.to_s)) { |task| run if target == task && !sources.empty? }
86
+ @target = file(File.expand_path(dir.to_s)) { |task| run if target == task }
87
87
  self
88
88
  end
89
89
 
@@ -160,7 +160,6 @@ module Buildr
160
160
  #
161
161
  # Runs the filter.
162
162
  def run
163
- raise 'No source directory specified, where am I going to find the files to filter?' if sources.empty?
164
163
  sources.each { |source| raise "Source directory #{source} doesn't exist" unless File.exist?(source.to_s) }
165
164
  raise 'No target directory specified, where am I going to copy the files to?' if target.nil?
166
165
 
@@ -176,10 +175,10 @@ module Buildr
176
175
  map
177
176
  end
178
177
 
178
+ mkpath target.to_s
179
179
  return false if copy_map.empty?
180
180
 
181
181
  verbose(Buildr.application.options.trace || false) do
182
- mkpath target.to_s
183
182
  copy_map.each do |path, source|
184
183
  dest = File.expand_path(path, target.to_s)
185
184
  if File.directory?(source)
@@ -198,7 +197,7 @@ module Buildr
198
197
  mapped = regexp_mapper(content) { |key| mapping[key] }
199
198
  end
200
199
  #gsub(/\$\{[^}]*\}/) { |str| mapping[str[2..-2]] || str }
201
- File.open(dest, 'wb') { |file| file.write mapped }
200
+ File.open(dest, 'wb') { |file| file.write mapped }
202
201
  when nil # No mapping.
203
202
  cp source, dest
204
203
  File.chmod(0664, dest)
@@ -207,7 +206,7 @@ module Buildr
207
206
  end
208
207
  end
209
208
  end
210
- touch target.to_s
209
+ touch target.to_s
211
210
  end
212
211
  true
213
212
  end
@@ -20,9 +20,9 @@ require 'net/https'
20
20
  require 'net/ssh'
21
21
  require 'net/sftp'
22
22
  require 'uri'
23
- require 'uri/sftp'
24
23
  require 'digest/md5'
25
24
  require 'digest/sha1'
25
+ require 'stringio'
26
26
  require 'tempfile'
27
27
  require 'buildr/core/progressbar'
28
28
 
@@ -259,17 +259,17 @@ module URI
259
259
  # The block is yielded with a progress object that implements a single method.
260
260
  # Call << for each block of bytes down/uploaded.
261
261
  def with_progress_bar(show, file_name, size, &block) #:nodoc:
262
- options = { :total=>size, :title=>file_name }
262
+ options = { :total=>size || 0, :title=>file_name }
263
263
  options[:hidden] = true unless show
264
264
  ProgressBar.start options, &block
265
265
  end
266
266
 
267
267
  # :call-seq:
268
- # proxy_uri() => URI?
268
+ # proxy_uri => URI?
269
269
  #
270
270
  # Returns the proxy server to use. Obtains the proxy from the relevant environment variable (e.g. HTTP_PROXY).
271
271
  # Supports exclusions based on host name and port number from environment variable NO_PROXY.
272
- def proxy_uri()
272
+ def proxy_uri
273
273
  proxy = ENV["#{scheme.upcase}_PROXY"]
274
274
  proxy = URI.parse(proxy) if String === proxy
275
275
  excludes = ENV['NO_PROXY'].to_s.split(/\s*,\s*/).compact
@@ -289,60 +289,106 @@ module URI
289
289
  # See URI::Generic#read
290
290
  def read(options = nil, &block)
291
291
  options ||= {}
292
- headers = { 'If-Modified-Since' => CGI.rfc1123_date(options[:modified].utc) } if options[:modified]
293
-
294
- if proxy = proxy_uri
295
- proxy = URI.parse(proxy) if String === proxy
296
- http = Net::HTTP.new(host, port, proxy.host, proxy.port, proxy.user, proxy.password)
297
- else
298
- http = Net::HTTP.new(host, port)
292
+ connect do |http|
293
+ puts "Requesting #{self}" if Buildr.application.options.trace
294
+ headers = { 'If-Modified-Since' => CGI.rfc1123_date(options[:modified].utc) } if options[:modified]
295
+ request = Net::HTTP::Get.new(request_uri.empty? ? '/' : request_uri, headers)
296
+ request.basic_auth self.user, self.password if self.user
297
+ http.request request do |response|
298
+ case response
299
+ when Net::HTTPNotModified
300
+ # No modification, nothing to do.
301
+ puts 'Not modified since last download' if Buildr.application.options.trace
302
+ return nil
303
+ when Net::HTTPRedirection
304
+ # Try to download from the new URI, handle relative redirects.
305
+ puts "Redirected to #{response['Location']}" if Buildr.application.options.trace
306
+ return (self + URI.parse(response['location'])).read(options, &block)
307
+ when Net::HTTPOK
308
+ puts "Downloading #{self}" if verbose
309
+ result = nil
310
+ with_progress_bar options[:progress], path.split('/').last, response.content_length do |progress|
311
+ if block
312
+ response.read_body do |chunk|
313
+ block.call chunk
314
+ progress << chunk
315
+ end
316
+ else
317
+ result = ''
318
+ response.read_body do |chunk|
319
+ result << chunk
320
+ progress << chunk
321
+ end
322
+ end
323
+ end
324
+ return result
325
+ when Net::HTTPNotFound
326
+ raise NotFoundError, "Looking for #{self} and all I got was a 404!"
327
+ else
328
+ raise RuntimeError, "Failed to download #{self}: #{response.message}"
329
+ end
330
+ end
299
331
  end
300
- http.use_ssl = true if self.instance_of? URI::HTTPS
332
+ end
333
+
334
+ private
335
+
336
+ def write_internal(options, &block) #:nodoc:
337
+ options ||= {}
338
+ connect do |http|
339
+ puts "Uploading to #{path}" if Buildr.application.options.trace
340
+ content = StringIO.new
341
+ while chunk = yield(32 * 4096)
342
+ content << chunk
343
+ end
344
+ headers = { 'Content-MD5'=>Digest::MD5.hexdigest(content.string) }
345
+ request = Net::HTTP::Put.new(request_uri.empty? ? '/' : request_uri, headers)
346
+ request.basic_auth self.user, self.password if self.user
347
+ response = nil
348
+ with_progress_bar options[:progress], path.split('/').last, content.size do |progress|
349
+ request.content_length = content.size
350
+ content.rewind
351
+ stream = Object.new
352
+ class << stream ; self ;end.send :define_method, :read do |count|
353
+ bytes = content.read(count)
354
+ progress << bytes if bytes
355
+ bytes
356
+ end
357
+ request.body_stream = stream
358
+ response = http.request(request)
359
+ end
301
360
 
302
- puts "Requesting #{self}" if Buildr.application.options.trace
303
- request = Net::HTTP::Get.new(path.empty? ? '/' : path, headers)
304
- request.basic_auth self.user, self.password if self.user
305
- http.request request do |response|
306
361
  case response
307
- #case response = http.request(request)
308
- when Net::HTTPNotModified
309
- # No modification, nothing to do.
310
- puts 'Not modified since last download' if Buildr.application.options.trace
311
- return nil
312
362
  when Net::HTTPRedirection
313
363
  # Try to download from the new URI, handle relative redirects.
314
364
  puts "Redirected to #{response['Location']}" if Buildr.application.options.trace
315
- return (self + URI.parse(response['location'])).read(options, &block)
316
- when Net::HTTPOK
317
- puts "Downloading #{self}" if verbose
318
- result = nil
319
- with_progress_bar options[:progress], path.split('/').last, response.content_length do |progress|
320
- if block
321
- response.read_body do |chunk|
322
- block.call chunk
323
- progress << chunk
324
- end
325
- else
326
- result = ''
327
- response.read_body do |chunk|
328
- result << chunk
329
- progress << chunk
330
- end
331
- end
332
- end
333
- return result
334
- when Net::HTTPNotFound
335
- raise NotFoundError, "Looking for #{self} and all I got was a 404!"
365
+ content.rewind
366
+ return (self + URI.parse(response['location'])).write_internal(options) { |bytes| content.read(bytes) }
367
+ when Net::HTTPSuccess
336
368
  else
337
- raise RuntimeError, "Failed to download #{self}: #{response.message}"
369
+ raise RuntimeError, "Failed to upload #{self}: #{response.message}"
338
370
  end
339
371
  end
340
372
  end
341
373
 
374
+ def connect
375
+ if proxy = proxy_uri
376
+ proxy = URI.parse(proxy) if String === proxy
377
+ http = Net::HTTP.new(host, port, proxy.host, proxy.port, proxy.user, proxy.password)
378
+ else
379
+ http = Net::HTTP.new(host, port)
380
+ end
381
+ http.use_ssl = true if self.instance_of? URI::HTTPS
382
+ yield http
383
+ end
384
+
342
385
  end
343
386
 
344
387
 
345
- class SFTP #:nodoc:
388
+ class SFTP < Generic #:nodoc:
389
+
390
+ DEFAULT_PORT = 22
391
+ COMPONENT = [ :scheme, :userinfo, :host, :port, :path ].freeze
346
392
 
347
393
  class << self
348
394
  # Caching of passwords, so we only need to ask once.
@@ -351,16 +397,40 @@ module URI
351
397
  end
352
398
  end
353
399
 
354
- protected
400
+ def initialize(*arg)
401
+ super
402
+ end
355
403
 
356
- def write_internal(options, &block) #:nodoc:
404
+ def read(options = {}, &block)
357
405
  # SSH options are based on the username/password from the URI.
358
- ssh_options = { :port=>port, :username=>user, :password=>password }.merge(options[:ssh_options] || {})
406
+ ssh_options = { :port=>port, :password=>password }.merge(options[:ssh_options] || {})
359
407
  ssh_options[:password] ||= SFTP.passwords[host]
360
408
  begin
361
409
  puts "Connecting to #{host}" if Buildr.application.options.trace
362
- session = Net::SSH.start(host, ssh_options)
363
- SFTP.passwords[host] = ssh_options[:password]
410
+ result = nil
411
+ Net::SFTP.start(host, user, ssh_options) do |sftp|
412
+ SFTP.passwords[host] = ssh_options[:password]
413
+ puts 'connected' if Buildr.application.options.trace
414
+
415
+ with_progress_bar options[:progress] && options[:size], path.split('/'), options[:size] || 0 do |progress|
416
+ puts "Downloading to #{path}" if Buildr.application.options.trace
417
+ sftp.file.open(path, 'r') do |file|
418
+ if block
419
+ while chunk = file.read(32 * 4096)
420
+ block.call chunk
421
+ progress << chunk
422
+ end
423
+ else
424
+ result = ''
425
+ while chunk = file.read(32 * 4096)
426
+ result << chunk
427
+ progress << chunk
428
+ end
429
+ end
430
+ end
431
+ end
432
+ end
433
+ return result
364
434
  rescue Net::SSH::AuthenticationFailed=>ex
365
435
  # Only if running with console, prompt for password.
366
436
  if !ssh_options[:password] && $stdout.isatty
@@ -370,39 +440,55 @@ module URI
370
440
  end
371
441
  raise
372
442
  end
443
+ end
373
444
 
374
- session.sftp.connect do |sftp|
375
- puts 'connected' if Buildr.application.options.trace
445
+ protected
376
446
 
377
- # To create a path, we need to create all its parent. We use realpath to determine if
378
- # the path already exists, otherwise mkdir fails.
379
- puts "Creating path #{path}" if Buildr.application.options.trace
380
- File.dirname(path).split('/').inject('') do |base, part|
381
- combined = base + part
382
- sftp.realpath combined rescue sftp.mkdir combined, {}
383
- "#{combined}/"
384
- end
447
+ def write_internal(options, &block) #:nodoc:
448
+ # SSH options are based on the username/password from the URI.
449
+ ssh_options = { :port=>port, :password=>password }.merge(options[:ssh_options] || {})
450
+ ssh_options[:password] ||= SFTP.passwords[host]
451
+ begin
452
+ puts "Connecting to #{host}" if Buildr.application.options.trace
453
+ Net::SFTP.start(host, user, ssh_options) do |sftp|
454
+ SFTP.passwords[host] = ssh_options[:password]
455
+ puts 'connected' if Buildr.application.options.trace
456
+
457
+ # To create a path, we need to create all its parent. We use realpath to determine if
458
+ # the path already exists, otherwise mkdir fails.
459
+ puts "Creating path #{path}" if Buildr.application.options.trace
460
+ File.dirname(path).split('/').inject('') do |base, part|
461
+ combined = base + part
462
+ sftp.realpath combined rescue sftp.mkdir combined, {}
463
+ "#{combined}/"
464
+ end
385
465
 
386
- with_progress_bar options[:progress] && options[:size], path.split('/'), options[:size] || 0 do |progress|
387
- puts "Uploading to #{path}" if Buildr.application.options.trace
388
- sftp.open_handle(path, 'w') do |handle|
389
- # Writing in chunks gives us the benefit of a progress bar,
390
- # but also require that we maintain a position in the file,
391
- # since write() with two arguments always writes at position 0.
392
- pos = 0
393
- while chunk = yield(32 * 4096)
394
- sftp.write(handle, chunk, pos)
395
- pos += chunk.size
396
- progress << chunk
466
+ with_progress_bar options[:progress] && options[:size], path.split('/'), options[:size] || 0 do |progress|
467
+ puts "Uploading to #{path}" if Buildr.application.options.trace
468
+ sftp.file.open(path, 'w') do |file|
469
+ while chunk = yield(32 * 4096)
470
+ file.write chunk
471
+ progress << chunk
472
+ end
473
+ sftp.setstat(path, :permissions => options[:permissions]) if options[:permissions]
397
474
  end
398
- sftp.setstat(path, :permissions => options[:permissions]) if options[:permissions]
399
475
  end
400
476
  end
477
+ rescue Net::SSH::AuthenticationFailed=>ex
478
+ # Only if running with console, prompt for password.
479
+ if !ssh_options[:password] && $stdout.isatty
480
+ password = ask("Password for #{host}:") { |q| q.echo = '*' }
481
+ ssh_options[:password] = password
482
+ retry
483
+ end
484
+ raise
401
485
  end
402
486
  end
403
487
 
404
488
  end
405
489
 
490
+ @@schemes['SFTP'] = SFTP
491
+
406
492
 
407
493
  # File URL. Keep in mind that file URLs take the form of <code>file://host/path</code>, although the host
408
494
  # is not used, so typically all you will see are three backslashes. This methods accept common variants,
@@ -448,14 +534,14 @@ module URI
448
534
  end
449
535
  end
450
536
 
451
- def to_s()
537
+ def to_s
452
538
  "file://#{host}#{path}"
453
539
  end
454
540
 
455
541
  # The URL path always starts with a backslash. On most operating systems (Linux, Darwin, BSD) it points
456
542
  # to the absolute path on the file system. But on Windows, it comes before the drive letter, creating an
457
543
  # unusable path, so real_path fixes that. Ugly but necessary hack.
458
- def real_path() #:nodoc:
544
+ def real_path #:nodoc:
459
545
  RUBY_PLATFORM =~ /win32/ && path =~ /^\/[a-zA-Z]:\// ? path[1..-1] : path
460
546
  end
461
547
 
@@ -14,7 +14,7 @@
14
14
  # the License.
15
15
 
16
16
 
17
- ENV['JAVA_HOME'] = '/System/Library/Frameworks/JavaVM.framework/Home' if Config::CONFIG['host_os'] =~ /darwin/i
17
+ ENV['JAVA_HOME'] ||= '/System/Library/Frameworks/JavaVM.framework/Home' if Config::CONFIG['host_os'] =~ /darwin/i
18
18
  require PLATFORM == 'java' ? 'buildr/java/jruby' : 'buildr/java/rjb'
19
19
 
20
20
 
@@ -49,7 +49,7 @@ module Buildr
49
49
  project.task('test:resources').tap do |res|
50
50
  res.send :associate_with, project, bdd_dir
51
51
  res.filter.clear
52
- project.path_to(:source, bdd_dir, :resources).tap { |dir| resources.from dir if File.exist?(dir) }
52
+ project.path_to(:source, bdd_dir, :resources).tap { |dir| res.from dir if File.exist?(dir) }
53
53
  end
54
54
  super
55
55
  end
@@ -59,7 +59,10 @@ module Buildr
59
59
  include TestFramework::JavaBDD
60
60
  self.lang = :ruby
61
61
 
62
- REQUIRES = ['org.jruby:jruby-complete:jar:1.1']
62
+
63
+ REQUIRES = []
64
+ REQUIRES.unshift 'org.jruby:jruby-complete:jar:1.1.1' unless RUBY_PLATFORM =~ /java/
65
+
63
66
  TESTS_PATTERN = [ /_spec.rb$/ ]
64
67
  OPTIONS = [:properties, :java_args]
65
68
 
@@ -77,7 +80,9 @@ module Buildr
77
80
 
78
81
  def run(tests, dependencies) #:nodoc:
79
82
  cmd_options = task.options.only(:properties, :java_args)
83
+ dependencies.push *Dir.glob(File.join(jruby_home, "lib/*.jar")) if RUBY_PLATFORM =~ /java/
80
84
  cmd_options.update :classpath => dependencies, :project => task.project
85
+
81
86
  # TODO: Setting up JRuby is something to do before running Buildr.
82
87
  #install_gems(cmd_options)
83
88
 
@@ -86,7 +91,6 @@ module Buildr
86
91
  ENV['CI_REPORTS'] = report_dir
87
92
 
88
93
  jruby("-Ilib", "-S", "spec",
89
- #"--require", gem_path(task.project, "ci_reporter", "lib/ci/reporter/rake/rspec_loader"),
90
94
  "--require", "ci/reporter/rake/rspec_loader",
91
95
  "--format", "CI::Reporter::RSpecDoc", tests,
92
96
  cmd_options.merge({:name => "RSpec"}))
@@ -94,7 +98,7 @@ module Buildr
94
98
  end
95
99
 
96
100
  private
97
- def jruby_home(project)
101
+ def jruby_home
98
102
  @jruby_home ||= RUBY_PLATFORM =~ /java/ ? Config::CONFIG['prefix'] : File.expand_path(".jruby", ENV['HOME'])
99
103
  end
100
104
 
@@ -113,16 +117,10 @@ module Buildr
113
117
  java_args << {} unless Hash === args.last
114
118
  cmd_options = java_args.last
115
119
  project = cmd_options.delete(:project)
116
- if RUBY_PLATFORM =~ /java/
117
- # when run from within JRuby, use jars in launched-JRuby's classpath rather than the
118
- # stated dependency
119
- cmd_options[:classpath].delete_if {|e| File.basename(e) =~ /^jruby-complete-.*\.jar$/ }
120
- cmd_options[:classpath].unshift *(java.lang.System.getProperty("java.class.path").split(File::PATH_SEPARATOR))
121
- end
122
120
  cmd_options[:java_args] ||= []
123
121
  cmd_options[:java_args] << "-Xmx512m" unless cmd_options[:java_args].detect {|a| a =~ /^-Xmx/}
124
122
  cmd_options[:properties] ||= {}
125
- cmd_options[:properties]["jruby.home"] = jruby_home(project)
123
+ cmd_options[:properties]["jruby.home"] = jruby_home
126
124
  Java::Commands.java(*java_args)
127
125
  end
128
126
 
@@ -50,6 +50,7 @@ module Java
50
50
  puts "Running #{name}" if verbose
51
51
  block = lambda { |ok, res| fail "Failed to execute #{name}, see errors above" unless ok } unless block
52
52
  puts cmd_args.join(' ') if Buildr.application.options.trace
53
+ cmd_args = cmd_args.map(&:inspect).join(' ') if Util.win_os?
53
54
  system(*cmd_args).tap do |ok|
54
55
  block.call ok, $?
55
56
  end