buildr 1.2.10 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/CHANGELOG +566 -268
  2. data/DISCLAIMER +7 -1
  3. data/KEYS +151 -0
  4. data/NOTICE +23 -8
  5. data/README +122 -22
  6. data/Rakefile +49 -229
  7. data/{lib → addon}/buildr/antlr.rb +23 -10
  8. data/addon/buildr/cobertura.rb +232 -0
  9. data/{lib → addon}/buildr/hibernate.rb +20 -4
  10. data/{lib → addon}/buildr/javacc.rb +27 -12
  11. data/addon/buildr/jdepend.rb +60 -0
  12. data/{lib → addon}/buildr/jetty.rb +34 -18
  13. data/addon/buildr/nailgun.rb +892 -0
  14. data/{lib → addon}/buildr/openjpa.rb +23 -6
  15. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  16. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  17. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  18. data/{lib/buildr/jetty → addon/buildr/org/apache/buildr}/JettyWrapper.java +19 -0
  19. data/{lib → addon}/buildr/xmlbeans.rb +39 -14
  20. data/bin/buildr +21 -7
  21. data/buildr.gemspec +50 -0
  22. data/doc/css/default.css +225 -0
  23. data/doc/css/print.css +95 -0
  24. data/doc/css/syntax.css +43 -0
  25. data/doc/images/apache-incubator-logo.png +0 -0
  26. data/doc/images/buildr-hires.png +0 -0
  27. data/doc/images/buildr.png +0 -0
  28. data/doc/images/note.png +0 -0
  29. data/doc/images/tip.png +0 -0
  30. data/doc/images/zbuildr.tif +0 -0
  31. data/doc/pages/artifacts.textile +317 -0
  32. data/doc/pages/building.textile +501 -0
  33. data/doc/pages/contributing.textile +178 -0
  34. data/doc/pages/download.textile +25 -0
  35. data/doc/pages/extending.textile +229 -0
  36. data/doc/pages/getting_started.textile +337 -0
  37. data/doc/pages/index.textile +63 -0
  38. data/doc/pages/mailing_lists.textile +17 -0
  39. data/doc/pages/more_stuff.textile +367 -0
  40. data/doc/pages/packaging.textile +592 -0
  41. data/doc/pages/projects.textile +449 -0
  42. data/doc/pages/recipes.textile +127 -0
  43. data/doc/pages/settings_profiles.textile +339 -0
  44. data/doc/pages/testing.textile +475 -0
  45. data/doc/pages/troubleshooting.textile +121 -0
  46. data/doc/pages/whats_new.textile +389 -0
  47. data/doc/print.haml +52 -0
  48. data/doc/print.toc.yaml +28 -0
  49. data/doc/scripts/buildr-git.rb +411 -0
  50. data/doc/scripts/install-jruby.sh +44 -0
  51. data/doc/scripts/install-linux.sh +64 -0
  52. data/doc/scripts/install-osx.sh +52 -0
  53. data/doc/site.haml +55 -0
  54. data/doc/site.toc.yaml +44 -0
  55. data/lib/buildr.rb +28 -45
  56. data/lib/buildr/core.rb +27 -0
  57. data/lib/buildr/core/application.rb +373 -0
  58. data/lib/buildr/core/application_cli.rb +134 -0
  59. data/lib/{core → buildr/core}/build.rb +91 -77
  60. data/lib/{core → buildr/core}/checks.rb +116 -95
  61. data/lib/buildr/core/common.rb +155 -0
  62. data/lib/buildr/core/compile.rb +594 -0
  63. data/lib/buildr/core/environment.rb +120 -0
  64. data/lib/buildr/core/filter.rb +258 -0
  65. data/lib/{core → buildr/core}/generate.rb +22 -5
  66. data/lib/buildr/core/help.rb +118 -0
  67. data/lib/buildr/core/progressbar.rb +156 -0
  68. data/lib/{core → buildr/core}/project.rb +468 -213
  69. data/lib/buildr/core/test.rb +690 -0
  70. data/lib/{core → buildr/core}/transports.rb +107 -127
  71. data/lib/buildr/core/util.rb +235 -0
  72. data/lib/buildr/ide.rb +19 -0
  73. data/lib/{java → buildr/ide}/eclipse.rb +86 -60
  74. data/lib/{java → buildr/ide}/idea.ipr.template +16 -0
  75. data/lib/buildr/ide/idea.rb +194 -0
  76. data/lib/buildr/ide/idea7x.ipr.template +290 -0
  77. data/lib/buildr/ide/idea7x.rb +210 -0
  78. data/lib/buildr/java.rb +26 -0
  79. data/lib/buildr/java/ant.rb +71 -0
  80. data/lib/buildr/java/bdd_frameworks.rb +267 -0
  81. data/lib/buildr/java/commands.rb +210 -0
  82. data/lib/buildr/java/compilers.rb +432 -0
  83. data/lib/buildr/java/deprecated.rb +141 -0
  84. data/lib/buildr/java/groovyc.rb +137 -0
  85. data/lib/buildr/java/jruby.rb +99 -0
  86. data/lib/buildr/java/org/apache/buildr/BuildrNail$Main.class +0 -0
  87. data/lib/buildr/java/org/apache/buildr/BuildrNail.class +0 -0
  88. data/lib/buildr/java/org/apache/buildr/BuildrNail.java +41 -0
  89. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  90. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +116 -0
  91. data/lib/buildr/java/packaging.rb +706 -0
  92. data/lib/{java → buildr/java}/pom.rb +20 -4
  93. data/lib/buildr/java/rjb.rb +142 -0
  94. data/lib/buildr/java/test_frameworks.rb +290 -0
  95. data/lib/buildr/java/version_requirement.rb +172 -0
  96. data/lib/buildr/packaging.rb +21 -0
  97. data/lib/{java → buildr/packaging}/artifact.rb +170 -179
  98. data/lib/buildr/packaging/artifact_namespace.rb +957 -0
  99. data/lib/buildr/packaging/artifact_search.rb +140 -0
  100. data/lib/buildr/packaging/gems.rb +102 -0
  101. data/lib/buildr/packaging/package.rb +233 -0
  102. data/lib/{tasks → buildr/packaging}/tar.rb +18 -1
  103. data/lib/{tasks → buildr/packaging}/zip.rb +153 -105
  104. data/rakelib/apache.rake +126 -0
  105. data/rakelib/changelog.rake +56 -0
  106. data/rakelib/doc.rake +103 -0
  107. data/rakelib/package.rake +44 -0
  108. data/rakelib/release.rake +53 -0
  109. data/rakelib/rspec.rake +81 -0
  110. data/rakelib/rubyforge.rake +45 -0
  111. data/rakelib/scm.rake +49 -0
  112. data/rakelib/setup.rake +59 -0
  113. data/rakelib/stage.rake +45 -0
  114. data/spec/application_spec.rb +316 -0
  115. data/spec/archive_spec.rb +494 -0
  116. data/spec/artifact_namespace_spec.rb +635 -0
  117. data/spec/artifact_spec.rb +738 -0
  118. data/spec/build_spec.rb +193 -0
  119. data/spec/checks_spec.rb +537 -0
  120. data/spec/common_spec.rb +579 -0
  121. data/spec/compile_spec.rb +561 -0
  122. data/spec/groovy_compilers_spec.rb +239 -0
  123. data/spec/java_bdd_frameworks_spec.rb +238 -0
  124. data/spec/java_compilers_spec.rb +446 -0
  125. data/spec/java_packaging_spec.rb +1042 -0
  126. data/spec/java_test_frameworks_spec.rb +414 -0
  127. data/spec/packaging_helper.rb +63 -0
  128. data/spec/packaging_spec.rb +589 -0
  129. data/spec/project_spec.rb +739 -0
  130. data/spec/sandbox.rb +116 -0
  131. data/spec/scala_compilers_spec.rb +239 -0
  132. data/spec/spec.opts +6 -0
  133. data/spec/spec_helpers.rb +283 -0
  134. data/spec/test_spec.rb +871 -0
  135. data/spec/transport_spec.rb +300 -0
  136. data/spec/version_requirement_spec.rb +115 -0
  137. metadata +188 -77
  138. data/lib/buildr/cobertura.rb +0 -89
  139. data/lib/buildr/jdepend.rb +0 -40
  140. data/lib/buildr/jetty/JettyWrapper$1.class +0 -0
  141. data/lib/buildr/jetty/JettyWrapper$BuildrHandler.class +0 -0
  142. data/lib/buildr/jetty/JettyWrapper.class +0 -0
  143. data/lib/buildr/scala.rb +0 -368
  144. data/lib/core/application.rb +0 -188
  145. data/lib/core/common.rb +0 -562
  146. data/lib/core/help.rb +0 -72
  147. data/lib/core/rake_ext.rb +0 -81
  148. data/lib/java/ant.rb +0 -71
  149. data/lib/java/compile.rb +0 -589
  150. data/lib/java/idea.rb +0 -159
  151. data/lib/java/java.rb +0 -432
  152. data/lib/java/packaging.rb +0 -581
  153. data/lib/java/test.rb +0 -795
  154. data/lib/tasks/concat.rb +0 -35
