buildr 1.4.7-x86-mswin32 → 1.4.8-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 (65) hide show
  1. data/CHANGELOG +41 -0
  2. data/Rakefile +0 -6
  3. data/addon/buildr/bnd.rb +13 -3
  4. data/addon/buildr/checkstyle.rb +1 -1
  5. data/addon/buildr/git_auto_version.rb +33 -0
  6. data/addon/buildr/{gwt.rake → gwt.rb} +0 -0
  7. data/addon/buildr/jacoco.rb +194 -0
  8. data/buildr.buildfile +1 -1
  9. data/buildr.gemspec +23 -16
  10. data/doc/_layouts/default.html +0 -2
  11. data/doc/contributing.textile +47 -0
  12. data/doc/download.textile +24 -0
  13. data/doc/index.textile +43 -23
  14. data/doc/languages.textile +65 -6
  15. data/doc/more_stuff.textile +12 -0
  16. data/doc/packaging.textile +2 -0
  17. data/doc/settings_profiles.textile +1 -1
  18. data/lib/buildr.rb +0 -4
  19. data/lib/buildr/core/application.rb +41 -8
  20. data/lib/buildr/core/build.rb +102 -1
  21. data/lib/buildr/core/cc.rb +14 -8
  22. data/lib/buildr/core/generate.rb +148 -7
  23. data/lib/buildr/core/util.rb +3 -3
  24. data/lib/buildr/ide/eclipse.rb +114 -0
  25. data/lib/buildr/ide/idea.rb +95 -1
  26. data/lib/buildr/java/commands.rb +1 -1
  27. data/lib/buildr/java/rjb.rb +5 -4
  28. data/lib/buildr/packaging/artifact.rb +1 -1
  29. data/lib/buildr/packaging/ziptask.rb +2 -2
  30. data/lib/buildr/scala.rb +1 -1
  31. data/lib/buildr/scala/bdd.rb +9 -2
  32. data/lib/buildr/scala/compiler.rb +94 -4
  33. data/lib/buildr/scala/doc.rb +17 -5
  34. data/lib/buildr/scala/tests.rb +15 -4
  35. data/lib/buildr/version.rb +1 -1
  36. data/rakelib/all-in-one.rake +50 -47
  37. data/rakelib/checks.rake +4 -4
  38. data/rakelib/doc.rake +85 -88
  39. data/rakelib/metrics.rake +9 -9
  40. data/rakelib/package.rake +13 -34
  41. data/rakelib/release.rake +11 -12
  42. data/rakelib/rspec.rake +71 -76
  43. data/rakelib/stage.rake +25 -51
  44. data/spec/addon/bnd_spec.rb +61 -7
  45. data/spec/core/build_spec.rb +117 -0
  46. data/spec/core/cc_spec.rb +36 -22
  47. data/spec/core/common_spec.rb +3 -2
  48. data/spec/core/compile_spec.rb +3 -3
  49. data/spec/core/generate_from_eclipse_spec.rb +280 -0
  50. data/spec/java/bdd_spec.rb +2 -2
  51. data/spec/java/packaging_spec.rb +2 -1
  52. data/spec/packaging/archive_spec.rb +25 -2
  53. data/spec/packaging/artifact_spec.rb +2 -2
  54. data/spec/sandbox.rb +3 -2
  55. data/spec/scala/compiler_spec.rb +41 -0
  56. data/spec/scala/doc_spec.rb +22 -3
  57. data/spec/scala/scala.rb +2 -2
  58. data/spec/scala/tests_spec.rb +2 -2
  59. metadata +223 -194
  60. data/addon/buildr/jdepend.rb.orig +0 -178
  61. data/doc/installing.textile.orig +0 -282
  62. data/doc/more_stuff.textile.orig +0 -1004
  63. data/lib/buildr/ide/eclipse/java.rb +0 -49
  64. data/lib/buildr/ide/eclipse/plugin.rb +0 -67
  65. data/lib/buildr/ide/eclipse/scala.rb +0 -64
data/rakelib/stage.rake CHANGED
@@ -19,31 +19,33 @@ require 'digest/sha1'
19
19
 
20
20
  gpg_cmd = 'gpg2'
