buildr 1.3.5-x86-mswin32 → 1.4.0-x86-mswin32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. data/CHANGELOG +153 -8
  2. data/README.rdoc +1 -1
  3. data/addon/buildr/antlr.rb +5 -5
  4. data/addon/buildr/drb.rb +18 -18
  5. data/addon/buildr/hibernate.rb +18 -14
  6. data/addon/buildr/javacc.rb +4 -4
  7. data/addon/buildr/jetty.rb +5 -5
  8. data/addon/buildr/nailgun.rb +23 -23
  9. data/addon/buildr/openjpa.rb +1 -1
  10. data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
  11. data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
  12. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  13. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  14. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  15. data/addon/buildr/protobuf.rb +75 -0
  16. data/addon/buildr/xmlbeans.rb +5 -5
  17. data/buildr.buildfile +2 -2
  18. data/buildr.gemspec +8 -7
  19. data/doc/_layouts/default.html +2 -2
  20. data/doc/artifacts.textile +4 -4
  21. data/doc/building.textile +35 -3
  22. data/doc/contributing.textile +5 -0
  23. data/doc/download.textile +16 -5
  24. data/doc/extending.textile +38 -12
  25. data/doc/installing.textile +6 -5
  26. data/doc/languages.textile +182 -42
  27. data/doc/more_stuff.textile +2 -2
  28. data/doc/packaging.textile +14 -15
  29. data/doc/projects.textile +7 -2
  30. data/doc/quick_start.textile +4 -4
  31. data/doc/scripts/buildr-git.rb +63 -63
  32. data/doc/scripts/gitflow.rb +21 -21
  33. data/doc/settings_profiles.textile +9 -2
  34. data/doc/testing.textile +16 -5
  35. data/etc/KEYS +38 -0
  36. data/lib/buildr.rb +1 -1
  37. data/lib/buildr/core.rb +1 -0
  38. data/lib/buildr/core/application.rb +33 -27
  39. data/lib/buildr/core/build.rb +41 -28
  40. data/lib/buildr/core/cc.rb +172 -0
  41. data/lib/buildr/core/checks.rb +1 -1
  42. data/lib/buildr/core/common.rb +7 -6
  43. data/lib/buildr/core/compile.rb +7 -8
  44. data/lib/buildr/core/doc.rb +263 -0
  45. data/lib/buildr/core/environment.rb +6 -6
  46. data/lib/buildr/core/filter.rb +77 -35
  47. data/lib/buildr/core/generate.rb +7 -7
  48. data/lib/buildr/core/help.rb +1 -1
  49. data/lib/buildr/core/osx.rb +6 -6
  50. data/lib/buildr/core/progressbar.rb +4 -4
  51. data/lib/buildr/core/project.rb +144 -36
  52. data/lib/buildr/core/shell.rb +34 -34
  53. data/lib/buildr/core/test.rb +89 -20
  54. data/lib/buildr/core/transports.rb +8 -7
  55. data/lib/buildr/core/util.rb +77 -23
  56. data/lib/buildr/groovy/bdd.rb +5 -5
  57. data/lib/buildr/groovy/compiler.rb +19 -15
  58. data/lib/buildr/groovy/shell.rb +6 -6
  59. data/lib/buildr/ide/eclipse.rb +148 -75
  60. data/lib/buildr/ide/eclipse/java.rb +3 -3
  61. data/lib/buildr/ide/eclipse/plugin.rb +8 -5
  62. data/lib/buildr/ide/eclipse/scala.rb +4 -2
  63. data/lib/buildr/ide/idea.rb +2 -2
  64. data/lib/buildr/ide/idea7x.rb +23 -4
  65. data/lib/buildr/java.rb +1 -0
  66. data/lib/buildr/java/ant.rb +4 -4
  67. data/lib/buildr/java/bdd.rb +51 -54
  68. data/lib/buildr/java/cobertura.rb +57 -35
  69. data/lib/buildr/java/commands.rb +14 -5
  70. data/lib/buildr/java/compiler.rb +3 -217
  71. data/lib/buildr/java/deprecated.rb +4 -4
  72. data/lib/buildr/java/doc.rb +70 -0
  73. data/lib/buildr/java/emma.rb +22 -22
  74. data/lib/buildr/java/jruby.rb +4 -4
  75. data/lib/buildr/java/jtestr_runner.rb.erb +27 -25
  76. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  77. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +8 -3
  78. data/lib/buildr/java/packaging.rb +30 -29
  79. data/lib/buildr/java/pom.rb +4 -4
  80. data/lib/buildr/java/rjb.rb +6 -6
  81. data/lib/buildr/java/test_result.rb +61 -85
  82. data/lib/buildr/java/tests.rb +44 -27
  83. data/lib/buildr/java/version_requirement.rb +8 -8
  84. data/lib/buildr/packaging/archive.rb +55 -22
  85. data/lib/buildr/packaging/artifact.rb +75 -36
  86. data/lib/buildr/packaging/artifact_namespace.rb +90 -78
  87. data/lib/buildr/packaging/artifact_search.rb +5 -5
  88. data/lib/buildr/packaging/gems.rb +11 -7
  89. data/lib/buildr/packaging/package.rb +10 -7
  90. data/lib/buildr/packaging/tar.rb +14 -14
  91. data/lib/buildr/packaging/version_requirement.rb +30 -10
  92. data/lib/buildr/packaging/ziptask.rb +51 -13
  93. data/lib/buildr/scala.rb +1 -0
  94. data/lib/buildr/scala/bdd.rb +25 -20
  95. data/lib/buildr/scala/compiler.rb +87 -40
  96. data/lib/buildr/scala/doc.rb +106 -0
  97. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  98. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.java +57 -0
  99. data/lib/buildr/scala/shell.rb +14 -9
  100. data/lib/buildr/scala/tests.rb +33 -26
  101. data/lib/buildr/shell.rb +33 -33
  102. data/rakelib/all-in-one.rake +113 -0
  103. data/rakelib/checks.rake +1 -1
  104. data/rakelib/doc.rake +7 -0
  105. data/rakelib/package.rake +1 -1
  106. data/rakelib/release.rake +9 -6
  107. data/rakelib/rspec.rake +26 -7
  108. data/rakelib/setup.rake +15 -3
  109. data/rakelib/stage.rake +18 -11
  110. data/spec/addon/drb_spec.rb +25 -25
  111. data/spec/core/application_spec.rb +111 -21
  112. data/spec/core/build_spec.rb +16 -15
  113. data/spec/core/cc_spec.rb +174 -0
  114. data/spec/core/checks_spec.rb +34 -34
  115. data/spec/core/common_spec.rb +51 -5
  116. data/spec/core/compile_spec.rb +89 -14
  117. data/spec/core/extension_spec.rb +127 -19
  118. data/spec/core/generate_spec.rb +2 -2
  119. data/spec/core/project_spec.rb +10 -10
  120. data/spec/core/test_spec.rb +144 -35
  121. data/spec/core/transport_spec.rb +8 -8
  122. data/spec/core/util_spec.rb +63 -5
  123. data/spec/groovy/bdd_spec.rb +5 -5
  124. data/spec/groovy/compiler_spec.rb +29 -18
  125. data/spec/ide/eclipse_spec.rb +185 -9
  126. data/spec/ide/idea7x_spec.rb +22 -10
  127. data/spec/java/ant_spec.rb +9 -5
  128. data/spec/java/bdd_spec.rb +29 -37
  129. data/spec/java/cobertura_spec.rb +12 -12
  130. data/spec/java/commands_spec.rb +34 -0
  131. data/spec/java/compiler_spec.rb +53 -53
  132. data/spec/java/emma_spec.rb +11 -11
  133. data/spec/java/java_spec.rb +10 -10
  134. data/spec/java/packaging_spec.rb +67 -20
  135. data/spec/java/test_coverage_helper.rb +18 -18
  136. data/spec/java/tests_spec.rb +13 -9
  137. data/spec/packaging/archive_spec.rb +187 -20
  138. data/spec/packaging/artifact_namespace_spec.rb +172 -83
  139. data/spec/packaging/artifact_spec.rb +83 -18
  140. data/spec/packaging/packaging_spec.rb +41 -14
  141. data/spec/sandbox.rb +23 -12
  142. data/spec/scala/bdd_spec.rb +13 -8
  143. data/spec/scala/compiler_spec.rb +18 -13
  144. data/spec/scala/scala.rb +3 -3
  145. data/spec/scala/tests_spec.rb +46 -24
  146. data/spec/spec_helpers.rb +28 -10
  147. data/spec/version_requirement_spec.rb +25 -11
  148. metadata +149 -133
  149. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  150. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +0 -35
  151. data/rakelib/stage.rake~ +0 -213