@@ -1,15 +1,30 @@
1
- require "cgi"
2
- require "net/http"
3
- require "net/ssh"
4
- require "net/sftp"
5
- require "uri"
6
- require "uri/sftp"
7
- require "digest/md5"
8
- require "digest/sha1"
9
- require "facet/progressbar"
10
- require "highline"
11
- require "tempfile"
12
- require "uri/sftp"
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 'cgi'
18
+ require 'net/http'
19
+ require 'net/https'
20
+ require 'net/ssh'
21
+ require 'net/sftp'
22
+ require 'uri'
23
+ require 'uri/sftp'
24
+ require 'digest/md5'
25
+ require 'digest/sha1'
26
+ require 'tempfile'
27
+ require 'buildr/core/progressbar'
13
28
 
14
29
 
15
30
  # Monkeypatching: SFTP never defines the mkdir method on its session or the underlying
@@ -49,11 +64,11 @@ module URI
49
64
  # the second form yields to the block with each chunk of content (usually more than one).
50
65
  #
51
66
  # For example:
52
- # File.open "image.jpg", "w" do |file|
53
- # URI.read("http://example.com/image.jpg") { |chunk| file.write chunk }
67
+ # File.open 'image.jpg', 'w' do |file|
68
+ # URI.read('http://example.com/image.jpg') { |chunk| file.write chunk }
54
69
  # end
