buildr 1.4.1-x86-mswin32 → 1.4.2-x86-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG +68 -11
  2. data/_buildr +2 -0
  3. data/addon/buildr/hibernate.rb +8 -5
  4. data/addon/buildr/jetty.rb +1 -1
  5. data/addon/buildr/openjpa.rb +0 -2
  6. data/addon/buildr/xmlbeans.rb +1 -1
  7. data/buildr.gemspec +13 -9
  8. data/doc/_layouts/default.html +3 -1
  9. data/doc/contributing.textile +10 -2
  10. data/doc/css/default.css +6 -6
  11. data/doc/download.textile +7 -7
  12. data/doc/languages.textile +2 -2
  13. data/doc/more_stuff.textile +41 -33
  14. data/doc/packaging.textile +6 -3
  15. data/doc/releasing.textile +116 -0
  16. data/doc/scripts/install-linux.sh +7 -6
  17. data/doc/testing.textile +14 -0
  18. data/lib/buildr.rb +2 -2
  19. data/lib/buildr/core.rb +0 -6
  20. data/lib/buildr/core/application.rb +25 -2
  21. data/lib/buildr/core/build.rb +66 -15
  22. data/lib/buildr/core/compile.rb +10 -1
  23. data/lib/buildr/core/filter.rb +1 -1
  24. data/lib/buildr/core/progressbar.rb +8 -3
  25. data/lib/buildr/core/test.rb +57 -6
  26. data/lib/buildr/core/transports.rb +18 -13
  27. data/lib/buildr/core/util.rb +19 -3
  28. data/lib/buildr/groovy/compiler.rb +2 -2
  29. data/lib/buildr/ide/eclipse.rb +32 -12
  30. data/lib/buildr/java/ant.rb +3 -3
  31. data/lib/buildr/java/bdd.rb +1 -2
  32. data/lib/buildr/java/cobertura.rb +10 -9
  33. data/lib/buildr/java/commands.rb +22 -21
  34. data/lib/buildr/java/compiler.rb +2 -2
  35. data/lib/buildr/java/doc.rb +1 -1
  36. data/lib/buildr/java/ecj.rb +71 -0
  37. data/lib/buildr/java/emma.rb +1 -1
  38. data/lib/buildr/java/external.rb +9 -9
  39. data/lib/buildr/java/jruby.rb +5 -0
  40. data/lib/buildr/java/packaging.rb +4 -3
  41. data/lib/buildr/java/rjb.rb +4 -6
  42. data/lib/buildr/java/tests.rb +9 -4
  43. data/lib/buildr/packaging/archive.rb +7 -3
  44. data/lib/buildr/packaging/artifact.rb +153 -38
  45. data/lib/buildr/packaging/gems.rb +2 -3
  46. data/lib/buildr/packaging/package.rb +19 -12
  47. data/lib/buildr/packaging/tar.rb +1 -1
  48. data/lib/buildr/packaging/ziptask.rb +1 -1
  49. data/lib/buildr/scala/bdd.rb +7 -3
  50. data/lib/buildr/scala/compiler.rb +2 -2
  51. data/lib/buildr/scala/doc.rb +3 -3
  52. data/lib/buildr/scala/tests.rb +7 -3
  53. data/lib/buildr/version.rb +18 -0
  54. data/rakelib/all-in-one.rake +1 -1
  55. data/rakelib/doc.rake +13 -3
  56. data/rakelib/metrics.rake +39 -0
  57. data/spec/core/application_spec.rb +13 -12
  58. data/spec/core/build_spec.rb +166 -7
  59. data/spec/core/cc_spec.rb +1 -1
  60. data/spec/core/checks_spec.rb +1 -1
  61. data/spec/core/common_spec.rb +10 -1
  62. data/spec/core/compile_spec.rb +1 -1
  63. data/spec/core/extension_spec.rb +1 -1
  64. data/spec/core/generate_spec.rb +1 -1
  65. data/spec/core/project_spec.rb +1 -1
  66. data/spec/core/test_spec.rb +124 -11
  67. data/spec/core/transport_spec.rb +10 -3
  68. data/spec/core/util_spec.rb +18 -2
  69. data/spec/groovy/bdd_spec.rb +1 -1
  70. data/spec/groovy/compiler_spec.rb +3 -3
  71. data/spec/ide/eclipse_spec.rb +63 -1
  72. data/spec/ide/idea7x_spec.rb +1 -1
  73. data/spec/java/ant_spec.rb +1 -1
  74. data/spec/java/bdd_spec.rb +1 -1
  75. data/spec/java/cobertura_spec.rb +29 -2
  76. data/spec/java/commands_spec.rb +61 -2
  77. data/spec/java/compiler_spec.rb +3 -3
  78. data/spec/java/ecj_spec.rb +115 -0
  79. data/spec/java/emma_spec.rb +1 -1
  80. data/spec/java/external_spec.rb +10 -8
  81. data/spec/java/java_spec.rb +14 -6
  82. data/spec/java/packaging_spec.rb +41 -15
  83. data/spec/java/test_coverage_helper.rb +1 -1
  84. data/spec/java/tests_spec.rb +1 -1
  85. data/spec/packaging/archive_spec.rb +12 -1
  86. data/spec/packaging/artifact_namespace_spec.rb +1 -1
  87. data/spec/packaging/artifact_spec.rb +197 -7
  88. data/spec/packaging/packaging_spec.rb +12 -12
  89. data/spec/sandbox.rb +8 -3
  90. data/spec/scala/bdd_spec.rb +3 -3
  91. data/spec/scala/compiler_spec.rb +7 -7
  92. data/spec/scala/scala.rb +3 -3
  93. data/spec/scala/tests_spec.rb +3 -3
  94. data/spec/spec_helpers.rb +11 -1
  95. data/spec/version_requirement_spec.rb +1 -1
  96. metadata +220 -85
  97. data/rakelib/jekylltask.rb +0 -120
