buildr 1.3.5 → 1.4.0

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/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