55
70
  # Shorter version:
56
- # File.open("image.jpg", "w") { |file| file.write URI.read("http://example.com/image.jpg") }
71
+ # File.open('image.jpg', 'w') { |file| file.write URI.read('http://example.com/image.jpg') }
57
72
  #
58
73
  # Supported options:
59
74
  # * :modified -- Only download if file modified since this timestamp. Returns nil if not modified.
@@ -86,11 +101,11 @@ module URI
86
101
  # block. Each yield should return up to the specified number of bytes, the last yield returns nil.
87
102
  #
88
103
  # For example:
89
- # File.open "killer-app.jar", "rb" do |file|
90
- # write("sftp://localhost/jars/killer-app.jar") { |chunk| file.read(chunk) }
104
+ # File.open 'killer-app.jar', 'rb' do |file|
105
+ # write('sftp://localhost/jars/killer-app.jar') { |chunk| file.read(chunk) }
91
106
  # end
92
107
  # Or:
93
- # write "sftp://localhost/jars/killer-app.jar", File.read("killer-app.jar")
108
+ # write 'sftp://localhost/jars/killer-app.jar', File.read('killer-app.jar')
94
109
  #
95
110
  # Supported options:
96
111
  # * :progress -- Show the progress bar while reading.
@@ -126,7 +141,7 @@ module URI
126
141
  #
127
142
  # For options, see URI::read.
128
143
  def read(options = nil, &block)
129
- fail "This protocol doesn't support reading (yet, how about helping by implementing it?)"
144
+ fail 'This protocol doesn\'t support reading (yet, how about helping by implementing it?)'
130
145
  end
131
146
 
132
147
  # :call-seq:
@@ -158,7 +173,7 @@ module URI
158
173
  read({:progress=>verbose}.merge(options || {}).merge(:modified=>target.mtime)) { |chunk| target.write chunk }
159
174
  target.flush
160
175
  else
161
- raise ArgumentError, "Expecting a target that is either a file name (string, task) or object that responds to write (file, pipe)." unless target.respond_to?(:write)
176
+ raise ArgumentError, 'Expecting a target that is either a file name (string, task) or object that responds to write (file, pipe).' unless target.respond_to?(:write)
162
177
  read({:progress=>verbose}.merge(options || {})) { |chunk| target.write chunk }
163
178
  target.flush
164
179
  end
@@ -177,7 +192,7 @@ module URI
177
192
  options = args.pop if Hash === args.last
178
193
  options ||= {}
179
194
  if String === args.first
180
- ios = StringIO.new(args.first, "r")
195
+ ios = StringIO.new(args.first, 'r')
181
196
  write(options.merge(:size=>args.first.size)) { |bytes| ios.read(bytes) }