@@ -42,7 +42,7 @@ module Java
42
42
  # * :verbose -- If true, prints the command and all its argument.
43
43
  def java(*args, &block)
44
44
  options = Hash === args.last ? args.pop : {}
45
- options[:verbose] ||= Buildr.application.options.trace || false
45
+ options[:verbose] ||= trace?(:java)
46
46
  rake_check_options options, :classpath, :java_args, :properties, :name, :verbose
47
47
 
48
48
  name = options[:name]
@@ -51,8 +51,8 @@ module Java
51
51
  end
52
52
 
53
53
  cmd_args = [path_to_bin('java')]
54
- classpath = classpath_from(options)
55
- cmd_args << '-classpath' << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
54
+ cp = classpath_from(options)
55
+ cmd_args << '-classpath' << cp.join(File::PATH_SEPARATOR) unless cp.empty?
56
56
  options[:properties].each { |k, v| cmd_args << "-D#{k}=#{v}" } if options[:properties]
57
57
  cmd_args += (options[:java_args] || (ENV['JAVA_OPTS'] || ENV['JAVA_OPTIONS']).to_s.split).flatten
58
58
  cmd_args += args.flatten.compact
@@ -84,23 +84,21 @@ module Java
84
84
 
85
85
  files = args.flatten.map(&:to_s).
86
86
  collect { |arg| File.directory?(arg) ? FileList["#{arg}/**/*.java"] : arg }.flatten
87
- cmd_args = [ Buildr.application.options.trace ? '-verbose' : '-nowarn' ]
87
+ cmd_args = [ trace?(:apt) ? '-verbose' : '-nowarn' ]
88
88
  if options[:compile]
89
89
  cmd_args << '-d' << options[:output].to_s
90
90
  else
91
91
  cmd_args << '-nocompile' << '-s' << options[:output].to_s
92
92
  end
93
93
  cmd_args << '-source' << options[:source] if options[:source]
94
- classpath = classpath_from(options)
95
- tools = Java.tools_jar
96
- classpath << tools if tools
97
- cmd_args << '-classpath' << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
94
+ cp = classpath_from(options)
95
+ cmd_args << '-classpath' << cp.join(File::PATH_SEPARATOR) unless cp.empty?
98
96
  cmd_args += files
99
97
  unless Buildr.application.options.dryrun
100
98
  info 'Running apt'
101
99
  trace (['apt'] + cmd_args).join(' ')
102
100
  Java.load
103
- Java.com.sun.tools.apt.Main.process(cmd_args.to_java(Java.java.lang.String)) == 0 or
101
+ ::Java::com.sun.tools.apt.Main.process(cmd_args.to_java(::Java::java.lang.String)) == 0 or
104
102
  fail 'Failed to process annotations, see errors above'
105
103
  end
106
104
  end
@@ -122,21 +120,22 @@ module Java
122
120
  rake_check_options options, :classpath, :sourcepath, :output, :javac_args, :name
123
121
 
124
122
  files = args.flatten.each { |f| f.invoke if f.respond_to?(:invoke) }.map(&:to_s).
