buildr 1.3.3-java → 1.3.4-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/CHANGELOG +76 -0
  2. data/NOTICE +1 -1
  3. data/README.rdoc +9 -21
  4. data/Rakefile +17 -34
  5. data/_buildr +3 -12
  6. data/{doc/print.toc.yaml → _jbuildr} +14 -14
  7. data/addon/buildr/cobertura.rb +5 -219
  8. data/addon/buildr/drb.rb +281 -0
  9. data/addon/buildr/emma.rb +5 -221
  10. data/addon/buildr/nailgun.rb +93 -689
  11. data/bin/buildr +0 -9
  12. data/buildr.buildfile +4 -4
  13. data/buildr.gemspec +27 -21
  14. data/doc/_layouts/default.html +82 -0
  15. data/doc/_layouts/preface.html +22 -0
  16. data/doc/{pages/artifacts.textile → artifacts.textile} +82 -42
  17. data/doc/{pages/building.textile → building.textile} +89 -47
  18. data/doc/{pages/contributing.textile → contributing.textile} +53 -45
  19. data/doc/css/default.css +6 -5
  20. data/doc/css/print.css +17 -24
  21. data/doc/css/syntax.css +7 -36
  22. data/doc/download.textile +68 -0
  23. data/doc/{pages/extending.textile → extending.textile} +45 -24
  24. data/doc/{pages/getting_started.textile → getting_started.textile} +158 -88
  25. data/doc/images/asf-logo.gif +0 -0
  26. data/doc/images/note.png +0 -0
  27. data/doc/index.textile +47 -0
  28. data/doc/{pages/languages.textile → languages.textile} +108 -54
  29. data/doc/mailing_lists.textile +25 -0
  30. data/doc/{pages/more_stuff.textile → more_stuff.textile} +152 -73
  31. data/doc/{pages/packaging.textile → packaging.textile} +181 -96
  32. data/doc/preface.textile +28 -0
  33. data/doc/{pages/projects.textile → projects.textile} +55 -40
  34. data/doc/scripts/buildr-git.rb +364 -264
  35. data/doc/scripts/gitflow.rb +296 -0
  36. data/doc/scripts/install-jruby.sh +2 -2
  37. data/doc/scripts/install-linux.sh +6 -6
  38. data/doc/scripts/install-osx.sh +2 -2
  39. data/doc/{pages/settings_profiles.textile → settings_profiles.textile} +83 -45
  40. data/doc/{pages/testing.textile → testing.textile} +77 -41
  41. data/lib/buildr.rb +5 -5
  42. data/lib/buildr/core.rb +2 -0
  43. data/lib/buildr/core/application.rb +321 -151
  44. data/lib/buildr/core/build.rb +298 -167
  45. data/lib/buildr/core/checks.rb +4 -132
  46. data/lib/buildr/core/common.rb +1 -5
  47. data/lib/buildr/core/compile.rb +3 -9
  48. data/lib/buildr/core/environment.rb +12 -3
  49. data/lib/buildr/core/filter.rb +20 -18
  50. data/lib/buildr/core/generate.rb +36 -36
  51. data/lib/buildr/core/help.rb +2 -1
  52. data/lib/buildr/core/osx.rb +46 -0
  53. data/lib/buildr/core/progressbar.rb +1 -1
  54. data/lib/buildr/core/project.rb +7 -34
  55. data/lib/buildr/core/test.rb +12 -6
  56. data/lib/buildr/core/transports.rb +13 -11
  57. data/lib/buildr/core/util.rb +14 -23
  58. data/lib/buildr/groovy/bdd.rb +3 -2
  59. data/lib/buildr/groovy/compiler.rb +1 -1
  60. data/lib/buildr/ide/eclipse.rb +31 -21
  61. data/lib/buildr/ide/idea.rb +3 -2
  62. data/lib/buildr/ide/idea7x.rb +6 -4
  63. data/lib/buildr/java/ant.rb +3 -1
  64. data/lib/buildr/java/bdd.rb +9 -7
  65. data/lib/buildr/java/cobertura.rb +243 -0
  66. data/lib/buildr/java/compiler.rb +5 -4
  67. data/lib/buildr/java/emma.rb +244 -0
  68. data/lib/buildr/java/packaging.rb +11 -8
  69. data/lib/buildr/java/pom.rb +0 -4
  70. data/lib/buildr/java/rjb.rb +1 -1
  71. data/lib/buildr/java/test_result.rb +5 -7
  72. data/lib/buildr/java/tests.rb +17 -11
  73. data/lib/buildr/packaging.rb +5 -2
  74. data/lib/buildr/packaging/archive.rb +488 -0
  75. data/lib/buildr/packaging/artifact.rb +48 -29
  76. data/lib/buildr/packaging/artifact_namespace.rb +6 -6
  77. data/lib/buildr/packaging/gems.rb +4 -4
  78. data/lib/buildr/packaging/package.rb +3 -2
  79. data/lib/buildr/packaging/tar.rb +85 -3
  80. data/lib/buildr/packaging/version_requirement.rb +172 -0
  81. data/lib/buildr/packaging/zip.rb +24 -682
  82. data/lib/buildr/packaging/ziptask.rb +313 -0
  83. data/lib/buildr/scala.rb +5 -0
  84. data/lib/buildr/scala/bdd.rb +100 -0
  85. data/lib/buildr/scala/compiler.rb +45 -4
  86. data/lib/buildr/scala/tests.rb +12 -59
  87. data/rakelib/checks.rake +57 -0
  88. data/rakelib/doc.rake +58 -68
  89. data/rakelib/jekylltask.rb +110 -0
  90. data/rakelib/package.rake +35 -37
  91. data/rakelib/release.rake +119 -35
  92. data/rakelib/rspec.rake +29 -39
  93. data/rakelib/setup.rake +21 -59
  94. data/rakelib/stage.rake +184 -26
  95. data/spec/addon/drb_spec.rb +328 -0
  96. data/spec/core/application_spec.rb +32 -25
  97. data/spec/core/build_spec.rb +336 -126
  98. data/spec/core/checks_spec.rb +292 -310
  99. data/spec/core/common_spec.rb +8 -2
  100. data/spec/core/compile_spec.rb +17 -1
  101. data/spec/core/generate_spec.rb +3 -3
  102. data/spec/core/project_spec.rb +18 -10
  103. data/spec/core/test_spec.rb +8 -1
  104. data/spec/core/transport_spec.rb +40 -3
  105. data/spec/core/util_spec.rb +67 -0
  106. data/spec/ide/eclipse_spec.rb +96 -28
  107. data/spec/ide/idea7x_spec.rb +84 -0
  108. data/spec/java/ant.rb +5 -0
  109. data/spec/java/bdd_spec.rb +12 -3
  110. data/spec/{addon → java}/cobertura_spec.rb +6 -6
  111. data/spec/{addon → java}/emma_spec.rb +5 -6
  112. data/spec/java/java_spec.rb +12 -2
  113. data/spec/java/packaging_spec.rb +31 -2
  114. data/spec/{addon → java}/test_coverage_spec.rb +3 -3
  115. data/spec/java/tests_spec.rb +5 -0
  116. data/spec/packaging/archive_spec.rb +11 -1
  117. data/spec/{core → packaging}/artifact_namespace_spec.rb +10 -2
  118. data/spec/packaging/artifact_spec.rb +44 -3
  119. data/spec/packaging/packaging_spec.rb +1 -1
  120. data/spec/sandbox.rb +17 -14
  121. data/spec/scala/bdd_spec.rb +150 -0
  122. data/spec/scala/compiler_spec.rb +27 -0
  123. data/spec/scala/scala.rb +38 -0
  124. data/spec/scala/tests_spec.rb +78 -33
  125. data/spec/spec_helpers.rb +29 -5
  126. data/spec/version_requirement_spec.rb +6 -0
  127. metadata +176 -172
  128. data/DISCLAIMER +0 -7
  129. data/doc/images/apache-incubator-logo.png +0 -0
  130. data/doc/pages/download.textile +0 -51
  131. data/doc/pages/index.textile +0 -42
  132. data/doc/pages/mailing_lists.textile +0 -17
  133. data/doc/pages/recipes.textile +0 -103
  134. data/doc/pages/troubleshooting.textile +0 -103
  135. data/doc/pages/whats_new.textile +0 -323
  136. data/doc/print.haml +0 -51
  137. data/doc/site.haml +0 -56
  138. data/doc/site.toc.yaml +0 -47
  139. data/etc/git-svn-authors +0 -16
  140. data/lib/buildr/core/application_cli.rb +0 -139
  141. data/rakelib/apache.rake +0 -191
  142. data/rakelib/changelog.rake +0 -57
  143. data/rakelib/rubyforge.rake +0 -53
  144. data/rakelib/scm.rake +0 -49