21
21
 
22
- task :prepare do |task, args|
22
+ task 'prepare' do |task, args|
23
23
  gpg_arg = args.gpg || ENV['gpg']
24
-
24
+
25
+ if false
25
26
  # Make sure we're doing a release from checked code.
26
27
  lambda do
27
- puts "Checking there are no local changes ... "
28
+ puts 'Checking there are no local changes ... '
28
29
  svn = `svn status`
29
30
  fail "Cannot release unless all local changes are in SVN:\n#{svn}" unless svn.empty?
30
31
  git = `git status -s`
31
32
  fail "Cannot release unless all local changes are in Git:\n#{git}" if git[/^ M/] && ENV["IGNORE_GIT"].nil?
32
- puts "[X] There are no local changes, everything is in source control"
33
+ puts '[X] There are no local changes, everything is in source control'
33
34
  end.call
34
35
 
35
36
  # Make sure we have a valid CHANGELOG entry for this release.
36
37
  lambda do
37
- puts "Checking that CHANGELOG indicates most recent version and today's date ... "
38
+ puts 'Checking that CHANGELOG indicates most recent version and today''s date ... '
38
39
  expecting = "#{spec.version} (#{Time.now.strftime('%Y-%m-%d')})"
39
40
  header = File.readlines('CHANGELOG').first.chomp
40
41
  fail "Expecting CHANGELOG to start with #{expecting}, but found #{header} instead" unless expecting == header
41
- puts "[x] CHANGELOG indicates most recent version and today's date"
42
+ puts '[x] CHANGELOG indicates most recent version and today''s date'
42
43
  end.call
44
+ end
43
45
 
44
46
  # Need GPG to sign the packages.
45
47
  lambda do
46
- gpg_arg or fail "Please run with gpg=<argument for gpg --local-user>"
48
+ gpg_arg or fail 'Please run with gpg=<argument for gpg --local-user>'
47
49
  gpg_ok = `gpg2 --list-keys #{gpg_arg}` rescue nil
48
50
  if !$?.success?
49
51
  gpg_ok = `gpg --list-keys #{gpg_arg}`
@@ -52,45 +54,26 @@ task :prepare do |task, args|
52
54
  fail "No GPG user #{gpg_arg}" if gpg_ok.empty?
53
55
  end.call
54
56
 
55
- task(:license).invoke
56
-
57
- # Need JRuby, Scala and Groovy installed to run all the specs.
58
- lambda do
59
- puts "Checking that we have Scala and Groovy available ... "
60
- `scala -version`
61
- $?.exitstatus == 1 or fail "Scala is not installed"
62
- sh 'groovy -version'
63
- puts "[X] We have Scala and Groovy"
64
- end.call
57
+ task('license').invoke
65
58
 
66
59
  # Need Prince to generate PDF
67
60
  lambda do
68
- puts "Checking that we have prince available ... "
61
+ puts 'Checking that we have prince available ... '
69
62
  sh 'prince --version'
70
- puts "[X] We have prince available"
71
- end.call
72
-
73
- # Need RubyForge to upload new release files.
74
- lambda do
75
- puts "[!] Make sure you have admin privileges to make a release on RubyForge"
76
- rubyforge = RubyForge.new.configure
77
- rubyforge.login
78
- rubyforge.scrape_project(spec.name)
63
+ puts '[X] We have prince available'
79
64
  end.call
80
65
 
81
- # We will be speccing in one platform, so also spec the other one.
82
- task('spec:ruby_1_9').invoke unless RUBY_VERSION >= '1.9' && !RUBY_PLATFORM[/java/]
83
- task('spec:ruby_1_8').invoke unless RUBY_VERSION >= '1.8.7' && !RUBY_PLATFORM[/java/]
84
- task('spec:jruby').invoke unless RUBY_PLATFORM[/java/]
66
+ raise "Can not run stage process under jruby" if RUBY_PLATFORM[/java/]
67
+ raise "Can not run staging process under older rubies" unless RUBY_VERSION >= '1.9'
85
68
  end
86
69
 
87
- task :stage=>[:clobber, :prepare] do |task, args|
70
+ task 'stage' => %w(clobber prepare) do |task, args|
88
71
  gpg_arg = args.gpg || ENV['gpg']