125
- collect { |arg| File.directory?(arg) ? FileList["#{arg}/**/*.java"] : arg }.flatten
123
+ collect { |arg| File.directory?(arg) ? FileList["#{File.expand_path(arg)}/**/*.java"] : File.expand_path(arg) }.flatten
126
124
  name = options[:name] || Dir.pwd
127
125
 
128
126
  cmd_args = []
129
- classpath = classpath_from(options)
130
- cmd_args << '-classpath' << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
131
- cmd_args << '-sourcepath' << options[:sourcepath].join(File::PATH_SEPARATOR) if options[:sourcepath]
132
- cmd_args << '-d' << options[:output].to_s if options[:output]
127
+ cp = classpath_from(options)
128
+ cmd_args << '-classpath' << cp.join(File::PATH_SEPARATOR) unless cp.empty?
129
+ cmd_args << '-sourcepath' << [options[:sourcepath]].flatten.join(File::PATH_SEPARATOR) if options[:sourcepath]
130
+ cmd_args << '-d' << File.expand_path(options[:output].to_s) if options[:output]
133
131
  cmd_args += options[:javac_args].flatten if options[:javac_args]
134
132
  cmd_args += files
135
133
  unless Buildr.application.options.dryrun
134
+ mkdir_p options[:output] if options[:output]
136
135
  info "Compiling #{files.size} source files in #{name}"
137
136
  trace (['javac'] + cmd_args).join(' ')
138
137
  Java.load
139
- Java.com.sun.tools.javac.Main.compile(cmd_args.to_java(Java.java.lang.String)) == 0 or
138
+ ::Java::com.sun.tools.javac.Main.compile(cmd_args.to_java(::Java::java.lang.String)) == 0 or
140
139
  fail 'Failed to compile, see errors above'
141
140
  end
142
141
  end
@@ -159,8 +158,9 @@ module Java
159
158
  # * array -- Option with set of values separated by spaces.
160
159
  def javadoc(*args)
161
160
  options = Hash === args.last ? args.pop : {}
162
-
163
- cmd_args = [ '-d', options[:output], Buildr.application.options.trace ? '-verbose' : '-quiet' ]
161
+ fail "No output defined for javadoc" if options[:output].nil?
162
+ options[:output] = File.expand_path(options[:output].to_s)
163
+ cmd_args = [ '-d', options[:output], trace?(:javadoc) ? '-verbose' : '-quiet' ]
164
164
  options.reject { |key, value| [:output, :name, :sourcepath, :classpath].include?(key) }.
165
165
  each { |key, value| value.invoke if value.respond_to?(:invoke) }.
166
166
  each do |key, value|
@@ -180,13 +180,14 @@ module Java
180
180
  cmd_args << "-#{option}" << paths.flatten.map(&:to_s).join(File::PATH_SEPARATOR) unless paths.empty?
181
181
  end
182
182
  end
183
- cmd_args += args.flatten.uniq
183
+ files = args.each {|arg| arg.invoke if arg.respond_to?(:invoke)}.collect {|arg| arg.is_a?(Project) ? arg.compile.sources.collect{|dir| Dir["#{File.expand_path(dir.to_s)}/**/*.java"]} : File.expand_path(arg.to_s) }
184
+ cmd_args += files.flatten.uniq.map(&:to_s)
184
185
  name = options[:name] || Dir.pwd
185
186
  unless Buildr.application.options.dryrun
186
187
  info "Generating Javadoc for #{name}"
187
188
  trace (['javadoc'] + cmd_args).join(' ')
188
189
  Java.load
189
- Java.com.sun.tools.javadoc.Main.execute(cmd_args.to_java(Java.java.lang.String)) == 0 or
190
+ ::Java::com.sun.tools.javadoc.Main.execute(cmd_args.to_java(::Java::java.lang.String)) == 0 or
190
191
  fail 'Failed to generate Javadocs, see errors above'
191
192
  end
192
193
  end
@@ -199,9 +200,9 @@ module Java
199
200
  # Returns the path to the specified Java command (with no argument to java itself).
200
201
  def path_to_bin(name = nil)
201
202
  home = ENV['JAVA_HOME'] or fail 'Are we forgetting something? JAVA_HOME not set.'
202
- bin = File.expand_path(File.join(home, 'bin'))
203
+ bin = Util.normalize_path(File.join(home, 'bin'))
203
204
  fail 'JAVA_HOME environment variable does not point to a valid JRE/JDK installation.' unless File.exist? bin
204
- File.expand_path(File.join(bin, name.to_s))
205
+ Util.normalize_path(File.join(bin, name.to_s))
205
206
  end
206
207
 
207
208
  # :call-seq:
@@ -76,7 +76,7 @@ module Buildr
76
76
  def javac_args #:nodoc:
