buildr 1.3.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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/core/application.rb +33 -27
  37. data/lib/buildr/core/build.rb +41 -28
  38. data/lib/buildr/core/cc.rb +172 -0
  39. data/lib/buildr/core/checks.rb +1 -1
  40. data/lib/buildr/core/common.rb +7 -6
  41. data/lib/buildr/core/compile.rb +7 -8
  42. data/lib/buildr/core/doc.rb +263 -0
  43. data/lib/buildr/core/environment.rb +6 -6
  44. data/lib/buildr/core/filter.rb +77 -35
  45. data/lib/buildr/core/generate.rb +7 -7
  46. data/lib/buildr/core/help.rb +1 -1
  47. data/lib/buildr/core/osx.rb +6 -6
  48. data/lib/buildr/core/progressbar.rb +4 -4
  49. data/lib/buildr/core/project.rb +144 -36
  50. data/lib/buildr/core/shell.rb +34 -34
  51. data/lib/buildr/core/test.rb +89 -20
  52. data/lib/buildr/core/transports.rb +8 -7
  53. data/lib/buildr/core/util.rb +77 -23
  54. data/lib/buildr/core.rb +1 -0
  55. data/lib/buildr/groovy/bdd.rb +5 -5
  56. data/lib/buildr/groovy/compiler.rb +19 -15
  57. data/lib/buildr/groovy/shell.rb +6 -6
  58. data/lib/buildr/ide/eclipse/java.rb +3 -3
  59. data/lib/buildr/ide/eclipse/plugin.rb +8 -5
  60. data/lib/buildr/ide/eclipse/scala.rb +4 -2
  61. data/lib/buildr/ide/eclipse.rb +148 -75
  62. data/lib/buildr/ide/idea.rb +2 -2
  63. data/lib/buildr/ide/idea7x.rb +23 -4
  64. data/lib/buildr/java/ant.rb +4 -4
  65. data/lib/buildr/java/bdd.rb +51 -54
  66. data/lib/buildr/java/cobertura.rb +57 -35
  67. data/lib/buildr/java/commands.rb +14 -5
  68. data/lib/buildr/java/compiler.rb +3 -217
  69. data/lib/buildr/java/deprecated.rb +4 -4
  70. data/lib/buildr/java/doc.rb +70 -0
  71. data/lib/buildr/java/emma.rb +22 -22
  72. data/lib/buildr/java/jruby.rb +4 -4
  73. data/lib/buildr/java/jtestr_runner.rb.erb +27 -25
  74. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  75. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +8 -3
  76. data/lib/buildr/java/packaging.rb +30 -29
  77. data/lib/buildr/java/pom.rb +4 -4
  78. data/lib/buildr/java/rjb.rb +6 -6
  79. data/lib/buildr/java/test_result.rb +61 -85
  80. data/lib/buildr/java/tests.rb +44 -27
  81. data/lib/buildr/java/version_requirement.rb +8 -8
  82. data/lib/buildr/java.rb +1 -0
  83. data/lib/buildr/packaging/archive.rb +55 -22
  84. data/lib/buildr/packaging/artifact.rb +75 -36
  85. data/lib/buildr/packaging/artifact_namespace.rb +90 -78
  86. data/lib/buildr/packaging/artifact_search.rb +5 -5
  87. data/lib/buildr/packaging/gems.rb +11 -7
  88. data/lib/buildr/packaging/package.rb +10 -7
  89. data/lib/buildr/packaging/tar.rb +14 -14
  90. data/lib/buildr/packaging/version_requirement.rb +30 -10
  91. data/lib/buildr/packaging/ziptask.rb +51 -13
  92. data/lib/buildr/scala/bdd.rb +25 -20
  93. data/lib/buildr/scala/compiler.rb +87 -40
  94. data/lib/buildr/scala/doc.rb +106 -0
  95. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  96. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.java +57 -0
  97. data/lib/buildr/scala/shell.rb +14 -9
  98. data/lib/buildr/scala/tests.rb +33 -26
  99. data/lib/buildr/scala.rb +1 -0
  100. data/lib/buildr/shell.rb +33 -33
  101. data/lib/buildr.rb +1 -1
  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