182
197
  elsif args.first.respond_to?(:read)
183
198
  size = args.first.size rescue nil
@@ -185,7 +200,7 @@ module URI
185
200
  elsif args.empty? && block
186
201
  write_internal options, &block
187
202
  else
188
- raise ArgumentError, "Either give me the content, or pass me a block, otherwise what would I upload?"
203
+ raise ArgumentError, 'Either give me the content, or pass me a block, otherwise what would I upload?'
189
204
  end
190
205
  end
191
206
 
@@ -203,14 +218,14 @@ module URI
203
218
  source = source.name if Rake::Task === source
204
219
  options ||= {}
205
220
  if String === source
206
- raise NotFoundError, "No source file/directory to upload." unless File.exist?(source)
221
+ raise NotFoundError, 'No source file/directory to upload.' unless File.exist?(source)
207
222
  if File.directory?(source)
208
223
  Dir.glob("#{source}/**/*").reject { |file| File.directory?(file) }.each do |file|
209
- uri = self + (File.join(self.path, file.sub(source, "")))
224
+ uri = self + (File.join(self.path, file.sub(source, '')))
210
225
  uri.upload file, {:digests=>[]}.merge(options)
211
226
  end
212
227
  else
213
- File.open(source, "rb") { |input| upload input, options }
228
+ File.open(source, 'rb') { |input| upload input, options }
214
229
  end
215
230
  elsif source.respond_to?(:read)
216
231
  digests = (options[:digests] || [:md5, :sha1]).
@@ -226,14 +241,14 @@ module URI
226
241
  (options).merge(:progress=>false)
227
242
  end
228
243
  else
229
- raise ArgumentError, "Expecting source to be a file name (string, task) or any object that responds to read (file, pipe)."
244
+ raise ArgumentError, 'Expecting source to be a file name (string, task) or any object that responds to read (file, pipe).'
230
245
  end
231
246
  end
232
247
 
233
248
  protected
234
249
 
235
250
  # :call-seq:
236
- # with_progress_bar(enable, file_name, size) { |progress| ... }
251
+ # with_progress_bar(show, file_name, size) { |progress| ... }
237
252
  #
238
253
  # Displays a progress bar while executing the block. The first argument must be true for the
239
254
  # progress bar to show (TTY output also required), as a convenient for selectively using the
@@ -243,45 +258,10 @@ module URI
243
258
  #
244
259
  # The block is yielded with a progress object that implements a single method.
245
260
  # Call << for each block of bytes down/uploaded.
246
- def with_progress_bar(enable, file_name, size) #:nodoc:
247
- if enable && $stdout.isatty
248
- progress_bar = Console::ProgressBar.new(file_name, size)
249
- # Extend the progress bar so we can display count/total.
250
- class << progress_bar
251
- def total()
252
- convert_bytes(@total)
253
- end
254
- end
255
- # Squeeze the filename into 30 characters.
256
- if file_name.size > 30
257
- base, ext = file_name.split(".")
258
- truncated = "#{base[0..26-ext.to_s.size]}...#{ext}"
259
- else
260
- truncated = file_name
261
- end
262
- progress_bar.format = "#{truncated}: %3d%% %s %s/%s %s"
263
- progress_bar.format = "%3d%% %s %s/%s %s"
264
- progress_bar.format_arguments = [:percentage, :bar, :bytes, :total, :stat]
265
- progress_bar.bar_mark = "."
266
-
267
- begin
268
- class << progress_bar
269
- def <<(bytes)
270
- inc bytes.respond_to?(:size) ? bytes.size : bytes
271
- end
272
- end
273
- yield progress_bar
274
- ensure
275
- progress_bar.finish
276
- end
277
- else
278
- progress_bar = Object.new
279
- class << progress_bar
280
- def <<(bytes)
281
- end
282
- end
283
- yield progress_bar
284
- end
261
+ def with_progress_bar(show, file_name, size, &block) #:nodoc:
262
+ options = { :total=>size, :title=>file_name }
263
+ options[:hidden] = true unless show
264
+ ProgressBar.start options, &block
285
265
  end
286
266
 
287
267
  # :call-seq:
@@ -292,13 +272,13 @@ module URI
292
272
  def proxy_uri()
293
273
  proxy = ENV["#{scheme.upcase}_PROXY"]
294
274
  proxy = URI.parse(proxy) if String === proxy