77
77
  args = []
78
78
  args << '-nowarn' unless options[:warnings]
79
- args << '-verbose' if Buildr.application.options.trace
79
+ args << '-verbose' if trace? :javac
80
80
  args << '-g' if options[:debug]
81
81
  args << '-deprecation' if options[:deprecation]
82
82
  args << '-source' << options[:source].to_s if options[:source]
@@ -109,7 +109,7 @@ module Buildr
109
109
  def apt(*sources)
110
110
  sources = compile.sources if sources.empty?
111
111
  file(path_to(:target, 'generated/apt')=>sources) do |task|
112
- cmd_args = [ Buildr.application.options.trace ? '-verbose' : '-nowarn' ]
112
+ cmd_args = [ trace?(:apt) ? '-verbose' : '-nowarn' ]
113
113
  cmd_args << '-nocompile' << '-s' << task.name
114
114
  cmd_args << '-source' << compile.options.source if compile.options.source
115
115
  classpath = Buildr.artifacts(compile.dependencies).map(&:to_s).each { |t| task(t).invoke }
@@ -34,7 +34,7 @@ module Buildr
34
34
  specify :language => :java, :source_ext => 'java'
35
35
 
36
36
  def generate(sources, target, options = {})
37
- cmd_args = [ '-d', target, Buildr.application.options.trace ? '-verbose' : '-quiet' ]
37
+ cmd_args = [ '-d', target, trace?(:javadoc) ? '-verbose' : '-quiet' ]
38
38
  options.reject { |key, value| [:sourcepath, :classpath].include?(key) }.
39
39
  each { |key, value| value.invoke if value.respond_to?(:invoke) }.
40
40
  each do |key, value|
@@ -0,0 +1,71 @@
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 Compiler
18
+
19
+ class Ecj < Javac
20
+
21
+ OPTIONS = Buildr::Compiler::Javac::OPTIONS
22
+
23
+ specify :language=>:java, :sources => 'java', :source_ext => 'java',
24
+ :target=>'classes', :target_ext=>'class', :packaging=>:jar
25
+
26
+
27
+
28
+ def compile(sources, target, dependencies) #:nodoc:
29
+ check_options options, OPTIONS
30
+ cmd_args = []
31
+ # tools.jar contains the Java compiler.
32
+ dependencies << Java.tools_jar if Java.tools_jar
33
+ cmd_args << '-classpath' << dependencies.join(File::PATH_SEPARATOR) unless dependencies.empty?
34
+ source_paths = sources.select { |source| File.directory?(source) }
35
+ cmd_args << '-sourcepath' << source_paths.join(File::PATH_SEPARATOR) unless source_paths.empty?
36
+ cmd_args << '-d' << File.expand_path(target)
37
+ cmd_args += ecj_args
38
+ cmd_args += files_from_sources(sources)
39
+ unless Buildr.application.options.dryrun
40
+ trace((%w[javac -classpath org.eclipse.jdt.internal.compiler.batch.Main] + cmd_args).join(' '))
41
+ Java.load
42
+ Java.org.eclipse.jdt.internal.compiler.batch.Main.compile(cmd_args.join(" ")) or
43
+ fail 'Failed to compile, see errors above'
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # See arg list here: http://publib.boulder.ibm.com/infocenter/rsahelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
50
+ def ecj_args #:nodoc:
51
+ args = []
52
+ args << '-warn:none' unless options[:warnings]
53
+ args << '-verbose' if trace?(:ecj)
54
+ args << '-g' if options[:debug]
55
+ args << '-deprecation' if options[:deprecation]
56
+ args << '-source' << options[:source].to_s if options[:source]
57
+ args << '-target' << options[:target].to_s if options[:target]
58
+ case options[:lint]
59
+ when Array then args << "-Xlint:#{options[:lint].join(',')}"
60
+ when String then args << "-Xlint:#{options[:lint]}"
61
+ when true then args << '-Xlint'
62
+ end
63
+ args + Array(options[:other])
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ Java.classpath << "org.eclipse.jdt.core.compiler:ecj:jar:3.5.1"
70
+ # Adding ecj before javac
71
+ Buildr::Compiler.compilers.unshift Buildr::Compiler::Ecj
@@ -62,7 +62,7 @@ module Buildr
62
62
  Buildr.ant 'emma' do |ant|
63
63
  ant.taskdef :resource=>'emma_ant.properties',
64
64
  :classpath=>Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