89
72
  mkpath '_staged'
90
73
 
91
74
  # Start by figuring out what has changed.
92
75
  lambda do
93
- puts "Looking for changes between this release and previous one ..."
76
+ puts 'Looking for changes between this release and previous one ...'
94
77
  pattern = /(^(\d+\.\d+(?:\.\d+)?)\s+\(\d{4}-\d{2}-\d{2}\)\s*((:?^[^\n]+\n)*))/
95
78
  changes = File.read('CHANGELOG').scan(pattern).inject({}) { |hash, set| hash[set[1]] = set[2] ; hash }
96
79
  current = changes[spec.version.to_s]
@@ -99,14 +82,14 @@ task :stage=>[:clobber, :prepare] do |task, args|
99
82
  file.write "#{spec.version} (#{Time.now.strftime('%Y-%m-%d')})\n"
100
83
  file.write current
101
84
  end
102
- puts "[X] Listed most recent changed in _staged/CHANGES"
85
+ puts '[X] Listed most recent changed in _staged/CHANGES'
103
86
  end.call
104
87
 
105
88
  # Create the packages (gem, tarball) and sign them. This requires user
106
89
  # intervention so the earlier we do it the better.
107
90
  lambda do
108
- puts "Creating and signing release packages ..."
109
- task(:package).invoke
91
+ puts 'Creating and signing release packages ...'
92
+ task('package').invoke
110
93
  mkpath '_staged/dist'
111
94
  FileList['pkg/*.{gem,zip,tgz}'].each do |source|
112
95
  pkg = source.pathmap('_staged/dist/%n%x')
@@ -117,13 +100,13 @@ task :stage=>[:clobber, :prepare] do |task, args|
117
100
  sh gpg_cmd, '--local-user', gpg_arg, '--armor', '--output', pkg + '.asc', '--detach-sig', pkg, :verbose=>true
118
101
  end
119
102
  cp 'etc/KEYS', '_staged/dist'
120
- puts "[X] Created and signed release packages in _staged/dist"
103
+ puts '[X] Created and signed release packages in _staged/dist'
121
104
  end.call
122
105
 
123
106
  # The download page should link to the new binaries/sources, and we
124
107
  # want to do that before generating the site/documentation.
125
108
  lambda do
126
- puts "Updating download page with links to release packages ... "
109
+ puts 'Updating download page with links to release packages ... '
127
110
  mirror = "http://www.apache.org/dyn/closer.cgi/#{spec.name}/#{spec.version}"
128
111
  official = "http://www.apache.org/dist/#{spec.name}/#{spec.version}"