295
- excludes = (ENV["NO_PROXY"] || "").split(/\s*,\s*/).compact
275
+ excludes = ENV['NO_PROXY'].to_s.split(/\s*,\s*/).compact
296
276
  excludes = excludes.map { |exclude| exclude =~ /:\d+$/ ? exclude : "#{exclude}:*" }
297
277
  return proxy unless excludes.any? { |exclude| File.fnmatch(exclude, "#{host}:#{port}") }
298
278
  end
299
279
 
300
280
  def write_internal(options, &block) #:nodoc:
301
- fail "This protocol doesn't support writing (yet, how about helping by implementing it?)"
281
+ fail 'This protocol doesn\'t support writing (yet, how about helping by implementing it?)'
302
282
  end
303
283
 
304
284
  end
@@ -309,54 +289,54 @@ module URI
309
289
  # See URI::Generic#read
310
290
  def read(options = nil, &block)
311
291
  options ||= {}
292
+ headers = { 'If-Modified-Since' => CGI.rfc1123_date(options[:modified].utc) } if options[:modified]
312
293
 
313
- headers = { "If-Modified-Since" => CGI.rfc1123_date(options[:modified].utc) } if options[:modified]
314
- result = nil
315
- request = lambda do |http|
316
- puts "Requesting #{self}" if Rake.application.options.trace
317
- http.request_get(path, headers) do |response|
318
- case response
319
- when Net::HTTPNotModified
320
- # No modification, nothing to do.
321
- puts "Not modified since last download" if Rake.application.options.trace
322
-
323
- when Net::HTTPRedirection
324
- # Try to download from the new URI, handle relative redirects.
325
- puts "Redirected to #{response['Location']}" if Rake.application.options.trace
326
- result = (self + URI.parse(response["location"])).read(options, &block)
327
-
328
- when Net::HTTPOK
329
- puts "Downloading #{self}" if verbose
330
- with_progress_bar options[:progress], path.split("/").last, response.content_length do |progress|
331
- if block
332
- response.read_body do |chunk|
333
- block.call chunk
334
- progress << chunk
335
- end
336
- else
337
- result = ""
338
- response.read_body do |chunk|
339
- result << chunk
340
- progress << chunk
341
- end
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)
299
+ end
300
+ http.use_ssl = true if self.instance_of? URI::HTTPS
301
+
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
+ 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
+ when Net::HTTPRedirection
313
+ # Try to download from the new URI, handle relative redirects.
314
+ 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
342
330
  end
343
331
  end
344
-
345
- when Net::HTTPNotFound
346
- raise NotFoundError, "Looking for #{self} and all I got was a 404!"
347
- else
348
- raise RuntimeError, "Failed to download #{self}: #{response.message}"
349
332
  end
333
+ return result
334
+ when Net::HTTPNotFound
335
+ raise NotFoundError, "Looking for #{self} and all I got was a 404!"
336
+ else
337
+ raise RuntimeError, "Failed to download #{self}: #{response.message}"
350
338
  end
351
339
  end
352
-
353
- if proxy = proxy_uri
354
- proxy = URI.parse(proxy) if String === proxy
355
- Net::HTTP.start(host, port, proxy.host, proxy.port, proxy.user, proxy.password) { |http| request[http] }
356
- else
357
- Net::HTTP.start(host, port) { |http| request[http] }
358
- end
359
- result
360
340
  end
361
341
 
362
342
  end
@@ -366,7 +346,7 @@ module URI
366
346
 
367
347
  class << self
368
348
  # Caching of passwords, so we only need to ask once.
369
- def passwords()
349
+ def passwords
370
350
  @passwords ||= {}
371
351
  end
372
352
  end
@@ -375,16 +355,16 @@ module URI
375
355
 
376
356
  def write_internal(options, &block) #:nodoc:
377
357
  # SSH options are based on the username/password from the URI.
378
- ssh_options = { :port=>port, :username=>user }.merge(options[:ssh_options] || {})
358
+ ssh_options = { :port=>port, :username=>user, :password=>password }.merge(options[:ssh_options] || {})
379
359
  ssh_options[:password] ||= SFTP.passwords[host]
380
360
  begin
381
- puts "Connecting to #{host}" if Rake.application.options.trace
361
+ puts "Connecting to #{host}" if Buildr.application.options.trace
382
362
  session = Net::SSH.start(host, ssh_options)
383
363
  SFTP.passwords[host] = ssh_options[:password]