65
- ant.emma :verbosity=>(Buildr.application.options.trace ? 'verbose' : 'warning') do
65
+ ant.emma :verbosity=>(trace?(:emma) ? 'verbose' : 'warning') do
66
66
  yield ant
67
67
  end
68
68
  end
@@ -16,13 +16,13 @@
16
16
  module Buildr
17
17
  module Compiler
18
18
  class ExternalJavac< Buildr::Compiler::Javac
19
-
19
+
20
20
  OPTIONS = [:jvm, :warnings, :debug, :deprecation, :source, :target, :lint, :other]
21
-
21
+
22
22
  specify :language=>:java, :sources => 'java', :source_ext => 'java',
23
23
  :target=>'classes', :target_ext=>'class', :packaging=>:jar
24
-
25
-
24
+
25
+
26
26
  def compile(sources, target, dependencies) #:nodoc:
27
27
  check_options options, OPTIONS
28
28
  cmd_args = []
@@ -47,12 +47,12 @@ module Buildr
47
47
  end
48
48
 
49
49
  private
50
-
50
+
51
51
  # See arg list here: http://publib.boulder.ibm.com/infocenter/rsahelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
52
52
  def externaljavac_args #:nodoc:
53
- args = []
53
+ args = []
54
54
  args << '-nowarn' unless options[:warnings]
55
- args << '-verbose' if Buildr.application.options.trace
55
+ args << '-verbose' if trace?(:javac)
56
56
  args << '-g' if options[:debug]
57
57
  args << '-deprecation' if options[:deprecation]
58
58
  args << '-source' << options[:source].to_s if options[:source]
@@ -64,9 +64,9 @@ module Buildr
64
64
  end
65
65
  args + Array(options[:other])
66
66
  end
67
-
67
+
68
68
  end
69
-
69
+
70
70
  end
71
71
  end
72
72
 
@@ -59,6 +59,11 @@ module Java
59
59
  # Since we already have a JVM loaded, we can use it to guess where JAVA_HOME is.
60
60
  # We set JAVA_HOME early so we can use it without calling Java.load first.
61
61
  ENV['JAVA_HOME'] ||= java.lang.System.getProperty("java.home")
62
+
63
+ # This version is the minimal version Buildr will support.
64
+ # Any older version of JRuby will raise an exception.
65
+ JRUBY_MIN_VERSION = '1.5.1'
66
+ raise "JRuby must be at least at version #{JRUBY_MIN_VERSION}" unless JRUBY_VERSION >= JRUBY_MIN_VERSION
62
67
 
63
68
  class << self
64
69
 
@@ -256,8 +256,9 @@ module Buildr
256
256
  super
257
257
  @classes = []
258
258
  @libs = []
259
- prepare do
260
- @classes.to_a.flatten.each { |classes| path('WEB-INF/classes').include classes, :as=>'.' }
259
+ enhance do |war|
260
+ @libs.each {|lib| lib.invoke}
261
+ @classes.to_a.flatten.each { |classes| include classes, :as => 'WEB-INF/classes' }
261
262
  path('WEB-INF/lib').include Buildr.artifacts(@libs) unless @libs.nil? || @libs.empty?
262
263
  end
263
264
  end
@@ -607,7 +608,7 @@ module Buildr
607
608
  # Call this when you want the project (and all its sub-projects) to create a source distribution.
608
609
  # You can use the source distribution in an IDE when debugging.
609
610
  #
610
- # A source distribution is a ZIP package with the classifier 'sources', which includes all the
611
+ # A source distribution is a jar package with the classifier 'sources', which includes all the
611
612
  # sources used by the compile task.
612
613
  #
613
614
  # Packages use the project's manifest and meta_inf properties, which you can override by passing
@@ -134,12 +134,10 @@ module Java
134
134
  private
135
135
 
136
136
  def __package__(name) #:nodoc:
137
- const = name.split('.').map { |part| part.gsub(/^./) { |char| char.upcase } }.join
138
- return const_get(const) if constants.include?(const) || constants.include?(const.to_sym)
139
- package = Module.new
140
- package.extend Package
141
- package.instance_variable_set :@name, name
142
- const_set(const, package)
137
+ Module.new.tap do |m|
138
+ m.extend Package
139
+ m.instance_variable_set :@name, name
140
+ end
143
141
  end
144
142
 
145
143
  end
@@ -219,10 +219,15 @@ module Buildr
219
219
  end
220
220
 
221
221
  def tests(dependencies) #:nodoc:
222
- filter_classes(dependencies,
223
- :interfaces => %w{junit.framework.TestCase},
224
- :class_annotations => %w{org.junit.runner.RunWith},
225
- :method_annotations => %w{org.junit.Test})
222
+ if (self.class.version[0,1].to_i < 4)
223
+ filter_classes(dependencies, :interfaces => %w{junit.framework.TestCase})
224
+ else
225
+ filter_classes(dependencies,
226
+ :interfaces => %w{junit.framework.TestCase},
227
+ :class_annotations => %w{org.junit.runner.RunWith},
228
+ :method_annotations => %w{org.junit.Test})
229
+ end
230
+
226
231
  end
227
232
 
228
233
  def run(tests, dependencies) #:nodoc:
@@ -202,6 +202,7 @@ module Buildr
202
202
  end
203
203
 
204
204
  def include_as(source, as)
205
+
205
206
  @sources << proc { source }
206
207
  @actions << proc do |file_map|
207
208
  file = source.to_s
@@ -216,11 +217,14 @@ module Buildr
216
217
  file_map[dest] = file
217
218
  end
218
219
  end
219
- end
220
- unless as == "."
221
- trace "Adding #{@path}#{as}"
220
+ unless as == "."
221
+ trace "Adding #{@path}#{as}/"
222
+ file_map["#{@path}#{as}/"] = file #as is a folder, so the trailing / is required.
223
+ end
224
+ else
222
225
  file_map["#{@path}#{as}"] = file
223
226
  end
227
+
224
228
  end
225
229
  end
226
230
  end
@@ -17,6 +17,7 @@
17
17
  require 'buildr/core/project'
18
18
  require 'buildr/core/transports'
19
19
  require 'buildr/packaging/artifact_namespace'
20
+ require 'fileutils'
20
21
 
21
22
 
22
23
  module Buildr
@@ -27,6 +28,9 @@ module Buildr
27
28
  desc "Download all artifacts' sources"
28
29
  task 'artifacts:sources'
29
30
 
31
+ desc "Download all artifacts' javadoc"
32
+ task 'artifacts:javadoc'
33
+
30
34
  # Mixin with a task to make it behave like an artifact. Implemented by the packaging tasks.
31
35
  #
32
36
  # An artifact has an identifier, group identifier, type, version number and
@@ -41,7 +45,7 @@ module Buildr
41
45
 
42
46
  class << self
43
47
  private
44
-
48
+
45
49
  # :stopdoc:
46
50
  def included(mod)
47
51
  mod.extend self
@@ -60,7 +64,7 @@ module Buildr
60
64
  base.instance_eval { alias :uninstall :uninstall_old } if base.respond_to? :uninstall_old
61
65
  base.instance_eval { alias :upload :upload_old } if base.respond_to? :upload_old
62
66
  end
63
-
67
+
64
68
  # :startdoc:
65
69
  end
66
70
 
@@ -126,6 +130,17 @@ module Buildr
126
130
  sources_task
127
131
  end
128
132
 
133
+ # :call-seq:
134
+ # javadoc_artifact => Artifact
135
+ #
136
+ # Convenience method that returns the associated javadoc artifact
137
+ def javadoc_artifact
138
+ javadoc_spec = to_spec_hash.merge(:classifier=>'javadoc')
139
+ javadoc_task = OptionalArtifact.define_task(Buildr.repositories.locate(javadoc_spec))
140
+ javadoc_task.send :apply_spec, javadoc_spec
141
+ javadoc_task
142
+ end
143
+
129
144
  # :call-seq:
130
145
  # pom_xml => string
131
146
  #
@@ -143,13 +158,16 @@ module Buildr
143
158
  end
144
159
 
145
160
  def install
146
- pom.install if pom && pom != self
147
161
  invoke
148
- installed = Buildr.repositories.locate(self)
149
- unless installed == name # If not already in local repository.
150
- mkpath File.dirname(installed)
151
- cp name, installed
152
- info "Installed #{installed}"
162
+ in_local_repository = Buildr.repositories.locate(self)
163
+ if name != in_local_repository
164
+ if pom && pom != self
165
+ pom.invoke
166
+ pom.install
167
+ end
168
+ mkpath File.dirname(in_local_repository)
169
+ cp name, in_local_repository, :preserve => false
170
+ info "Installed #{name} to #{in_local_repository}"
153
171
  end
154
172
  end
155
173
 
@@ -230,7 +248,7 @@ module Buildr
230
248
  # The default artifact type.
231
249
  DEFAULT_TYPE = :jar
232
250
 
233
- include ActsAsArtifact
251
+ include ActsAsArtifact, Buildr
234
252
 
235
253
  class << self
236
254
 
@@ -332,7 +350,7 @@ module Buildr
332
350
  # if the artifact knows how to build itself (e.g. download from a different location),