@@ -41,7 +41,7 @@ module Buildr
41
41
 
42
42
  def initialize(*args, &block) #:nodoc:
43
43
  super
44
- self.gzip = name =~ /\.[t?]gz$/
44
+ self.gzip = name =~ /\.t?gz$/
45
45
  self.mode = '0755'
46
46
  end
47
47
 
@@ -54,13 +54,13 @@ module Buildr
54
54
  def entry(entry_name)
55
55
  Buildr::TarEntry.new(self, entry_name)
56
56
  end
57
-
57
+
58
58
  def entries() #:nodoc:
59
59
  tar_entries = nil
60
60
  with_uncompressed_tar { |tar| tar_entries = tar.entries }
61
61
  tar_entries
62
62
  end
63
-
63
+
64
64
  # :call-seq:
65
65
  # with_uncompressed_tar { |tar_entries| ... }
66
66
  #
@@ -73,7 +73,7 @@ module Buildr
73
73
  Archive::Tar::Minitar.open(name, &block)
74
74
  end
75
75
  end
76
-
76
+
77
77
  private
78
78
 
79
79
  def create_from(file_map)
@@ -110,15 +110,15 @@ module Buildr
110
110
  end
111
111
 
112
112
  end
113
-
114
-
113
+
114
+
115
115
  class TarEntry #:nodoc:
116
-
116
+
117
117
  def initialize(tar_task, entry_name)
118
118
  @tar_task = tar_task
119
119
  @entry_name = entry_name
120
120
  end
121
-
121
+
122
122
  # :call-seq:
123
123
  # contain?(*patterns) => boolean
124
124
  #
@@ -129,7 +129,7 @@ module Buildr
129
129
  patterns.map { |pattern| Regexp === pattern ? pattern : Regexp.new(Regexp.escape(pattern.to_s)) }.
130
130
  all? { |pattern| content =~ pattern }
131
131
  end
132
-
132
+
133
133
  # :call-seq:
134
134
  # empty?() => boolean
135
135
  #
@@ -137,7 +137,7 @@ module Buildr
137
137
  def empty?()
138
138
  read_content_from_tar.nil?
139
139
  end
140
-
140
+
141
141
  # :call-seq:
142
142
  # exist() => boolean
143
143
  #
@@ -147,13 +147,13 @@ module Buildr
147
147
  @tar_task.with_uncompressed_tar { |tar| exist = tar.any? { |entry| entry.name == @entry_name } }
148
148
  exist
149
149
  end
150
-
150
+
151
151
  def to_s #:nodoc:
152
152
  @entry_name
153
153
  end
154
-
154
+
155
155
  private
156
-
156
+
157
157
  def read_content_from_tar
158
158
  content = Errno::ENOENT.new("No such file or directory - #{@entry_name}")
159
159
  @tar_task.with_uncompressed_tar do |tar|
@@ -163,7 +163,7 @@ module Buildr
163
163
  content
164
164
  end
165
165
  end
166
-
166
+
167
167
  end
168
168
 
169
169
 
@@ -14,14 +14,34 @@
14
14
  # the License.
15
15
 
16
16
 
17
+ # Rubygems 1.3.6 removed the 'version' accessor so monkey-patch it back to
18
+ # circumvent version validation. This is needed because Gem::Version doesn't
19
+ # accept version specs with dashes.
20
+ unless Gem::Version.new(0).respond_to?(:version=)
21
+ class Gem::Version
22
+ def version=(version)
23
+ @version = version.to_s
24
+ @version.strip!
25
+
26
+ # re-prime @segments
27
+ @segments = nil
28
+ segments
29
+ end
30
+ end
31
+ end
32
+
17
33
  module Buildr
18
-
34
+
19
35
  #
20
36
  # See ArtifactNamespace#need
21
37
  class VersionRequirement
22
-
38
+
23
39
  CMP_PROCS = Gem::Requirement::OPS.dup