384
364
  rescue Net::SSH::AuthenticationFailed=>ex
385
365
  # Only if running with console, prompt for password.
386
366
  if !ssh_options[:password] && $stdout.isatty
387
- password = HighLine.new.ask("Password for #{host}:") { |q| q.echo = "*" }
367
+ password = ask("Password for #{host}:") { |q| q.echo = '*' }
388
368
  ssh_options[:password] = password
389
369
  retry
390
370
  end
@@ -392,20 +372,20 @@ module URI
392
372
  end
393
373
 
394
374
  session.sftp.connect do |sftp|
395
- puts "connected" if Rake.application.options.trace
375
+ puts 'connected' if Buildr.application.options.trace
396
376
 
397
377
  # To create a path, we need to create all its parent. We use realpath to determine if
398
378
  # the path already exists, otherwise mkdir fails.
399
- puts "Creating path #{@base_path}" if Rake.application.options.trace
400
- File.dirname(path).split("/").inject("") do |base, part|
379
+ puts "Creating path #{path}" if Buildr.application.options.trace
380
+ File.dirname(path).split('/').inject('') do |base, part|
401
381
  combined = base + part
402
382
  sftp.realpath combined rescue sftp.mkdir combined, {}
403
383
  "#{combined}/"
404
384
  end
405
385
 
406
- with_progress_bar options[:progress] && options[:size], path.split("/"), options[:size] || 0 do |progress|
407
- puts "Uploading to #{path}" if Rake.application.options.trace
408
- sftp.open_handle(path, "w") do |handle|
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|
409
389
  # Writing in chunks gives us the benefit of a progress bar,
410
390
  # but also require that we maintain a position in the file,
411
391
  # since write() with two arguments always writes at position 0.
@@ -442,7 +422,7 @@ module URI
442
422
  end
443
423
  end
444
424
  # Sadly, file://something really means file://something/ (something being server)
445
- set_path "/" if path.empty?
425
+ set_path '/' if path.empty?
446
426
 
447
427
  # On windows, file://c:/something is not a valid URL, but people do it anyway, so if we see a drive-as-host,
448
428
  # we'll just be nice enough to fix it. (URI actually strips the colon here)
@@ -455,14 +435,14 @@ module URI
455
435
  # See URI::Generic#read
456
436
  def read(options = nil, &block)
457
437
  options ||= {}
458
- raise ArgumentError, "Either you're attempting to read a file from another host (which we don't support), or you used two slashes by mistake, where you should have file:///<path>." unless host.blank?
438
+ raise ArgumentError, 'Either you\'re attempting to read a file from another host (which we don\'t support), or you used two slashes by mistake, where you should have file:///<path>.' if host
459
439
 
460
440
  path = real_path
461
441
  # TODO: complain about clunky URLs
462
442
  raise NotFoundError, "Looking for #{self} and can't find it." unless File.exists?(path)
463
443
  raise NotFoundError, "Looking for the file #{self}, and it happens to be a directory." if File.directory?(path)
464
- File.open path, "rb" do |input|
465
- with_progress_bar options[:progress], path.split("/").last, input.stat.size do |progress|
444
+ File.open path, 'rb' do |input|
445
+ with_progress_bar options[:progress], path.split('/').last, input.stat.size do |progress|
466
446
  block ? block.call(input.read) : input.read
467
447
  end
468
448
  end
@@ -482,11 +462,11 @@ module URI
482
462
  protected
483
463
 
484
464
  def write_internal(options, &block) #:nodoc:
485
- raise ArgumentError, "Either you're attempting to write a file to another host (which we don't support), or you used two slashes by mistake, where you should have file:///<path>." unless host.blank?
465
+ raise ArgumentError, 'Either you\'re attempting to write a file to another host (which we don\'t support), or you used two slashes by mistake, where you should have file:///<path>.' if host
486
466
  temp = nil
487
467
  Tempfile.open File.basename(path) do |temp|
488
468
  temp.binmode
489
- with_progress_bar options[:progress] && options[:size], path.split("/"), options[:size] || 0 do |progress|
469
+ with_progress_bar options[:progress] && options[:size], path.split('/'), options[:size] || 0 do |progress|
490
470
  while chunk = yield(32 * 4096)
491
471
  temp.write chunk
492
472
  progress << chunk
@@ -499,7 +479,7 @@ module URI
499
479
  end
500
480
  end
501
481
 
502
- @@schemes["FILE"] = FILE
482
+ @@schemes['FILE'] = FILE
503
483
 