333
351
  # so don't perform it if the task found a different way to create the artifact.
334
352
  task.enhance do
335
- unless File.exist?(name)
353
+ if download_needed? task
336
354
  info "Downloading #{to_spec}"
337
355
  download
338
356
  pom.invoke rescue nil if pom && pom != self
@@ -349,30 +367,52 @@ module Buildr
349
367
  # install test
350
368
  # See also Buildr#install and Buildr#upload.
351
369
  def from(path)
352
- path = path.is_a?(Rake::Task) ? path : File.expand_path(path.to_s)
353
- unless exist?
354
- enhance [path] do
355
- path = File.expand_path(path.to_s)
356
- mkpath File.dirname(name)
357
- pom.invoke unless type == :pom
358
-
359
- cp path, name
360
- info "Installed #{path} as #{to_spec}"
361
- end
370
+ @from = path.is_a?(Rake::Task) ? path : File.expand_path(path.to_s)
371
+ enhance [@from] do
372
+ mkpath File.dirname(name)
373
+ cp @from.to_s, name
362
374
  end
363
- unless type == :pom
364
- pom.enhance do
365
- unless pom.exist?
366
- mkpath File.dirname(pom.name)
367
- File.open(pom.name, 'w') { |file| file.write pom.pom_xml }
375
+ pom.content pom_xml unless pom == self || pom.has_content?
376
+ self
377
+ end
378
+
379
+ # :call-seq:
380
+ # content(string) => self
381
+ #
382
+ # Use this when you want to install or upload an artifact from a given content, for example:
383
+ # readme = artifact('com.example:readme:txt:1.0').content(<<-EOF
384
+ # Please visit our website at http://example.com/readme
385
+ # <<EOF
386
+ # install readme
387
+ #
388
+ # If the argument is not a string, it will be converted to a string using to_s
389
+ def content(string = nil)
390
+ return @content unless string
391
+
392
+ unless @content
393
+ enhance do
394
+ write name, @content
395
+ end
396
+
397
+ class << self
398
+ # Force overwriting target since we don't have source file
399
+ # to check for timestamp modification
400
+ def needed?
401
+ true
402
+ end
368
403
  end
369
404
  end
370
- end
405
+ @content = string
406
+ pom.content pom_xml unless pom == self || pom.has_content?
371
407
  self
372
408
  end
373
409
 
374
410
  protected
375
411
 
412
+ def has_content?
413
+ @from || @content
414
+ end
415
+
376
416
  # :call-seq:
377
417
  # download
378
418
  #
@@ -389,7 +429,7 @@ module Buildr
389
429
  exact_success = remote.find do |repo_url|
390
430
  begin
391
431
  path = "#{group_path}/#{id}/#{version}/#{File.basename(name)}"
392
- URI.download repo_url + path, name
432
+ download_artifact(repo_url + path)
393
433
  true
394
434
  rescue URI::NotFoundError
395
435
  false
@@ -414,7 +454,8 @@ module Buildr
414
454
  snapshot_url = current_snapshot_repo_url(repo_url)
415
455
  if snapshot_url
416
456
  begin
417
- URI.download snapshot_url, name
457
+ download_artifact snapshot_url
458
+ true
418
459
  rescue URI::NotFoundError
419
460
  false
420
461
  end
@@ -430,10 +471,13 @@ module Buildr
430
471
  metadata_xml = StringIO.new
431
472
  URI.download repo_url + metadata_path, metadata_xml
432
473
  metadata = REXML::Document.new(metadata_xml.string).root
433
- timestamp = REXML::XPath.first(metadata, '//timestamp').text
434
- build_number = REXML::XPath.first(metadata, '//buildNumber').text
474
+ timestamp = REXML::XPath.first(metadata, '//timestamp')
475
+ build_number = REXML::XPath.first(metadata, '//buildNumber')
476
+ error "No timestamp provided for the snapshot #{to_spec}" if timestamp.nil?
477
+ error "No build number provided for the snapshot #{to_spec}" if build_number.nil?
478
+ return nil if timestamp.nil? || build_number.nil?
435
479
  snapshot_of = version[0, version.size - 9]
436
- repo_url + "#{group_path}/#{id}/#{version}/#{id}-#{snapshot_of}-#{timestamp}-#{build_number}.#{type}"
480
+ repo_url + "#{group_path}/#{id}/#{version}/#{id}-#{snapshot_of}-#{timestamp.text}-#{build_number.text}.#{type}"
437
481
  rescue URI::NotFoundError
438
482
  nil
439
483
  end