129
112
  rows = FileList['_staged/dist/*.{gem,tgz,zip}'].map { |pkg|
@@ -151,10 +134,10 @@ p>. ("Release signing keys":#{official}/KEYS)
151
134
  # Now we can create the Web site, this includes running specs, coverage report, etc.
152
135
  # This will take a while, so we want to do it as last step before upload.
153
136
  lambda do
154
- puts "Creating new Web site"
137
+ puts 'Creating new Web site'
155
138
  task(:site).invoke
156
139
  cp_r '_site', '_staged/site'
157
- puts "[X] Created new Web site in _staged/site"
140
+ puts '[X] Created new Web site in _staged/site'
158
141
  end.call
159
142
 
160
143
 
@@ -193,13 +176,6 @@ The documentation generated for this release is available here:
193
176
  #{base_url}/site/
194
177
  #{base_url}/site/buildr.pdf
195
178
 
196
- The official specification against which this release was tested:
197
- #{base_url}/site/specs.html
198
-
199
- Test coverage report:
200
- #{base_url}/site/coverage/index.html
201
-
202
-
203
179
  The following changes were made since #{previous_version}:
204
180
 
205
181
  #{changes.gsub(/^/, ' ')}
@@ -207,11 +183,9 @@ The following changes were made since #{previous_version}:
207
183
  File.open 'vote-email.txt', 'w' do |file|
208
184
  file.write email
209
185
  end
210
- puts "[X] Created release vote email template in 'vote-email.txt'"
186
+ puts '[X] Created release vote email template in ''vote-email.txt'''
211
187
  puts email
212
188
  end.call
213
-
214
189
  end
215
190
 
216
-
217
- task(:clobber) { rm_rf '_staged' }
191
+ task('clobber') { rm_rf '_staged' }
@@ -32,6 +32,59 @@ def open_main_manifest_section(file = 'target/foo-2.1.3.jar')
32
32
  end
33
33
 
34
34
  describe Buildr::Bnd do
35
+ before do
36
+ repositories.remote << Buildr::Bnd.remote_repository
37
+ end
38
+
39
+ describe "project.bnd version (assure backward compatibility)" do
40
+
41
+ after do
42
+ STDERR.puts("backward compatibility: used #{Buildr::Bnd.version} restoring #{@savedVersion}")
43
+ Buildr::Bnd.version = @savedVersion
44
+ end
45
+
46
+ before do
47
+ @savedVersion = Buildr::Bnd.version
48
+ Buildr::Bnd.version = '0.0.384'
49
+ write "src/main/java/com/biz/Foo.java", <<SRC
50
+ package com.biz;
51
+ public class Foo {}
52
+ SRC
53
+ write "bar/src/main/java/com/biz/bar/Bar.java", <<SRC
54
+ package com.biz.bar;
55
+ public class Bar {}
56
+ SRC
57
+
58
+ @foo = define "foo" do
59
+ project.version = "2.1.3"
60
+ project.group = "mygroup"
61
+ manifest["Magic-Food"] = "Chocolate"
62
+ manifest["Magic-Drink"] = "Wine"
63
+ package(:bundle).tap do |bnd|
64
+ bnd["Export-Package"] = "com.*"
65
+ end
66
+
67
+ define "bar" do
68
+ project.version = "2.2"
69
+ package(:bundle).tap do |bnd|
70
+ bnd["Magic-Food"] = "Cheese"
71
+ bnd["Export-Package"] = "com.*"
72
+ end
73
+ end
74
+ end
75
+ task('package').invoke
76
+ end
77
+
78
+ it "version 0.0.384 does not export the version and wrong import-package" do
79
+ open_main_manifest_section do |attribs|
80
+ attribs['Bundle-Name'].should eql('foo')
81
+ attribs['Bundle-Version'].should eql('2.1.3')
82
+ attribs['Bundle-SymbolicName'].should eql('mygroup.foo')
83
+ attribs['Export-Package'].should eql('com.biz')
84
+ attribs['Import-Package'].should eql('com.biz')
85
+ end
86
+ end
87
+ end
35
88
 
36
89
  describe "package :bundle" do
37
90
  describe "with a valid bundle" do
@@ -92,8 +145,8 @@ SRC
92
145
  attribs['Bundle-Name'].should eql('foo')
93
146
  attribs['Bundle-Version'].should eql('2.1.3')
94
147
  attribs['Bundle-SymbolicName'].should eql('mygroup.foo')
95
- attribs['Export-Package'].should eql('com.biz')
96
- attribs['Import-Package'].should eql('com.biz')
148
+ attribs['Export-Package'].should eql('com.biz;version="2.1.3"')
149
+ attribs['Import-Package'].should be_nil
97
150
  end
98
151
  end
99
152
 
@@ -123,8 +176,8 @@ SRC
123
176
  attribs['Bundle-Name'].should eql('foo:bar')
124
177
  attribs['Bundle-Version'].should eql('2.2')
125
178
  attribs['Bundle-SymbolicName'].should eql('mygroup.foo.bar')
126
- attribs['Export-Package'].should eql('com.biz.bar')
127
- attribs['Import-Package'].should eql('com.biz.bar')
179
+ attribs['Export-Package'].should eql('com.biz.bar;version="2.2"')
180
+ attribs['Import-Package'].should be_nil
128
181
  end
129
182
  end
130
183
 
@@ -179,7 +232,7 @@ SRC
179
232
  it "should generate package with files exported from dependency" do
180
233
  task('package').invoke
181
234
  open_main_manifest_section do |attribs|
182
- attribs['Export-Package'].should eql('org.apache.tools.zip')
235
+ attribs['Export-Package'].should eql('org.apache.tools.zip;version="2.1.3"')
183
236
  end
184
237
  end
185
238
  end
@@ -211,7 +264,7 @@ SRC
211
264
  it "should generate package with files exported from dependency" do
212
265
  task('package').invoke
213
266
  open_main_manifest_section do |attribs|
214
- attribs['Export-Package'].should eql('org.apache.tools.zip')
267
+ attribs['Export-Package'].should eql('org.apache.tools.zip;version="2.1.3"')
215
268
  end
216
269
  end
217
270
  end
@@ -235,7 +288,7 @@ SRC
235
288
  it "should generate package with files exported from dependency" do
236
289
  task('package').invoke
237
290
  open_main_manifest_section do |attribs|
238
- attribs['Export-Package'].should eql('org.apache.tools.zip')
291
+ attribs['Export-Package'].should eql('org.apache.tools.zip;version="2.1.3"')
239
292
  end
240
293
  end
241
294
  end
@@ -327,4 +380,5 @@ SRC
327
380
  Rake::Task.tasks.detect { |task| task.to_s == "bnd:print" }.comment.should_not be_nil
328
381
  end
329
382
  end
383
+
330
384
  end
@@ -200,6 +200,66 @@ describe Project, '#reports' do
200
200
  end
201
201
 
202
202
 
203
+ describe Hg do
204
+ describe '#current_branch' do
205
+ it 'should return the correct branch' do
206
+ Hg.should_receive(:hg).with('branch').and_return("default\n")
207
+ Hg.send(:current_branch).should == 'default'
208
+ end
209
+ end
210
+
211
+ describe '#uncommitted_files' do
212
+ it 'should return an array of modified files' do
213
+ Hg.should_receive(:`).with('hg status').and_return <<-EOF
214
+ M abc.txt
215
+ M xyz.txt
216
+ R hello
217
+ R removed
218
+ ! conflict
219
+ A README
220
+ ? ignore.txt
221
+ EOF
222
+ Hg.uncommitted_files.should include('abc.txt', 'xyz.txt', 'hello', 'README', 'conflict', 'ignore.txt')
223
+ end
224
+ end
225
+
226
+ describe '#uncommitted_files' do
227
+ it 'should return an empty array on a clean repository' do
228
+ Hg.should_receive(:`).with('hg status').and_return "\n"
229
+ Hg.uncommitted_files.should be_empty
230
+ end
231
+ end
232
+
233
+ describe '#remote' do
234
+ it 'should return the aliases of the default remote repositories' do
235
+ Hg.should_receive(:hg).with('paths').and_return <<-EOF
236
+ default = https://hg.apache.org/repo/my-repo
237
+ EOF
238
+ Hg.send(:remote).should include('https://hg.apache.org/repo/my-repo')
239
+ end
240
+
241
+ it 'should return the aliases of the default push remote repositories' do
242
+ Hg.should_receive(:hg).with('paths').and_return <<-EOF
243
+ default-push = https://hg.apache.org/repo/my-repo
244
+ EOF
245
+ Hg.send(:remote).should include('https://hg.apache.org/repo/my-repo')
246
+ end
247
+
248
+ it 'should return empty array when no remote repositories found' do
249
+ Hg.should_receive(:hg).with('paths').and_return "\n"
250
+ Hg.send(:remote).should be_empty
251
+ end
252
+
253
+ it 'should return empty array when no default-push remote repository found' do
254
+ Hg.should_receive(:hg).with('paths').and_return <<-EOF
255
+ blah = https://bitbucket.org/sample-repo
256
+ EOF
257
+ Hg.send(:remote).should be_empty
258
+ end
259
+ end
260
+ end # end of Hg
261
+
262
+
203
263
  describe Git do
204
264
  describe '#uncommitted_files' do
205
265
  it 'should return an empty array on a clean repository' do
@@ -346,6 +406,11 @@ end # of Buildr::Svn
346
406
 
347
407
  describe Release do
348
408
  describe 'find' do
409
+ it 'should return HgRelease if project uses Hg' do
410
+ write '.hg/requires'
411
+ Release.find.should be_instance_of(HgRelease)
412
+ end
413
+
349
414
  it 'should return GitRelease if project uses Git' do
350
415
  write '.git/config'
351
416
  Release.find.should be_instance_of(GitRelease)
@@ -679,6 +744,58 @@ shared_examples_for 'a release process' do
679
744
  end
680
745
 
681
746
 
747
+ describe HgRelease do
748
+ it_should_behave_like 'a release process'
749
+
750
+ before do
751
+ write 'buildfile', "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
752
+ @release = HgRelease.new
753
+ Hg.stub!(:hg)
754
+ Hg.stub!(:remote).and_return('https://bitbucket.org/sample-repo')
755
+ Hg.stub!(:current_branch).and_return('default')
756
+ end
757
+
758
+ describe '#applies_to?' do
759
+ it 'should reject a non-hg repo' do
760
+ Dir.chdir(Dir.tmpdir) do
761
+ HgRelease.applies_to?.should be_false
762
+ end
763
+ end
764
+
765
+ it 'should accept a hg repo' do
766
+ FileUtils.mkdir '.hg'
767
+ FileUtils.touch File.join('.hg', 'requires')
768
+ HgRelease.applies_to?.should be_true
769
+ end
770
+ end
771
+
772
+ describe '#check' do
773
+ before do
774
+ @release = HgRelease.new
775
+ @release.send(:this_version=, '1.0.0-SNAPSHOT')
776
+ end
777
+
778
+ it 'should accept a clean repo' do
779
+ Hg.should_receive(:uncommitted_files).and_return([])
780
+ Hg.should_receive(:remote).and_return(["http://bitbucket.org/sample-repo"])
781
+ lambda { @release.check }.should_not raise_error
782
+ end
783
+
784
+ it 'should reject a dirty repo' do
785
+ Hg.should_receive(:uncommitted_files).and_return(['dirty_file.txt'])
786
+ lambda { @release.check }.should raise_error(RuntimeError, /uncommitted files/i)
787
+ end
788
+
789
+ it 'should reject a local branch not tracking a remote repo' do
790
+ Hg.should_receive(:uncommitted_files).and_return([])
791
+ Hg.should_receive(:remote).and_return([])
792
+ lambda{ @release.check }.should raise_error(RuntimeError,
793
+ "You are releasing from a local branch that does not track a remote!")
794
+ end
795
+ end
796
+ end
797
+
798
+
682
799
  describe GitRelease do
683
800
  it_should_behave_like 'a release process'
684
801
 
data/spec/core/cc_spec.rb CHANGED
@@ -72,7 +72,7 @@ describe Buildr::CCTask do
72
72
  foo.cc.invoke
73
73
  end
74
74
 
75
- sleep 1
75
+ wait_while { foo.test.compile.run_count != 1 }
76
76
 
77
77
  foo.compile.run_count.should == 1
78
78
  foo.test.compile.run_count.should == 1
@@ -96,25 +96,15 @@ describe Buildr::CCTask do
96
96
  end
97
97
  end
98
98
 
99
- #Ick! Try to get the sleeping enough on each platform that the tests reliably pass
100
- sleep 1 if RUBY_VERSION >= '1.9' && !RUBY_PLATFORM[/java/]
101
- sleep 5 if RUBY_VERSION >= '1.8.7' && !RUBY_PLATFORM[/java/]
102
- sleep 1 if RUBY_PLATFORM[/java/]
99
+ wait_while { foo.test.compile.run_count != 1 }
103
100
 
104
101
  foo.compile.run_count.should == 1
105
102
  foo.test.compile.run_count.should == 1
106
103
  foo.resources.run_count.should == 1
107
104
 
108
- # Wait some time as the timestamp needs to be different on files.
109
- sleep 3 if Buildr::Util.win_os?
110
- sleep 1 unless Buildr::Util.win_os?
105
+ modify_file_times(File.join(Dir.pwd, 'src/main/java/Example.java'))
111
106
 
112
- touch File.join(Dir.pwd, 'src/main/java/Example.java')
113
-
114
- #Ick! Try to get the sleeping enough on each platform that the tests reliably pass
115
- sleep 1 if RUBY_VERSION >= '1.9' && !RUBY_PLATFORM[/java/]
116
- sleep 5 if RUBY_VERSION >= '1.8.7' && !RUBY_PLATFORM[/java/]
117
- sleep 1 if RUBY_PLATFORM[/java/]
107
+ wait_while { foo.test.compile.run_count != 2 }
118
108
 
119
109
  foo.compile.run_count.should == 2
120
110
  foo.test.compile.run_count.should == 2
@@ -142,17 +132,18 @@ describe Buildr::CCTask do
142
132
  end
143
133
  end
144
134
 
145
- sleep 1
135
+ wait_while { foo.test.compile.run_count != 1 }
146
136
 
147
137
  foo.compile.run_count.should == 1
148
138
  foo.test.compile.run_count.should == 1
149
139
  foo.resources.run_count.should == 1
150
140
 
151
141
  file("foo/target/classes/Example.class").should exist
142
+
152
143
  tstamp = File.mtime("foo/target/classes/Example.class")
153
- touch File.join(Dir.pwd, 'foo/src/main/java/Example.java')
154
144
 
155
- sleep 1
145
+ modify_file_times(File.join(Dir.pwd, 'foo/src/main/java/Example.java'))
146
+ wait_while { foo.test.compile.run_count != 2 }
156
147
 
157
148
  foo.compile.run_count.should == 2
158
149
  foo.test.compile.run_count.should == 2
@@ -162,6 +153,23 @@ describe Buildr::CCTask do
162
153
  thread.exit
163
154
  end
164
155
 
156
+ def modify_file_times(filename)
157
+ # Sleep prior to touch so works with filesystems with low resolutions
158
+ t1 = File.mtime(filename)
159
+ while t1 == File.mtime(filename)
160
+ sleep 1
161
+ touch filename
162
+ end
163
+ end
164
+
165
+ def wait_while(&block)
166
+ sleep_count = 0
167
+ while block.call && sleep_count < 15
168
+ sleep 1
169
+ sleep_count += 1
170
+ end
171
+ end
172
+
165
173
  it 'should support parent and subprojects' do |spec|
166
174
  write 'foo/src/main/java/Example.java', "public class Example {}"
167
175
  write 'foo/src/test/java/ExampleTest.java', "public class ExampleTest {}"
@@ -179,6 +187,8 @@ describe Buildr::CCTask do
179
187
  define('bar')
180
188
  end
181
189
 
190
+ time = Time.now
191
+
182
192
  all = projects("container", "container:foo", "container:bar")
183
193
  all.each { |p| instrument_project(p) }
184
194
 
@@ -191,7 +201,7 @@ describe Buildr::CCTask do
191
201
  end
192
202
  end
193
203
 
194
- sleep 2
204
+ wait_while { all.any? { |p| p.test.compile.run_count != 1 } }
195
205
 
196
206
  all.each do |p|
197
207
  p.compile.run_count.should == 1
@@ -202,14 +212,17 @@ describe Buildr::CCTask do
202
212
  file("foo/target/classes/Example.class").should exist
203
213
  tstamp = File.mtime("foo/target/classes/Example.class")
204
214
 
205
- touch 'foo/src/main/java/Example.java'
206
- sleep 2
215
+ modify_file_times('foo/src/main/java/Example.java')
216
+ wait_while { project("container:foo").test.compile.run_count != 2 }
207
217
 
208
218
  project("container:foo").tap do |p|
209
219
  p.compile.run_count.should == 2
210
220
  p.test.compile.run_count.should == 2
211
221
  p.resources.run_count.should == 2
212
222
  end
223
+
224
+ wait_while { project("container").resources.run_count != 2 }
225
+
213
226
  project("container").tap do |p|
214
227
  p.compile.run_count.should == 1 # not_needed
215
228
  p.test.compile.run_count.should == 1 # not_needed
@@ -217,8 +230,9 @@ describe Buildr::CCTask do
217
230
  end
218
231
  File.mtime("foo/target/classes/Example.class").should_not == tstamp
219
232
 
220
- touch 'src/main/java/Example.java'
221
- sleep 2
233
+ modify_file_times('src/main/java/Example.java')
234
+
235
+ wait_while { project("container").resources.run_count != 3 }
222
236
 
223
237
  project("container").tap do |p|
224
238
  p.compile.run_count.should == 2