@@ -153,4 +153,4 @@ protected
153
153
  @total == 0 ? ['%s %8s %s', :title, :count, :elapsed] : ['%s: %s |--| %8s/%s %s', :title, :percentage, :count, :total, :time]
154
154
  end
155
155
 
156
- end
156
+ end
@@ -240,18 +240,19 @@ module Buildr
240
240
  rake_check_options options, :scope if options
241
241
  raise ArgumentError, 'Only one project name at a time' unless args.size == 1
242
242
  @projects ||= {}
243
- name = args.first
243
+ name = args.first.to_s
244
+ # Make sure parent project is evaluated (e.g. if looking for foo:bar, find foo first)
245
+ unless @projects[name]
246
+ parts = name.split(':')
247
+ project(parts.first, options || {}) if parts.size > 1
248
+ end
244
249
  if options && options[:scope]
245
250
  # We assume parent project is evaluated.
246
251
  project = options[:scope].split(':').inject([[]]) { |scopes, scope| scopes << (scopes.last + [scope]) }.
247
252
  map { |scope| @projects[(scope + [name]).join(':')] }.
248
253
  select { |project| project }.last
249
254
  end
250
- unless project
251
- # Parent project not evaluated.
252
- name.split(':').tap { |parts| @projects[parts.first].invoke if parts.size > 1 }
253
- project = @projects[name]
254
- end
255
+ project ||= @projects[name] # Not found in scope.
255
256
  raise "No such project #{name}" unless project