@@ -20,7 +20,7 @@ module Buildr::Groovy
20
20
  # To use in your project:
21
21
  #
22
22
  # test.using :easyb
23
- #
23
+ #
24
24
  # This framework will search in your project for:
25
25
  # src/spec/groovy/**/*Story.groovy
26
26
  # src/spec/groovy/**/*Specification.groovy
@@ -69,7 +69,7 @@ module Buildr::Groovy
69
69
 
70
70
  def run(tests, dependencies) #:nodoc:
71
71
  options = { :format => :txt }.merge(self.options).only(*OPTIONS)
72
-
72
+
73
73
  if :txt == options[:format]
74
74
  easyb_format, ext = 'txtstory', '.txt'
75
75
  elsif :xml == options[:format]
@@ -77,7 +77,7 @@ module Buildr::Groovy
77
77
  else
78
78
  raise "Invalid format #{options[:format]} expected one of :txt :xml"
79
79
  end
80
-
80
+
81
81
  cmd_args = [ 'org.disco.easyb.BehaviorRunner' ]
82
82
  cmd_options = { :properties => options[:properties],
83
83
  :java_args => options[:java_args],
@@ -98,9 +98,9 @@ module Buildr::Groovy
98
98
  end
99
99
  end
100
100
  end
101
-
101
+
102
102
  end # EasyB
103
-
103
+
104
104
  end
105
105
 
106
106
  Buildr::TestFramework << Buildr::Groovy::EasyB
@@ -33,9 +33,9 @@ module Buildr::Groovy
33
33
  # * :encoding -- Encoding of source files
34
34
  # * :verbose -- Asks the compiler for verbose output, true when running in verbose mode.
35
35
  # * :fork -- Whether to execute groovyc using a spawned instance of the JVM; defaults to no
36
- # * :memoryInitialSize -- The initial size of the memory for the underlying VM, if using fork mode; ignored otherwise.
36
+ # * :memoryInitialSize -- The initial size of the memory for the underlying VM, if using fork mode; ignored otherwise.
37
37
  # Defaults to the standard VM memory setting. (Examples: 83886080, 81920k, or 80m)
38
- # * :memoryMaximumSize -- The maximum size of the memory for the underlying VM, if using fork mode; ignored otherwise.
38
+ # * :memoryMaximumSize -- The maximum size of the memory for the underlying VM, if using fork mode; ignored otherwise.
39
39
  # Defaults to the standard VM memory setting. (Examples: 83886080, 81920k, or 80m)
40
40
  # * :listfiles -- Indicates whether the source files to be compiled will be listed; defaults to no
41
41
  # * :stacktrace -- If true each compile error message will contain a stacktrace
@@ -49,20 +49,20 @@ module Buildr::Groovy
49
49
  # * :javac -- Hash of options passed to the ant javac task
50
50
  #
51
51
  class Groovyc < Compiler::Base
52
-
52
+
53
53
  # The groovyc compiler jars are added to classpath at load time,
54
54
  # if you want to customize artifact versions, you must set them on the
55
55
  #
56
- # artifact_ns['Buildr::Compiler::Groovyc'].groovy = '1.5.4'
56
+ # artifact_ns['Buildr::Compiler::Groovyc'].groovy = '1.7.1'
57
57
  #
58
58
  # namespace before this file is required.
59
59
  REQUIRES = ArtifactNamespace.for(self) do |ns|
60
- ns.groovy! 'org.codehaus.groovy:groovy:jar:>=1.5.3'
61
- ns.commons_cli! 'commons-cli:commons-cli:jar:>=1.0'
62
- ns.asm! 'asm:asm:jar:>=2.2'
60
+ ns.groovy! 'org.codehaus.groovy:groovy:jar:>=1.7.1'
61
+ ns.commons_cli! 'commons-cli:commons-cli:jar:>=1.2'
62
+ ns.asm! 'asm:asm:jar:>=3.2'
63
63
  ns.antlr! 'antlr:antlr:jar:>=2.7.7'
64
64
  end
65
-
65
+
66
66
  ANT_TASK = 'org.codehaus.groovy.ant.Groovyc'
67
67
  GROOVYC_OPTIONS = [:encoding, :verbose, :fork, :memoryInitialSize, :memoryMaximumSize, :listfiles, :stacktrace]
68
68
  JAVAC_OPTIONS = [:optimise, :warnings, :debug, :deprecation, :source, :target, :javac]
@@ -80,10 +80,14 @@ module Buildr::Groovy
80
80
  paths.any? { |path| !Dir["#{path}/**/*.groovy"].empty? }
81
81
  end
82
82
  end
83
-
84
- Java.classpath << dependencies
85
-
86
- specify :language => :groovy, :sources => [:groovy, :java], :source_ext => [:groovy, :java],
83
+
84
+ # Groovy dependencies don't need to go into JVM's system classpath.
85
+ # In fact, if they end up there it causes trouble because Groovy has issues
86
+ # loading other classes such as test frameworks (e.g. JUnit).
87
+ #
88
+ # Java.classpath << lambda { dependencies }
89
+
90
+ specify :language => :groovy, :sources => [:groovy, :java], :source_ext => [:groovy, :java],
87
91
  :target => 'classes', :target_ext => 'class', :packaging => :jar
88
92
 
89
93
  def initialize(project, options) #:nodoc:
@@ -100,7 +104,7 @@ module Buildr::Groovy
100
104
  def compile(sources, target, dependencies) #:nodoc:
101
105
  return if Buildr.application.options.dryrun
102
106
  Buildr.ant 'groovyc' do |ant|
103
- classpath = dependencies | self.class.dependencies.map(&:to_s)
107
+ classpath = dependencies
104
108
  ant.taskdef :name => 'groovyc', :classname => ANT_TASK, :classpath => classpath.join(File::PATH_SEPARATOR)
105
109
  ant.groovyc groovyc_options(sources, target) do
106
110
  sources.each { |src| ant.src :path => src }
@@ -112,7 +116,7 @@ module Buildr::Groovy
112
116
  end
113
117
  end
114
118
 
115
- private
119
+ private
116
120
  def groovyc_options(sources, target)
117
121
  check_options options, OPTIONS
118
122
  groovyc_options = options.to_hash.only(*GROOVYC_OPTIONS)
@@ -129,7 +133,7 @@ module Buildr::Groovy
129
133
  javac_options.merge!(other)
130
134
  javac_options
131
135
  end
132
-
136
+
133
137
  end
134
138
  end
135
139
 
@@ -19,24 +19,24 @@ module Buildr
19
19
  module Groovy
20
20
  class GroovySH < Buildr::Shell::Base
21
21
  SUFFIX = if Util.win_os? then '.bat' else '' end
22
-
22
+
23
23
  class << self
24
24
  def lang
25
25
  :groovy
26
26
  end
27
27
  end
28
-
28
+
29
29
  def launch
30
30
  fail 'Are we forgetting something? GROOVY_HOME not set.' unless groovy_home
31
-
32
- cp = project.compile.dependencies.join(File::PATH_SEPARATOR) +
31
+
32
+ cp = project.compile.dependencies.join(File::PATH_SEPARATOR) +
33
33
  File::PATH_SEPARATOR + project.path_to(:target, :classes)
34
-
34
+
35
35
  cmd_args = " -classpath '#{cp}'"
36
36
  trace "groovysh #{cmd_args}"
37
37
  system(File.expand_path("bin#{File::SEPARATOR}groovysh#{SUFFIX}", groovy_home) + cmd_args)
38
38
  end
39
-
39
+
40
40
  private
41
41
  def groovy_home
42
42
  @home ||= ENV['GROOVY_HOME']
@@ -31,6 +31,29 @@ module Buildr
31
31
  @options = Options.new(project)
32
32
  end
33
33
 
34
+ # :call-seq:
35
+ # classpath_variables { :VAR => '/path/to/location' }
36
+ # Sets classpath variables to be used for library path substitution
37
+ # on the project.
38
+ #
39
+ def classpath_variables(*values)
40
+ fail "eclipse.classpath_variables expects a single hash argument" if values.size > 1
41
+ if values.size == 1
42
+ fail "eclipse.classpath_variables expects a Hash argument" unless values[0].is_a? Hash
43
+ # convert keys to strings
44
+ values = values[0].inject({}) { |h, (k,v)| h[k.to_s] = @project.path_to(v); h }
45
+ @variables = values.merge(@variables || {})
46
+ end
47
+ @variables || (@project.parent ? @project.parent.eclipse.classpath_variables : default_classpath_variables)
48
+ end
49
+
50
+ def default_classpath_variables
51
+ vars = {}
52
+ vars[:SCALA_HOME] = ENV['SCALA_HOME'] if ENV['SCALA_HOME']
53
+ vars[:JAVA_HOME] = ENV['JAVA_HOME'] if ENV['JAVA_HOME']
54
+ vars
55
+ end
56
+
34
57
  # :call-seq:
35
58
  # natures=(natures)
36
59
  # Sets the Eclipse project natures on the project.
@@ -49,7 +72,7 @@ module Buildr
49
72
  def natures(*values)
50
73
  if values.size > 0
51
74
  @natures ||= []
52
- @natures += values
75
+ @natures += values.flatten
53
76
  else
54
77
  @natures || (@project.parent ? @project.parent.eclipse.natures : [])
55
78
  end
@@ -74,12 +97,32 @@ module Buildr
74
97
  def classpath_containers(*values)
75
98
  if values.size > 0
76
99
  @classpath_containers ||= []
77
- @classpath_containers += values
100
+ @classpath_containers += values.flatten
78
101
  else
79
102
  @classpath_containers || (@project.parent ? @project.parent.eclipse.classpath_containers : [])
80
103
  end
81
104
  end
82
105
 
106
+ # :call-seq:
107
+ # exclude_libs() => [lib1, lib2]
108
+ # Returns the an array of libraries to be excluded from the generated Eclipse classpath
109
+ def exclude_libs(*values)
110
+ if values.size > 0
111
+ @exclude_libs ||= []
112
+ @exclude_libs += values.flatten
113
+ else
114
+ @exclude_libs || (@project.parent ? @project.parent.eclipse.exclude_libs : [])
115
+ end
116
+ end
117
+
118
+ # :call-seq:
119
+ # exclude_libs=(lib1, lib2)
120
+ # Sets libraries to be excluded from the generated Eclipse classpath
121
+ #
122
+ def exclude_libs=(libs)
123
+ @exclude_libs = arrayfy(libs)
124
+ end
125
+
83
126
  # :call-seq:
84
127
  # builders=(builders)
85
128
  # Sets the Eclipse project builders on the project.
@@ -98,7 +141,7 @@ module Buildr
98
141
  def builders(*values)
99
142
  if values.size > 0
100
143
  @builders ||= []
101
- @builders += values
144
+ @builders += values.flatten
102
145
  else
103
146
  @builders || (@project.parent ? @project.parent.eclipse.builders : [])
104
147
  end
@@ -147,80 +190,99 @@ module Buildr
147
190
  project.recursive_task('eclipse')
148
191
  end
149
192
 
150
- after_define do |project|
151
- eclipse = project.task('eclipse')
152
-
153
- eclipse.enhance [ file(project.path_to('.classpath')), file(project.path_to('.project')) ]
154
-
155
- # The only thing we need to look for is a change in the Buildfile.
156
- file(project.path_to('.classpath')=>Buildr.application.buildfile) do |task|
157
- if (project.eclipse.natures.reject { |x| x.is_a?(Symbol) }.size > 0)
158
- info "Writing #{task.name}"
159
-
160
- m2repo = Buildr::Repositories.instance.local
161
-
162
- File.open(task.name, 'w') do |file|
163
- classpathentry = ClasspathEntryWriter.new project, file
164
- classpathentry.write do
165
- # Note: Use the test classpath since Eclipse compiles both "main" and "test" classes using the same classpath
166
- cp = project.test.compile.dependencies.map(&:to_s) - [ project.compile.target.to_s, project.resources.target.to_s ]
167
- cp = cp.uniq
193
+ after_define(:eclipse => :package) do |project|
194
+ # Need to enhance because using project.projects during load phase of the
195
+ # buildfile has harmful side-effects on project definition order
196
+ project.enhance do
197
+ eclipse = project.task('eclipse')
198
+ # We don't create the .project and .classpath files if the project contains projects.
199
+ if project.projects.empty?
200
+
201
+ eclipse.enhance [ file(project.path_to('.classpath')), file(project.path_to('.project')) ]
202
+
203
+ # The only thing we need to look for is a change in the Buildfile.
204
+ file(project.path_to('.classpath')=>Buildr.application.buildfile) do |task|
205
+ if (project.eclipse.natures.reject { |x| x.is_a?(Symbol) }.size > 0)
206
+ info "Writing #{task.name}"
207
+
208
+ m2repo = Buildr::Repositories.instance.local
209
+
210
+ File.open(task.name, 'w') do |file|
211
+ classpathentry = ClasspathEntryWriter.new project, file
212
+ classpathentry.write do
213
+ # Note: Use the test classpath since Eclipse compiles both "main" and "test" classes using the same classpath
214
+ cp = project.test.compile.dependencies.map(&:to_s) - [ project.compile.target.to_s, project.resources.target.to_s ]
215
+ cp = cp.uniq
216
+
217
+ # Convert classpath elements into applicable Project objects
218
+ cp.collect! { |path| Buildr.projects.detect { |prj| prj.packages.detect { |pkg| pkg.to_s == path } } || path }
219
+
220
+ # Remove excluded libs
221
+ cp -= project.eclipse.exclude_libs.map(&:to_s)
222
+
223
+ # project_libs: artifacts created by other projects
224
+ project_libs, others = cp.partition { |path| path.is_a?(Project) }
225
+
226
+ # Separate artifacts under known classpath variable paths
227
+ # including artifacts located in local Maven2 repository
228
+ vars = []
229
+ project.eclipse.classpath_variables.merge(project.eclipse.options.m2_repo_var => m2repo).each do |name, path|
230
+ matching, others = others.partition { |f| File.expand_path(f.to_s).index(path) == 0 }
231
+ matching.each do |m|
232
+ vars << [m, name, path]
233
+ end
234
+ end
168
235
 
169
- # Convert classpath elements into applicable Project objects
170
- cp.collect! { |path| Buildr.projects.detect { |prj| prj.packages.detect { |pkg| pkg.to_s == path } } || path }
236
+ # Generated: Any non-file classpath elements in the project are assumed to be generated
237
+ libs, generated = others.partition { |path| File.file?(path.to_s) }
171
238
 
172
- # project_libs: artifacts created by other projects
173
- project_libs, others = cp.partition { |path| path.is_a?(Project) }
239
+ classpathentry.src project.compile.sources + generated
240
+ classpathentry.src project.resources
174
241
 
175
- # Separate artifacts from Maven2 repository
176
- m2_libs, others = others.partition { |path| path.to_s.index(m2repo) == 0 }
242
+ if project.test.compile.target
243
+ classpathentry.src project.test.compile
244
+ classpathentry.src project.test.resources
245
+ end
177
246
 
178
- # Generated: Any non-file classpath elements in the project are assumed to be generated
179
- libs, generated = others.partition { |path| File.file?(path.to_s) }
247
+ # Classpath elements from other projects
248
+ classpathentry.src_projects project_libs
180
249
 
181
- classpathentry.src project.compile.sources + generated
182
- classpathentry.src project.resources
250
+ classpathentry.output project.compile.target if project.compile.target
251
+ classpathentry.lib libs
252
+ classpathentry.var vars
183
253
 
184
- if project.test.compile.target
185
- classpathentry.src project.test.compile
186
- classpathentry.src project.test.resources
254
+ project.eclipse.classpath_containers.each { |container|
255
+ classpathentry.con container
256
+ }
257
+ end
187
258
  end
188
-
189
- # Classpath elements from other projects
190
- classpathentry.src_projects project_libs
191
-
192
- classpathentry.output project.compile.target if project.compile.target
193
- classpathentry.lib libs
194
- classpathentry.var m2_libs, project.eclipse.options.m2_repo_var, m2repo
195
-
196
- project.eclipse.classpath_containers.each { |container|
197
- classpathentry.con container
198
- }
199
259
  end
200
260
  end
201
- end
202
- end
203
261
 
204
- # The only thing we need to look for is a change in the Buildfile.
205
- file(project.path_to('.project')=>Buildr.application.buildfile) do |task|
206
- if (project.eclipse.natures.reject { |x| x.is_a?(Symbol) }.size > 0)
207
- info "Writing #{task.name}"
208
- File.open(task.name, 'w') do |file|
209
- xml = Builder::XmlMarkup.new(:target=>file, :indent=>2)
210
- xml.projectDescription do
211
- xml.name project.id
212
- xml.projects
213
- xml.buildSpec do
214
- project.eclipse.builders.each { |builder|
215
- xml.buildCommand do
216
- xml.name builder
262
+ # The only thing we need to look for is a change in the Buildfile.
263
+ file(project.path_to('.project')=>Buildr.application.buildfile) do |task|
264
+ info "Writing #{task.name}"
265
+ File.open(task.name, 'w') do |file|
266
+ xml = Builder::XmlMarkup.new(:target=>file, :indent=>2)
267
+ xml.projectDescription do
268
+ xml.name project.id
269
+ xml.projects
270
+ unless project.eclipse.builders.empty?
271
+ xml.buildSpec do
272
+ project.eclipse.builders.each { |builder|
273
+ xml.buildCommand do
274
+ xml.name builder
275
+ end
276
+ }
217
277
  end
218
- }
219
- end
220
- xml.natures do
221
- project.eclipse.natures.each { |nature|
222
- xml.nature nature unless nature.is_a? Symbol
223
- }
278
+ end
279
+ unless project.eclipse.natures.empty?
280
+ xml.natures do
281
+ project.eclipse.natures.each { |nature|
282
+ xml.nature nature unless nature.is_a? Symbol
283
+ }
284
+ end
285
+ end
224
286
  end
225
287
  end
226
288
  end
@@ -251,7 +313,7 @@ module Buildr
251
313
 
252
314
  def lib libs
253
315
  libs.map(&:to_s).sort.uniq.each do |path|
254
- @xml.classpathentry :kind=>'lib', :path=>path
316
+ @xml.classpathentry :kind=>'lib', :path=>relative(path)
255
317
  end
256
318
  end
257
319
 
@@ -282,24 +344,35 @@ module Buildr
282
344
  # * +var_name+ is a variable name as defined in Eclipse (e.g., 'M2_REPO').
283
345
  # * +var_value+ is the value of this variable (e.g., '/home/me/.m2').
284
346
  # E.g., <tt>var([lib1, lib2], 'M2_REPO', '/home/me/.m2/repo')</tt>
285
- def var libs, var_name, var_value
286
- libs.each do |lib_path|
347
+ def var(libs)
348
+ libs.each do |lib_path, var_name, var_value|
287
349
  lib_artifact = file(lib_path)
288
- source_path = lib_artifact.sources_artifact.to_s
289
- relative_lib_path = lib_path.sub(var_value, var_name)
290
- relative_source_path = source_path.sub(var_value, var_name)
291
- @xml.classpathentry :kind=>'var', :path=>relative_lib_path, :sourcepath=>relative_source_path
350
+ relative_lib_path = lib_path.sub(var_value, var_name.to_s)
351
+ if lib_artifact.respond_to? :sources_artifact
352
+ source_path = lib_artifact.sources_artifact.to_s
353
+ relative_source_path = source_path.sub(var_value, var_name)
354
+ @xml.classpathentry :kind=>'var', :path=>relative_lib_path, :sourcepath=>relative_source_path
355
+ else
356
+ @xml.classpathentry :kind=>'var', :path=>relative_lib_path
357
+ end
292
358
  end
293
359
  end
294
360
 
295
361
  private
296
362
 
297
- # Find a path relative to the project's root directory.
363
+ # Find a path relative to the project's root directory if possible. If the
364
+ # two paths do not share the same root the absolute path is returned. This
365
+ # can happen on Windows, for instance, when the two paths are not on the
366
+ # same drive.
298
367
  def relative path
299
368
  path or raise "Invalid path '#{path.inspect}'"
300
369
  msg = [:to_path, :to_str, :to_s].find { |msg| path.respond_to? msg }
301
370
  path = path.__send__(msg)
302
- Util.relative_path(File.expand_path(path), @project.path_to)
371
+ begin
372
+ Util.relative_path(File.expand_path(path), @project.path_to)
373
+ rescue ArgumentError
374
+ File.expand_path(path)
375
+ end
303
376
  end
304
377
 
305
378
  def src_from_task task
@@ -38,9 +38,9 @@ module Buildr
38
38
 
39
39
  # :java nature explicitly set
40
40
  if eclipse.natures.include? :java
41
- eclipse.natures += NATURE unless eclipse.natures.include? NATURE
42
- eclipse.classpath_containers += CONTAINER unless eclipse.classpath_containers.include? CONTAINER
43
- eclipse.builders += BUILDER unless eclipse.builders.include? BUILDER
41
+ eclipse.natures += [NATURE] unless eclipse.natures.include? NATURE
42
+ eclipse.classpath_containers += [CONTAINER] unless eclipse.classpath_containers.include? CONTAINER
43
+ eclipse.builders += [BUILDER] unless eclipse.builders.include? BUILDER
44
44
  end
45
45
  end
46
46