504
484
  end
505
485
 
@@ -0,0 +1,235 @@
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
+ require 'rbconfig'
17
+ require 'pathname'
18
+
19
+
20
+ module Buildr
21
+
22
+ module Util
23
+ extend self
24
+
25
+ def java_platform?
26
+ RUBY_PLATFORM =~ /java/
27
+ end
28
+
29
+ # In order to determine if we are running on a windows OS,
30
+ # prefer this function instead of using Gem.win_platform?.
31
+ #
32
+ # Gem.win_platform? only checks the RUBY_PLATFORM global,
33
+ # that in some cases like when running on JRuby is not
34
+ # succifient for our purpose:
35
+ #
36
+ # For JRuby, the value for RUBY_PLATFORM will always be 'java'
37
+ # That's why this function checks on Config::CONFIG['host_os']
38
+ def win_os?
39
+ Config::CONFIG['host_os'] =~ /windows|cygwin|bccwin|cygwin|djgpp|mingw|mswin|wince/i
40
+ end
41
+
42
+ # Runs Ruby with these command line arguments. The last argument may be a hash,
43
+ # supporting the following keys:
44
+ # :command -- Runs the specified script (e.g., :command=>'gem')
45
+ # :sudo -- Run as sudo on operating systems that require it.
46
+ # :verbose -- Override Rake's verbose flag.
47
+ def ruby(*args)
48
+ options = Hash === args.last ? args.pop : {}
49
+ cmd = []
50
+ ruby_bin = File.expand_path(Config::CONFIG['ruby_install_name'], Config::CONFIG['bindir'])
51
+ if options.delete(:sudo) && !(win_os? || Process.uid == File.stat(ruby_bin).uid)
52
+ cmd << 'sudo' << '-u' << "##{File.stat(ruby_bin).uid}"
53
+ end
54
+ cmd << ruby_bin
55
+ cmd << '-S' << options.delete(:command) if options[:command]
56
+ sh *cmd.push(*args.flatten).push(options) do |ok, status|
57
+ ok or fail "Command failed with status (#{status ? status.exitstatus : 'unknown'}): [#{cmd.join(" ")}]"
58
+ end
59
+ end
60
+
61
+ # Just like File.expand_path, but for windows systems it
62
+ # capitalizes the drive name and ensures backslashes are used
63
+ def normalize_path(path, *dirs)
64
+ path = File.expand_path(path, *dirs)
65
+ if win_os?
66
+ path.gsub!('/', '\\').gsub!(/^[a-zA-Z]+:/) { |s| s.upcase }
67
+ else
68
+ path
69
+ end
70
+ end
71
+
72
+ # Return the timestamp of file, without having to create a file task
73
+ def timestamp(file)
74
+ if File.exist?(file)
75
+ File.mtime(file)
76
+ else
77
+ Rake::EARLY
78
+ end
79
+ end
80
+
81
+ # Return the path to the first argument, starting from the path provided by the
82
+ # second argument.
83
+ #
84
+ # For example:
85
+ # relative_path('foo/bar', 'foo')
86
+ # => 'bar'
87
+ # relative_path('foo/bar', 'baz')
88
+ # => '../foo/bar'
89
+ # relative_path('foo/bar')
90
+ # => 'foo/bar'
91
+ # relative_path('/foo/bar', 'baz')
92
+ # => '/foo/bar'
93
+ def relative_path(to, from = '.')
94
+ to = Pathname.new(to).cleanpath
95
+ return to.to_s if from.nil?
96
+ to_path = Pathname.new(File.expand_path(to.to_s, "/"))
97
+ from_path = Pathname.new(File.expand_path(from.to_s, "/"))
98
+ to_path.relative_path_from(from_path).to_s
99
+ end
100
+
101
+ # Generally speaking, it's not a good idea to operate on dot files (files starting with dot).
102
+ # These are considered invisible files (.svn, .hg, .irbrc, etc). Dir.glob/FileList ignore them
103
+ # on purpose. There are few cases where we do have to work with them (filter, zip), a better
104
+ # solution is welcome, maybe being more explicit with include. For now, this will do.
105
+ def recursive_with_dot_files(*dirs)
106
+ FileList[dirs.map { |dir| File.join(dir, '/**/{*,.*}') }].reject { |file| File.basename(file) =~ /^[.]{1,2}$/ }
107
+ end
108
+
109
+ end
110
+ end
111
+
112
+
113
+ module Kernel #:nodoc:
114
+ # Borrowed from Ruby 1.9.
115
+ def tap
116
+ yield self if block_given?
117
+ self
118
+ end unless method_defined?('tap')
119
+ end
120
+
121
+
122
+ class Symbol #:nodoc:
123
+ # Borrowed from Ruby 1.9.
124
+ def to_proc
125
+ Proc.new{|*args| args.shift.__send__(self, *args)}
126
+ end unless method_defined?('to_proc')
127
+ end
128
+
129
+
130
+ # Also borrowed from Ruby 1.9.
131
+ class BasicObject #:nodoc:
132
+ (instance_methods - ['__send__', '__id__', '==', 'send', 'send!', 'respond_to?', 'equal?', 'object_id']).
133
+ each do |method|
134
+ undef_method method
135
+ end
136
+
137
+ def self.ancestors
138
+ [Kernel]
139
+ end
140
+ end
141
+
142
+
143
+ class OpenObject < Hash
144
+
145
+ def initialize(source=nil, &block)
146
+ @hash = Hash.new(&block)
147
+ @hash.update(source) if source
148
+ end
149
+
150
+ def [](key)
151
+ @hash[key]
152
+ end
153
+
154
+ def []=(key, value)
155
+ @hash[key] = value
156
+ end
157
+
158
+ def delete(key)
159
+ @hash.delete(key)
160
+ end
161
+
162
+ def to_hash
163
+ @hash.clone
164
+ end
165
+
166
+ def method_missing(symbol, *args)
167
+ if symbol.to_s =~ /=$/
168
+ self[symbol.to_s[0..-2].to_sym] = args.first
169
+ else
170
+ self[symbol]
171
+ end
172
+ end
173
+ end
174
+
175
+
176
+ class Hash
177
+
178
+ class << self
179
+
180
+ # :call-seq:
181
+ # Hash.from_java_properties(string)
182
+ #
183
+ # Returns a hash from a string in the Java properties file format. For example:
184
+ # str = 'foo=bar\nbaz=fab'
185
+ # Hash.from_properties(str)
186
+ # => { 'foo'=>'bar', 'baz'=>'fab' }.to_properties
187
+ def from_java_properties(string)
188
+ string.gsub(/\\\n/, '').split("\n").select { |line| line =~ /^[^#].*=.*/ }.
189
+ map { |line| line.gsub(/\\[trnf\\]/) { |escaped| {?t=>"\t", ?r=>"\r", ?n=>"\n", ?f=>"\f", ?\\=>"\\"}[escaped[1]] } }.
190
+ map { |line| line.split('=') }.
191
+ inject({}) { |hash, (name, value)| hash.merge(name=>value) }
192
+ end
193
+
194
+ end
195
+
196
+ # :call-seq:
197
+ # only(keys*) => hash
198
+ #
199
+ # Returns a new hash with only the specified keys.
200
+ #
201
+ # For example:
202
+ # { :a=>1, :b=>2, :c=>3, :d=>4 }.only(:a, :c)
203
+ # => { :a=>1, :c=>3 }
204
+ def only(*keys)
205
+ keys.inject({}) { |hash, key| has_key?(key) ? hash.merge(key=>self[key]) : hash }
206
+ end
207
+
208
+
209
+ # :call-seq:
210
+ # except(keys*) => hash
211
+ #
212
+ # Returns a new hash without the specified keys.
213
+ #
214
+ # For example:
215
+ # { :a=>1, :b=>2, :c=>3, :d=>4 }.except(:a, :c)
216
+ # => { :b=>2, :d=>4 }
217
+ def except(*keys)
218
+ (self.keys - keys).inject({}) { |hash, key| hash.merge(key=>self[key]) }
219
+ end
220
+
221
+ # :call-seq:
222
+ # to_java_properties => string
223
+ #
224
+ # Convert hash to string format used for Java properties file. For example:
225
+ # { 'foo'=>'bar', 'baz'=>'fab' }.to_properties
226
+ # => foo=bar
227
+ # baz=fab
228
+ def to_java_properties
229
+ keys.sort.map { |key|
230
+ value = self[key].gsub(/[\t\r\n\f\\]/) { |escape| "\\" + {"\t"=>"t", "\r"=>"r", "\n"=>"n", "\f"=>"f", "\\"=>"\\"}[escape] }
231
+ "#{key}=#{value}"
232
+ }.join("\n")
233
+ end
234
+
235
+ end