buildr 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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