256
257
  project.invoke
257
258
  project
@@ -861,32 +862,4 @@ module Buildr
861
862
  Project.projects *args
862
863
  end
863
864
 
864
- # Forces all the projects to be evaluated before executing any other task.
865
- # If we don't do that, we don't get to have tasks available when running Rake.
866
- namespace 'buildr' do
867
- task 'initialize' do
868
- projects
869
- end
870
-
871
- desc "Freeze the Buildfile so it always uses Buildr version #{Buildr::VERSION}"
872
- task 'freeze' do
873
- puts "Freezing the Buildfile so it always uses Buildr version #{Buildr::VERSION}"
874
- original = File.read(Buildr.application.buildfile)
875
- if original =~ /gem\s*(["'])buildr\1/
876
- modified = original.sub(/gem\s*(["'])buildr\1\s*,\s*(["']).*\2/, %{gem "buildr", "#{Buildr::VERSION}"})
877
- else
878
- modified = %{gem "buildr", "#{Buildr::VERSION}"\n} + original
879
- end
880
- File.open(Buildr.application.buildfile, "w") { |file| file.write modified }
881
- end
882
-
883
- desc 'Unfreeze the Buildfile to use the latest version of Buildr'
884
- task 'unfreeze' do
885
- puts 'Unfreezing the Buildfile to use the latest version of Buildr from your Gems repository.'
886
- modified = File.read(Buildr.application.buildfile).sub(/^\s*gem\s*(["'])buildr\1.*\n/, "")
887
- File.open(Buildr.application.buildfile, "w") { |file| file.write modified }
888
- end
889
- end
890
-
891
-
892
865
  end
@@ -442,7 +442,13 @@ module Buildr
442
442
  @passed_tests, @failed_tests = [], []
443
443
  else
444
444
  info "Running tests in #{@project.name}"
445
- @passed_tests = @framework.run(@tests, dependencies)
445
+ begin
446
+ @passed_tests = @framework.run(@tests, dependencies)
447
+ rescue Exception=>ex
448
+ error "Test framework error: #{ex.message}"
449
+ error ex.backtrace.join("\n") if Buildr.application.options.trace
450
+ @passed_tests = []
451
+ end
446
452
  @failed_tests = @tests - @passed_tests
447
453
  unless @failed_tests.empty?
448
454
  error "The following tests failed:\n#{@failed_tests.join("\n")}"
@@ -592,8 +598,8 @@ module Buildr
592
598
  project.build test unless test.options[:integration]
593
599
 
594
600
  project.clean do
595
- rm_rf test.compile.target.to_s, :verbose=>false if test.compile.target
596
- rm_rf test.report_to.to_s, :verbose=>false
601
+ rm_rf test.compile.target.to_s if test.compile.target
602
+ rm_rf test.report_to.to_s
597
603
  end
598
604
  end
599
605
 
@@ -629,9 +635,9 @@ module Buildr
629
635
  # Use this method to return the integration tests task, or enhance it with a block to execute.
630
636
  #
631
637
  # There is one integration tests task you can execute directly, or as a result of running the package
632
- # task (or tasks that depend on it, like install and deploy). It contains all the tests marked with
638
+ # task (or tasks that depend on it, like install and upload). It contains all the tests marked with
633
639
  # :integration=>true, all other tests are considered unit tests and run by the test task before packaging.
634
- # So essentially: build=>test=>packaging=>integration=>install/deploy.
640
+ # So essentially: build=>test=>packaging=>integration=>install/upload.
635
641
  #
636
642
  # You add new tests from projects that define integration tests using the regular test task,
637
643
  # but with the following addition:
@@ -658,7 +664,7 @@ module Buildr
658
664
  class Options
659
665
 
660
666
  # Runs tests after the build when true (default). This forces tests to execute
661
- # after the build, including when running build related tasks like install, deploy and release.
667
+ # after the build, including when running build related tasks like install, upload and release.
662
668
  #
663
669
  # Set to false to not run any tests. Set to :all to run all tests, ignoring failures.
664
670
  #
@@ -14,18 +14,18 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require 'cgi'
17
+ require 'uri'
18
18
  require 'net/http'
19
- require 'net/https'
19
+ Net.autoload :HTTPS, 'net/https'
20
20
  # PATCH: On Windows, Net::SSH 2.0.2 attempts to load the Pageant DLLs which break on JRuby.
21
21
  $LOADED_FEATURES << 'net/ssh/authentication/pageant.rb' if RUBY_PLATFORM =~ /java/
22
- require 'net/sftp'
23
- require 'uri'
22
+ gem 'net-ssh' ; Net.autoload :SSH, 'net/ssh'
23
+ gem 'net-sftp' ; Net.autoload :SFTP, 'net/sftp'
24
+ autoload :CGI, 'cgi'
24
25
  require 'digest/md5'
25
26
  require 'digest/sha1'
26
27
  require 'stringio'
27
- require 'tempfile'
28
- require 'buildr/core/progressbar'
28
+ autoload :ProgressBar, 'buildr/core/progressbar'
29
29
 
30
30
 
31
31
  # Not quite open-uri, but similar. Provides read and write methods for the resource represented by the URI.
@@ -37,8 +37,8 @@ module URI
37
37
  class NotFoundError < RuntimeError
38
38
  end
39
39
 
40
- # How many bytes to read/write at once.
41
- RW_CHUNK_SIZE = 2 ** 20 #:nodoc:
40
+ # How many bytes to read/write at once. Do not change without checking BUILDR-214 first.
41
+ RW_CHUNK_SIZE = 128 * 1024 #:nodoc:
42
42
 
43
43
  class << self
44
44
 
@@ -154,7 +154,7 @@ module URI
154
154
  read({:progress=>verbose}.merge(options || {}).merge(:modified=>modified)) { |chunk| temp.write chunk }
155
155
  end
156
156
  mkpath File.dirname(target)
157
- File.move temp.path, target
157
+ mv temp.path, target
158
158
  when File
159
159
  read({:progress=>verbose}.merge(options || {}).merge(:modified=>target.mtime)) { |chunk| target.write chunk }
160
160
  target.flush
@@ -289,7 +289,9 @@ module URI
289
289
  when Net::HTTPRedirection
290
290
  # Try to download from the new URI, handle relative redirects.
291
291
  trace "Redirected to #{response['Location']}"
292
- return (self + URI.parse(response['location'])).read(options, &block)
292
+ rself = self + URI.parse(response['Location'])
293
+ rself.user, rself.password = self.user, self.password
294
+ return rself.read(options, &block)
293
295
  when Net::HTTPOK
294
296
  info "Downloading #{self}"
295
297
  result = nil
@@ -547,7 +549,7 @@ module URI
547
549
  end
548
550
  real_path.tap do |path|
549
551
  mkpath File.dirname(path)
550
- File.move temp.path, path
552
+ mv temp.path, path
551
553
  end
552
554
  end
553
555
 
@@ -16,7 +16,12 @@
16
16
 
17
17
  require 'rbconfig'
18
18
  require 'pathname'
19
- require 'builder' # A different kind of buildr, one we use to create XML.
19
+ autoload :Tempfile, 'tempfile'
20
+ autoload :YAML, 'yaml'
21
+ autoload :REXML, 'rexml/document'
22
+ gem 'xml-simple' ; autoload :XmlSimple, 'xmlsimple'
23
+ gem 'builder' ; autoload :Builder, 'builder' # A different kind of buildr, one we use to create XML.
24
+ require 'highline/import'
20
25
 
21
26
 
22
27
  module Buildr
@@ -31,7 +36,7 @@ module Buildr
31
36
  # In order to determine if we are running on a windows OS,
32
37
  # prefer this function instead of using Gem.win_platform?.
33
38
  #
34
- # Gem.win_platform? only checks the RUBY_PLATFORM global,
39
+ # Gem.win_platform? only checks these RUBY_PLATFORM global,
35
40
  # that in some cases like when running on JRuby is not
36
41
  # succifient for our purpose:
37
42
  #
@@ -55,8 +60,10 @@ module Buildr
55
60
  end
56
61
  cmd << ruby_bin
57
62
  cmd << '-S' << options.delete(:command) if options[:command]
58
- sh *cmd.push(*args.flatten).push(options) do |ok, status|
59
- ok or fail "Command failed with status (#{status ? status.exitstatus : 'unknown'}): [#{cmd.join(" ")}]"
63
+ cmd.concat args.flatten
64
+ cmd.push options
65
+ sh *cmd do |ok, status|
66
+ ok or fail "Command ruby failed with status (#{status ? status.exitstatus : 'unknown'}): [#{cmd.join(" ")}]"
60
67
  end
61
68
  end
62
69
 
@@ -109,7 +116,7 @@ module Buildr
109
116
  end
110
117
 
111
118
  # Utility methods for running gem commands
112
- module Gems
119
+ module Gems #:nodoc:
113
120
  extend self
114
121
 
115
122
  # Install gems specified by each Gem::Dependency if they are missing. This method prompts the user
@@ -186,24 +193,8 @@ end
186
193
  class OpenObject < Hash
187
194
 
188
195
  def initialize(source=nil, &block)
189
- @hash = Hash.new(&block)
190
- @hash.update(source) if source
191
- end
192
-
193
- def [](key)
194
- @hash[key]
195
- end
196
-
197
- def []=(key, value)
198
- @hash[key] = value
199
- end
200
-
201
- def delete(key)
202
- @hash.delete(key)
203
- end
204
-
205
- def to_hash
206
- @hash.clone
196
+ super &block
197
+ update source if source
207
198
  end
208
199
 
209
200
  def method_missing(symbol, *args)
@@ -13,6 +13,7 @@
13
13
  # License for the specific language governing permissions and limitations under
14
14
  # the License.
15
15
 
16
+
16
17
  module Buildr::Groovy
17
18
 
18
19
  # EasyB is a Groovy based BDD framework.
@@ -85,7 +86,7 @@ module Buildr::Groovy
85
86
  tests.inject([]) do |passed, test|
86
87
  name = test.sub(/.*?groovy[\/\\]/, '').pathmap('%X')
87
88
  report = File.join(task.report_to.to_s, name + ext)
88
- mkpath report.pathmap('%d'), :verbose => false
89
+ mkpath report.pathmap('%d')
89
90
  begin
90
91
  Java::Commands.java cmd_args,
91
92
  "-#{easyb_format}", report,
@@ -102,4 +103,4 @@ module Buildr::Groovy
102
103
 
103
104
  end
104
105
 
105
- Buildr::TestFramework << Buildr::Groovy::EasyB
106
+ Buildr::TestFramework << Buildr::Groovy::EasyB
@@ -19,7 +19,7 @@ module Buildr::Groovy
19
19
  # Groovyc compiler:
20
20
  # compile.using(:groovyc)
21
21
  #
22
- # You need to require 'buildr/java/groovyc' if you need to use this compiler.
22
+ # You need to require 'buildr/groovy/compiler' if you need to use this compiler.
23
23
  #
24
24
  # Used by default if .groovy files are found in the src/main/groovy directory (or src/test/groovy)
25
25
  # and sets the target directory to target/classes (or target/test/classes).
@@ -25,16 +25,16 @@ module Buildr
25
25
 
26
26
  first_time do
27
27
  # Global task "eclipse" generates artifacts for all projects.
28
- desc "Generate Eclipse artifacts for all projects"
29
- Project.local_task "eclipse"=>"artifacts"
28
+ desc 'Generate Eclipse artifacts for all projects'
29
+ Project.local_task 'eclipse'=>'artifacts'
30
30
  end
31
31
 
32
32
  before_define do |project|
33
- project.recursive_task("eclipse")
33
+ project.recursive_task('eclipse')
34
34
  end
35
35
 
36
36
  after_define do |project|
37
- eclipse = project.task("eclipse")
37
+ eclipse = project.task('eclipse')
38
38
 
39
39
  # Check if project has scala facet
40
40
  scala = project.compile.language == :scala
@@ -42,17 +42,18 @@ module Buildr
42
42
  # Only for projects that we support
43
43
  supported_languages = [:java, :scala]
44
44
  supported_packaging = %w(jar war rar mar aar)
45
- if (supported_languages.include? project.compile.language ||
45
+ if (supported_languages.include?(project.compile.language) ||
46
+ supported_languages.include?(project.test.compile.language) ||
46
47
  project.packages.detect { |pkg| supported_packaging.include?(pkg.type.to_s) })
47
- eclipse.enhance [ file(project.path_to(".classpath")), file(project.path_to(".project")) ]
48
+ eclipse.enhance [ file(project.path_to('.classpath')), file(project.path_to('.project')) ]
48
49
 
49
50
  # The only thing we need to look for is a change in the Buildfile.
50
- file(project.path_to(".classpath")=>Buildr.application.buildfile) do |task|
51
+ file(project.path_to('.classpath')=>Buildr.application.buildfile) do |task|
51
52
  info "Writing #{task.name}"
52
53
 
53
54
  m2repo = Buildr::Repositories.instance.local
54
55
 
55
- File.open(task.name, "w") do |file|
56
+ File.open(task.name, 'w') do |file|
56
57
  classpathentry = ClasspathEntryWriter.new project, file
57
58
  classpathentry.write do
58
59
  # Note: Use the test classpath since Eclipse compiles both "main" and "test" classes using the same classpath
@@ -82,7 +83,7 @@ module Buildr
82
83
  # Classpath elements from other projects
83
84
  classpathentry.src_projects project_libs
84
85
 
85
- classpathentry.output project.compile.target
86
+ classpathentry.output project.compile.target if project.compile.target
86
87
  classpathentry.lib libs
87
88
  classpathentry.var m2_libs, 'M2_REPO', m2repo
88
89
 
@@ -93,9 +94,9 @@ module Buildr
93
94
  end
94
95
 
95
96
  # The only thing we need to look for is a change in the Buildfile.
96
- file(project.path_to(".project")=>Buildr.application.buildfile) do |task|
97
+ file(project.path_to('.project')=>Buildr.application.buildfile) do |task|
97
98
  info "Writing #{task.name}"
98
- File.open(task.name, "w") do |file|
99
+ File.open(task.name, 'w') do |file|
99
100
  xml = Builder::XmlMarkup.new(:target=>file, :indent=>2)
100
101
  xml.projectDescription do
101
102
  xml.name project.id
@@ -103,17 +104,17 @@ module Buildr
103
104
  xml.buildSpec do
104
105
  if scala
105
106
  xml.buildCommand do
106
- xml.name "ch.epfl.lamp.sdt.core.scalabuilder"
107
+ xml.name 'ch.epfl.lamp.sdt.core.scalabuilder'
107
108
  end
108
109
  else
109
110
  xml.buildCommand do
110
- xml.name "org.eclipse.jdt.core.javabuilder"
111
+ xml.name 'org.eclipse.jdt.core.javabuilder'
111
112
  end
112
113
  end
113
114
  end
114
115
  xml.natures do
115
- xml.nature "ch.epfl.lamp.sdt.core.scalanature" if scala
116
- xml.nature "org.eclipse.jdt.core.javanature"
116
+ xml.nature 'ch.epfl.lamp.sdt.core.scalanature' if scala
117
+ xml.nature 'org.eclipse.jdt.core.javanature'
117
118
  end
118
119
  end
119
120
  end
@@ -126,7 +127,7 @@ module Buildr
126
127
  # It converts tasks to paths.
127
128
  # It converts absolute paths to relative paths.
128
129
  # It ignores duplicate directories.
129
- class ClasspathEntryWriter
130
+ class ClasspathEntryWriter #:nodoc:
130
131
  def initialize project, target
131
132
  @project = project
132
133
  @xml = Builder::XmlMarkup.new(:target=>target, :indent=>2)
@@ -149,7 +150,7 @@ module Buildr
149
150
  end
150
151
 
151
152
  # Write a classpathentry of kind 'src'.
152
- # Accepts an array of absolute paths or a task.
153
+ # Accept an array of absolute paths or a task.
153
154
  def src arg
154
155
  if [:sources, :target].all? { |message| arg.respond_to?(message) }
155
156
  src_from_task arg
@@ -159,10 +160,10 @@ module Buildr
159
160
  end
160
161
 
161
162
  # Write a classpathentry of kind 'src' for dependent projects.
162
- # Accepts an array of projects.
163
+ # Accept an array of projects.
163
164
  def src_projects project_libs
164
165
  project_libs.map(&:id).sort.uniq.each do |project_id|
165
- @xml.classpathentry :kind=>'src', :combineaccessrules=>"false", :path=>"/#{project_id}"
166
+ @xml.classpathentry :kind=>'src', :combineaccessrules=>'false', :path=>"/#{project_id}"
166
167
  end
167
168
  end
168
169
 
@@ -170,9 +171,18 @@ module Buildr
170
171
  @xml.classpathentry :kind=>'output', :path=>relative(target)
171
172
  end
172
173
 
174
+ # Write a classpathentry of kind 'var' (variable) for a library in a local repo.
175
+ # * +libs+ is an array of library paths.
176
+ # * +var_name+ is a variable name as defined in Eclipse (e.g., 'M2_REPO').
177
+ # * +var_value+ is the value of this variable (e.g., '/home/me/.m2').
178
+ # E.g., <tt>var([lib1, lib2], 'M2_REPO', '/home/me/.m2/repo')</tt>
173
179
  def var libs, var_name, var_value
174
- libs.map { |lib| lib.to_s.sub(var_value, var_name) }.sort.uniq.each do |path|
175
- @xml.classpathentry :kind=>'var', :path=>path
180
+ libs.each do |lib_path|
181
+ lib_artifact = file(lib_path)
182
+ source_path = lib_artifact.sources_artifact.to_s
183
+ relative_lib_path = lib_path.sub(var_value, var_name)
184
+ relative_source_path = source_path.sub(var_value, var_name)
185
+ @xml.classpathentry :kind=>'var', :path=>relative_lib_path, :sourcepath=>relative_source_path
176
186
  end
177
187
  end
178
188
 
@@ -17,7 +17,6 @@
17
17
  require 'buildr/core/project'
18
18
  require 'buildr/packaging'
19
19
  require 'stringio'
20
- require 'rexml/document'
21
20
 
22
21
 
23
22
  module Buildr
@@ -130,7 +129,9 @@ module Buildr
130
129
  xml.root :url=>"jar://#{path}!/"
131
130
  end
132
131
  xml.JAVADOC
133
- xml.SOURCES
132
+ xml.SOURCES do
133
+ xml.root :url=>"jar://#{path.sub(/\.jar$/, "-sources.jar")}!/"
134
+ end
134
135
  end
135
136
  end
136
137
  end
@@ -17,7 +17,7 @@
17
17
  require 'buildr/core/project'
18
18
  require 'buildr/packaging'
19
19
  require 'stringio'
20
- require 'rexml/document'
20
+
21
21
 
22
22
  module Buildr
23
23
  module Idea7x #:nodoc:
@@ -160,7 +160,9 @@ module Buildr
160
160
  xml.root :url=> path
161
161
  end
162
162
  xml.JAVADOC
163
- xml.SOURCES
163
+ xml.SOURCES do
164
+ xml.root :url=>"jar://#{path.sub(/\.jar$/, "-sources.jar")}!/"
165
+ end
164
166
  end
165
167
  end
166
168
  end
@@ -179,8 +181,8 @@ module Buildr
179
181
  xml.modules do
180
182
  project.projects.each do |subp|
181
183
  module_name = subp.name.gsub(":", "-")
182
- module_path = subp.name.split(":"); module_path.shift
183
- module_path = module_path.join(File::SEPARATOR)
184
+ module_path = subp.base_dir ? subp.base_dir.gsub(/^#{project.base_dir}\//, '') :
185
+ subp.name.split(":")[1 .. -1].join(FILE::SEPARATOR)
184
186
  path = "#{module_path}/#{module_name}#{IML_SUFFIX}"
185
187
  xml.module :fileurl=>"#{PROJECT_DIR_URL}/#{path}", :filepath=>"#{PROJECT_DIR}/#{path}"
186
188
  end