@@ -442,6 +486,71 @@ module Buildr
442
486
  def fail_download(remote_uris)
443
487
  fail "Failed to download #{to_spec}, tried the following repositories:\n#{remote_uris.join("\n")}"
444
488
  end
489
+
490
+ protected
491
+
492
+ # :call-seq:
493
+ # needed?
494
+ #
495
+ # Validates whether artifact is required to be downloaded from repository
496
+ def needed?
497
+ return true if snapshot? && File.exist?(name) && old?
498
+ super
499
+ end
500
+
501
+ private
502
+
503
+ # :call-seq:
504
+ # download_artifact
505
+ #
506
+ # Downloads artifact from given repository,
507
+ # supports downloading snapshot artifact with relocation on succeed to local repository
508
+ def download_artifact(path)
509
+ download_file = "#{name}.#{Time.new.to_i}"
510
+ begin
511
+ URI.download path, download_file
512
+ if File.exist?(download_file)
513
+ FileUtils.mkdir_p(File.dirname(name))
514
+ FileUtils.mv(download_file, name)
515
+ end
516
+ ensure
517
+ File.delete(download_file) if File.exist?(download_file)
518
+ end
519
+ end
520
+
521
+ # :call-seq:
522
+ # :download_needed?
523
+ #
524
+ # Validates whether artifact is required to be downloaded from repository
525
+ def download_needed?(task)
526
+ return true if !File.exist?(name)
527
+
528
+ if snapshot?
529
+ return false if offline? && File.exist?(name)
530
+ return true if update_snapshot? || old?
531
+ end
532
+
533
+ return false
534
+ end
535
+
536
+ def update_snapshot?
537
+ Buildr.application.options.update_snapshots
538
+ end
539
+
540
+ def offline?
541
+ Buildr.application.options.work_offline
542
+ end
543
+
544
+ # :call-seq:
545
+ # old?
546
+ #
547
+ # Checks whether existing artifact is older than period from build settings or one day
548
+ def old?
549
+ settings = Buildr.application.settings
550
+ time_to_be_old = settings.user[:expire_time] || settings.build[:expire_time] || 60 * 60 * 24
551
+ File.mtime(name).to_i < (Time.new.to_i - time_to_be_old)
552
+ end
553
+
445
554
  end
446
555
 
447
556
 
@@ -639,15 +748,18 @@ module Buildr
639
748
  # To specify an artifact and the means for creating it:
640
749
  # download(artifact('dojo:dojo-widget:zip:2.0')=>
641
750
  # 'http://download.dojotoolkit.org/release-2.0/dojo-2.0-widget.zip')
642
- def artifact(spec, &block) #:yields:task
751
+ def artifact(spec, path = nil, &block) #:yields:task
643
752
  spec = artifact_ns.fetch(spec) if spec.kind_of?(Symbol)
644
753
  spec = Artifact.to_hash(spec)
645
754
  unless task = Artifact.lookup(spec)
646
- task = Artifact.define_task(repositories.locate(spec))
755
+ task = Artifact.define_task(path || repositories.locate(spec))
647
756
  task.send :apply_spec, spec
648
757
  Rake::Task['rake:artifacts'].enhance [task]
649
758
  Artifact.register(task)
650
- Rake::Task['artifacts:sources'].enhance [task.sources_artifact] unless spec[:type] == :pom
759
+ unless spec[:type] == :pom
760
+ Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
761
+ Rake::Task['artifacts:javadoc'].enhance [task.javadoc_artifact]
762
+ end
651
763
  end
652
764
  task.enhance &block
653
765
  end
@@ -748,7 +860,7 @@ module Buildr
748
860
  end
749
861
 
750
862
  # :call-seq:
751
- # install(artifacts)
863
+ # install(artifacts) => install_task
752
864
  #
753
865
  # Installs the specified artifacts in the local repository as part of the install task.
754
866
  #
@@ -759,9 +871,12 @@ module Buildr
759
871
  artifacts = artifacts(args)
760
872
  raise ArgumentError, 'This method can only install artifacts' unless artifacts.all? { |f| f.respond_to?(:to_spec) }
761
873
  all = (artifacts + artifacts.map { |artifact| artifact.pom }).uniq
762
- task('install').tap do |task|
763
- task.enhance all, &block
764
- task 'uninstall' do
874
+ task('install').tap do |install|
875
+ install.enhance(all) do
876
+ all.each(&:install)
877
+ end
878
+ install.enhance &block if block
879
+ task('uninstall') do
765
880
  all.map(&:to_s ).each { |file| rm file if File.exist?(file) }
766
881
  end
767
882
  end