24
- CMP_REGEX = Gem::Requirement::OP_RE.dup
40
+ CMP_REGEX = if defined?(Gem::Requirement::OP_RE)
41
+ Gem::Requirement::OP_RE
42
+ else
43
+ Gem::Requirement::OPS.keys.map { |k| Regexp.quote k }.join "|"
44
+ end
25
45
  CMP_CHARS = CMP_PROCS.keys.join
26
46
  BOOL_CHARS = '\|\&\!'
27
47
  VER_CHARS = '\w\.\-'
@@ -29,18 +49,18 @@ module Buildr
29
49
  class << self
30
50
  # is +str+ a version string?
31
51
  def version?(str)
32
- /^\s*[#{VER_CHARS}]+\s*$/ === str
52
+ /^\s*\d[#{VER_CHARS}]*\s*$/ === str
33
53
  end
34
-
54
+
35
55
  # is +str+ a version requirement?
36
56
  def requirement?(str)
37
57
  /[#{BOOL_CHARS}#{CMP_CHARS}\(\)]/ === str
38
58
  end
39
-
59
+
40
60
  # :call-seq:
41
61
  # VersionRequirement.create(" >1 <2 !(1.5) ") -> requirement
42
62
  #
43
- # parse the +str+ requirement
63
+ # parse the +str+ requirement
44
64
  def create(str)
45
65
  instance_eval normalize(str)
46
66
  rescue StandardError => e
@@ -61,7 +81,7 @@ module Buildr
61
81
  vreq.negative = !vreq.negative
62
82
  vreq
63
83
  end
64
-
84
+
65
85
  def normalize(str)
66
86
  str = str.strip
67
87
  if str[/[^\s\(\)#{BOOL_CHARS + VER_CHARS + CMP_CHARS}]/]
@@ -147,7 +167,7 @@ module Buildr
147
167
  def &(other)
148
168
  operation(:&, other)
149
169
  end
150
-
170
+
151
171
  # return the parsed expression
152
172
  def to_s
153
173
  str = requirements.map(&:to_s).join(" " + @op.to_s + " ").to_s
@@ -160,7 +180,7 @@ module Buildr
160
180
  protected
161
181
  attr_reader :requirements, :op
162
182
  def operation(op, other)
163
- @op ||= op
183
+ @op ||= op
164
184
  if negative == other.negative && @op == op && other.requirements.size == 1
165
185
  @requirements << other.requirements.first
166
186
  self
@@ -106,7 +106,7 @@ module Buildr
106
106
  end
107
107
 
108
108
 
109
- # An object for unzipping a file into a target directory. You can tell it to include
109
+ # An object for unzipping/untarring a file into a target directory. You can tell it to include
110
110
  # or exclude only specific files and directories, and also to map files from particular
111
111
  # paths inside the zip file into the target directory. Once ready, call #extract.
112
112
  #
@@ -131,7 +131,7 @@ module Buildr
131
131
  # :call-seq:
132
132
  # extract
133
133
  #
134
- # Extract the zip file into the target directory.
134
+ # Extract the zip/tgz file into the target directory.
135
135
  #
136
136
  # You can call this method directly. However, if you are using the #unzip method,
137
137
  # it creates a file task for the target directory: use that task instead as a
@@ -148,16 +148,36 @@ module Buildr
148
148
 
149
149
  # Otherwise, empty unzip creates target as a file when touching.
150
150
  mkpath target.to_s
151
- Zip::ZipFile.open(zip_file.to_s) do |zip|
152
- entries = zip.collect
153
- @paths.each do |path, patterns|
154
- patterns.map(entries).each do |dest, entry|
155
- next if entry.directory?
156
- dest = File.expand_path(dest, target.to_s)
157
- trace "Extracting #{dest}"
158
- mkpath File.dirname(dest) rescue nil
159
- entry.restore_permissions = true
160
- entry.extract(dest) { true }
151
+ if zip_file.to_s.match /\.t?gz$/
152
+ #un-tar.gz
153
+ Zlib::GzipReader.open(zip_file.to_s) { |tar|
154
+ Archive::Tar::Minitar::Input.open(tar) do |inp|
155
+ inp.each do |tar_entry|
156
+ @paths.each do |path, patterns|
157
+ patterns.map([tar_entry]).each do |dest, entry|
158
+ next if entry.directory?
159
+ dest = File.expand_path(dest, target.to_s)
160
+ trace "Extracting #{dest}"
161
+ mkpath File.dirname(dest) rescue nil
162
+ #entry.restore_permissions = true
163
+ File.open(dest, 'w') {|f| f.write entry.read}
164
+ end
165
+ end
166
+ end
167
+ end
168
+ }
169
+ else
170
+ Zip::ZipFile.open(zip_file.to_s) do |zip|
171
+ entries = zip.collect
172
+ @paths.each do |path, patterns|
173
+ patterns.map(entries).each do |dest, entry|
174
+ next if entry.directory?
175
+ dest = File.expand_path(dest, target.to_s)
176
+ trace "Extracting #{dest}"
177
+ mkpath File.dirname(dest) rescue nil
178
+ entry.restore_permissions = true
179
+ entry.extract(dest) { true }
180
+ end
161
181
  end
162
182
  end
163
183
  end
@@ -165,6 +185,24 @@ module Buildr
165
185
  touch target.to_s
166
186
  end
167
187
 
188
+ #reads the includes/excludes and apply them to the entry_name
189
+ def included?(entry_name)
190
+ @paths.each do |path, patterns|
191
+ return true if path.nil?
192
+ if entry_name =~ /^#{path}/
193
+ short = entry_name.sub(path, '')
194
+ if patterns.include.any? { |pattern| File.fnmatch(pattern, entry_name) } &&
195
+ !patterns.exclude.any? { |pattern| File.fnmatch(pattern, entry_name) }
196
+ # trace "tar_entry.full_name " + entry_name + " is included"
197
+ return true
198
+ end
199
+ end
200
+ end
201
+ # trace "tar_entry.full_name " + entry_name + " is excluded"
202
+ return false
203
+ end
204
+
205
+
168
206
  # :call-seq:
169
207
  # include(*files) => self
170
208
  # include(*files, :path=>name) => self
@@ -303,7 +341,7 @@ module Buildr
303
341
  #
304
342
  # For example:
305
343
  # unzip('all'=>'test.zip')
306
- # unzip('src'=>'test.zip').include('README', 'LICENSE')
344
+ # unzip('src'=>'test.zip').include('README', 'LICENSE')
307
345
  # unzip('libs'=>'test.zip').from_path('libs')
308
346
  def unzip(args)
309
347
  target, arg_names, zip_file = Buildr.application.resolve_args([args])
@@ -20,29 +20,36 @@ require 'buildr/java/bdd'
20
20
  require 'buildr/scala/tests'
21
21
 
22
22
  module Buildr::Scala
23
-
23
+
24
24
  # Specs is a Scala based BDD framework.
25
25
  # To use in your project:
26
26
  #
27
27
  # test.using :specs
28
- #
28
+ #
29
29
  # This framework will search in your project for:
30
30
  # src/spec/scala/**/*.scala
31
31
  class Specs < Buildr::TestFramework::JavaBDD
32
32
  @lang = :scala
33
33
  @bdd_dir = :spec
34
34
 
35
- VERSION = '1.5.0'
36
-
35
+ VERSION = '1.6.2.1'
36
+
37
37
  class << self
38
38
  def version
39
39
  Buildr.settings.build['scala.specs'] || VERSION
40
40
  end
41
-
41
+
42
42
  def dependencies
43
- ["org.scala-tools.testing:specs:jar:#{version}"] + Check.dependencies + JUnit.dependencies
43
+ unless @dependencies
44
+ super
45
+ # Add utility classes (e.g. SpecsSingletonRunner) and other dependencies
46
+ @dependencies |= [ File.join(File.dirname(__FILE__)) ] +
47
+ ["org.scala-tools.testing:specs:jar:#{version}"] +
48
+ Check.dependencies + JUnit.dependencies + Scalac.dependencies
49
+ end
50
+ @dependencies
44
51
  end
45
-
52
+
46
53
  def applies_to?(project) #:nodoc:
47
54
  !Dir[project.path_to(:source, bdd_dir, lang, '**/*.scala')].empty?
48
55
  end
@@ -57,39 +64,37 @@ module Buildr::Scala
57
64
 
58
65
  def initialize(task, options) #:nodoc:
59
66
  super
60
-
67
+
61
68
  specs = task.project.path_to(:source, :spec, :scala)
62
69
  task.compile.from specs if File.directory?(specs)
63
-
70
+
64
71
  resources = task.project.path_to(:source, :spec, :resources)
65
72
  task.resources.from resources if File.directory?(resources)
66
73
  end
67
-
74
+
68
75
  def tests(dependencies)
69
- dependencies += [task.compile.target.to_s]
70
76
  candidates = filter_classes(dependencies, :interfaces => ['org.specs.Specification'])
71
-
77
+
72
78
  Java.load # Java is already loaded, but just in case
73
-
79
+
74
80
  filter = Java.org.apache.buildr.JavaTestFilter.new(dependencies.to_java(Java.java.lang.String))
75
81
  filter.add_fields ['MODULE$'].to_java(Java.java.lang.String)
76
- filter.filter(candidates.to_java(Java.java.lang.String)) # we only want singletons
82
+ filter.filter(candidates.to_java(Java.java.lang.String)).map { |s| s[0..(s.size - 2)] }
77
83
  end
78
-
84
+
79
85
  def run(specs, dependencies) #:nodoc:
80
- dependencies += [task.compile.target.to_s, File.join(File.dirname(__FILE__))] + Scalac.dependencies
81
-
82
86
  cmd_options = { :properties => options[:properties],
83
87
  :java_args => options[:java_args],
84
- :classpath => dependencies}
88
+ :classpath => dependencies,
89
+ :name => false }
85
90
 
86
91
  runner = 'org.apache.buildr.SpecsSingletonRunner'
87
92
  specs.inject [] do |passed, spec|
88
93
  begin
89
94
  unless Util.win_os?
90
- Java::Commands.java(runner, task.compile.target.to_s, '-c', spec, cmd_options)
95
+ Java::Commands.java(runner, task.compile.target.to_s, '-c', spec + '$', cmd_options)
91
96
  else
92
- Java::Commands.java(runner, task.compile.target.to_s, spec, cmd_options)
97
+ Java::Commands.java(runner, task.compile.target.to_s, spec + '$', cmd_options)
93
98
  end
94
99
  rescue => e
95
100
  passed
@@ -19,30 +19,52 @@ require 'buildr/core/compile'
19
19
  require 'buildr/packaging'
20
20
 
21
21
  module Buildr::Scala
22
- DEFAULT_VERSION = '2.7.5' # currently the latest (Jun 19, 2009)
23
-
22
+ DEFAULT_VERSION = '2.7.7' # currently the latest (Oct 31, 2009)
23
+
24
24
  class << self
25
-
26
- # Retrieves the Scala version string from the
27
- # standard library or nil if Scala is not
28
- # available.
25
+
29
26
  def version_str
30
- begin
31
- # Scala version string normally looks like "version 2.7.3.final"
32
- Java.scala.util.Properties.versionString.sub 'version ', ''
33
- rescue
34
- nil
27
+ warn "Use of Scala.version_str is deprecated. Use Scala.version instead"
28
+ version
29
+ end
30
+
31
+ def installed_version
32
+ unless @installed_version
33
+ @installed_version = if Scalac.installed?
34
+ begin
35
+ # try to read the value from the properties file
36
+ props = Zip::ZipFile.open(File.expand_path('lib/scala-library.jar', Scalac.scala_home)) do |zipfile|
37
+ zipfile.read 'library.properties'
38
+ end
39
+
40
+ version_str = props.match(/version\.number\s*=\s*([^\s]+)/).to_a[1]
41
+
42
+ if version_str
43
+ md = version_str.match(/\d+\.\d[\d\.]*/) or
44
+ fail "Unable to parse Scala version: #{version_str}"
45
+
46
+ md[0].sub(/.$/, "") # remove trailing dot, if any
47
+ end
48
+ rescue => e
49
+ warn "Unable to parse library.properties in $SCALA_HOME/lib/scala-library.jar: #{e}"
50
+ nil
51
+ end
52
+ end
35
53
  end
54
+
55
+ @installed_version
36
56
  end
37
-
57
+
38
58
  def version
39
- if version_str
40
- # any consecutive sequence of numbers followed by dots
41
- match = version_str.match(/\d+\.\d[\d\.]*/) or
42
- fail "Unable to parse Scala version: #{version_str} "
43
- match[0].sub(/.$/, "") # remove trailing dot, if any
59
+ Buildr.settings.build['scala.version'] || installed_version || DEFAULT_VERSION
60
+ end
61
+
62
+ def compatible_28?
63
+ major, minor = version.match(/^(\d)\.(\d)/).to_a[1,2]
64
+ if major && minor
65
+ (major.to_i == 2 && minor.to_i >= 8) || (major.to_i > 2)
44
66
  else
45
- DEFAULT_VERSION # TODO return the version installed from Maven repo
67
+ false
46
68
  end
47
69
  end
48
70
  end
@@ -60,7 +82,7 @@ module Buildr::Scala
60
82
  # * :debug -- Generate debugging info.
61
83
  # * :other -- Array of options to pass to the Scalac compiler as is, e.g. -Xprint-types
62
84
  class Scalac < Buildr::Compiler::Base
63
-
85
+
64
86
  # The scalac compiler jars are added to classpath at load time,
65
87
  # if you want to customize artifact versions, you must set them on the
66
88
  #
@@ -69,27 +91,36 @@ module Buildr::Scala
69
91
  # namespace before this file is required. This is of course, only
70
92
  # if SCALA_HOME is not set or invalid.
71
93
  REQUIRES = ArtifactNamespace.for(self) do |ns|
72
- ns.library! 'org.scala-lang:scala-library:jar:>=' + DEFAULT_VERSION
73
- ns.compiler! 'org.scala-lang:scala-compiler:jar:>=' + DEFAULT_VERSION
94
+ version = Buildr.settings.build['scala.version'] || DEFAULT_VERSION
95
+ ns.library! 'org.scala-lang:scala-library:jar:>=' + version
96
+ ns.compiler! 'org.scala-lang:scala-compiler:jar:>=' + version
74
97
  end
75
-
98
+
76
99
  class << self
77
100
  def scala_home
78
101
  env_home = ENV['SCALA_HOME']
79
-
102
+
80
103
  @home ||= (if !env_home.nil? && File.exists?(env_home + '/lib/scala-library.jar') && File.exists?(env_home + '/lib/scala-compiler.jar')
81
104
  env_home
82
105
  else
83
106
  nil
84
107
  end)
85
108
  end
86
-
109
+
87
110
  def installed?
88
111
  !scala_home.nil?
89
112
  end
90
113
 
114
+ def use_installed?
115
+ if installed? && Buildr.settings.build['scala.version']
116
+ Buildr.settings.build['scala.version'] == Scala.installed_version
117
+ else
118
+ Buildr.settings.build['scala.version'].nil? && installed?
119
+ end
120
+ end
121
+
91
122
  def dependencies
92
- if installed?
123
+ if use_installed?
93
124
  ['scala-library', 'scala-compiler'].map { |s| File.expand_path("lib/#{s}.jar", scala_home) }
94
125
  else
95
126
  REQUIRES.artifacts.map(&:to_s)
@@ -97,23 +128,24 @@ module Buildr::Scala
97
128
  end
98
129
 
99
130
  def use_fsc
100
- installed? && ENV["USE_FSC"] =~ /^(yes|on|true)$/i
131
+ use_installed? && ENV["USE_FSC"] =~ /^(yes|on|true)$/i
101
132
  end
102
-
133
+
103
134
  def applies_to?(project, task) #:nodoc:
104
135
  paths = task.sources + [sources].flatten.map { |src| Array(project.path_to(:source, task.usage, src.to_sym)) }
105
136
  paths.flatten!
106
-
137
+
107
138
  # Just select if we find .scala files
108
139
  paths.any? { |path| !Dir["#{path}/**/*.scala"].empty? }
109
140
  end
110
141
  end
111
-
142
+
112
143
  Javac = Buildr::Compiler::Javac
113
144
 
114
145
  OPTIONS = [:warnings, :deprecation, :optimise, :target, :debug, :other, :javac]
115
-
116
- Java.classpath << dependencies
146
+
147
+ # Lazy evaluation to allow change in buildfile
148
+ Java.classpath << lambda { dependencies }
117
149
 
118
150
  specify :language=>:scala, :sources => [:scala, :java], :source_ext => [:scala, :java],
119
151
  :target=>'classes', :target_ext=>'class', :packaging=>:jar
@@ -124,25 +156,41 @@ module Buildr::Scala
124
156
  options[:warnings] = verbose if options[:warnings].nil?
125
157
  options[:deprecation] ||= false
126
158
  options[:optimise] ||= false
159
+ options[:make] ||= :transitivenocp if Scala.compatible_28?
127
160
  options[:javac] ||= {}
128
-
161
+
129
162
  @java = Javac.new(project, options[:javac])
130
163
  end
131
164
 
132
165
  def compile(sources, target, dependencies) #:nodoc:
133
- check_options options, OPTIONS
166
+ check_options(options, OPTIONS + (Scala.compatible_28? ? [:make] : []))
167
+
168
+ java_sources = java_sources(sources)
169
+ enable_dep_tracing = Scala.compatible_28? && java_sources.empty?
170
+
171
+ dependencies.unshift target if enable_dep_tracing
134
172
 
135
173
  cmd_args = []
136
- cmd_args << '-classpath' << (dependencies + Scalac.dependencies).join(File::PATH_SEPARATOR)
174
+ cmd_args << '-classpath' << dependencies.join(File::PATH_SEPARATOR)
137
175
  source_paths = sources.select { |source| File.directory?(source) }
138
176
  cmd_args << '-sourcepath' << source_paths.join(File::PATH_SEPARATOR) unless source_paths.empty?
139
177
  cmd_args << '-d' << File.expand_path(target)
140
178
  cmd_args += scalac_args
179
+
180
+ if enable_dep_tracing
181
+ dep_dir = File.expand_path(target)
182
+ Dir.mkdir dep_dir unless File.exists? dep_dir
183
+
184
+ cmd_args << '-make:' + options[:make].to_s
185
+ cmd_args << '-dependencyfile'
186
+ cmd_args << File.expand_path('.scala-deps', dep_dir)
187
+ end
188
+
141
189
  cmd_args += files_from_sources(sources)
142
190
 
143
191
  unless Buildr.application.options.dryrun
144
192
  trace((['scalac'] + cmd_args).join(' '))
145
-
193
+
146
194
  if Scalac.use_fsc
147
195
  system(([File.expand_path('bin/fsc', Scalac.scala_home)] + cmd_args).join(' ')) or
148
196
  fail 'Failed to compile, see errors above'
@@ -151,15 +199,14 @@ module Buildr::Scala
151
199
  begin
152
200
  Java.scala.tools.nsc.Main.process(cmd_args.to_java(Java.java.lang.String))
153
201
  rescue => e
154
- fail "Scala compiler crashed:\n#{e.inspect}"
202
+ fail "Scala compiler crashed:\n#{e.inspect}"
155
203
  end
156
204
  fail 'Failed to compile, see errors above' if Java.scala.tools.nsc.Main.reporter.hasErrors
157
205
  end
158
-
159
- java_sources = java_sources(sources)
206
+
160
207
  unless java_sources.empty?
161
208
  trace 'Compiling mixed Java/Scala sources'
162
-
209
+
163
210
  # TODO includes scala-compiler.jar
164
211
  deps = dependencies + Scalac.dependencies + [ File.expand_path(target) ]
165
212
  @java.compile(java_sources, target, deps)
@@ -187,7 +234,7 @@ module Buildr::Scala
187
234
  end
188
235
 
189
236
  end
190
-
237
+
191
238
  end
192
239
 
193
240
  # Scala compiler comes first, ahead of Javac, this allows it to pick