buildr 1.4.7.pre2-java → 1.4.8-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/CHANGELOG +65 -2
  2. data/Rakefile +3 -6
  3. data/addon/buildr/bnd.rb +13 -3
  4. data/addon/buildr/{checkstyle.rake → checkstyle.rb} +1 -1
  5. data/addon/buildr/{findbugs.rake → findbugs.rb} +0 -0
  6. data/addon/buildr/git_auto_version.rb +33 -0
  7. data/addon/buildr/gwt.rb +82 -0
  8. data/addon/buildr/jacoco.rb +194 -0
  9. data/addon/buildr/{javancss.rake → javancss.rb} +0 -0
  10. data/addon/buildr/nailgun.rb +2 -2
  11. data/addon/buildr/{pmd.rake → pmd.rb} +3 -1
  12. data/addon/buildr/sonar.rb +142 -0
  13. data/buildr.buildfile +1 -1
  14. data/buildr.gemspec +37 -26
  15. data/doc/_layouts/default.html +0 -2
  16. data/doc/contributing.textile +47 -0
  17. data/doc/download.textile +24 -0
  18. data/doc/index.textile +43 -23
  19. data/doc/languages.textile +65 -6
  20. data/doc/more_stuff.textile +43 -0
  21. data/doc/packaging.textile +2 -0
  22. data/doc/settings_profiles.textile +1 -1
  23. data/etc/KEYS +44 -0
  24. data/lib/buildr.rb +3 -7
  25. data/lib/buildr/core/application.rb +41 -8
  26. data/lib/buildr/core/build.rb +102 -1
  27. data/lib/buildr/core/cc.rb +14 -8
  28. data/lib/buildr/core/doc.rb +9 -3
  29. data/lib/buildr/core/generate.rb +150 -9
  30. data/lib/buildr/core/run.rb +1 -1
  31. data/lib/buildr/core/shell.rb +1 -1
  32. data/lib/buildr/core/test.rb +1 -1
  33. data/lib/buildr/core/util.rb +5 -5
  34. data/lib/buildr/ide/eclipse.rb +118 -4
  35. data/lib/buildr/ide/idea.rb +278 -1
  36. data/lib/buildr/java/ant.rb +2 -3
  37. data/lib/buildr/java/bdd.rb +4 -4
  38. data/lib/buildr/java/commands.rb +1 -1
  39. data/lib/buildr/java/pom.rb +5 -4
  40. data/lib/buildr/java/rjb.rb +5 -4
  41. data/lib/buildr/java/test_result.rb +4 -0
  42. data/lib/buildr/packaging/artifact.rb +1 -1
  43. data/lib/buildr/packaging/version_requirement.rb +1 -1
  44. data/lib/buildr/packaging/zip.rb +1 -1
  45. data/lib/buildr/packaging/ziptask.rb +2 -2
  46. data/lib/buildr/run.rb +3 -2
  47. data/lib/buildr/scala.rb +1 -1
  48. data/lib/buildr/scala/bdd.rb +9 -2
  49. data/lib/buildr/scala/compiler.rb +94 -4
  50. data/lib/buildr/scala/doc.rb +17 -5
  51. data/lib/buildr/scala/org/apache/buildr/Specs2Runner.class +0 -0
  52. data/lib/buildr/scala/tests.rb +15 -4
  53. data/lib/buildr/version.rb +1 -1
  54. data/rakelib/all-in-one.rake +50 -47
  55. data/rakelib/checks.rake +4 -4
  56. data/rakelib/doc.rake +84 -87
  57. data/rakelib/metrics.rake +9 -9
  58. data/rakelib/package.rake +14 -35
  59. data/rakelib/release.rake +11 -12
  60. data/rakelib/rspec.rake +73 -60
  61. data/rakelib/stage.rake +32 -54
  62. data/spec/addon/bnd_spec.rb +61 -7
  63. data/spec/core/application_spec.rb +1 -1
  64. data/spec/core/build_spec.rb +117 -0
  65. data/spec/core/cc_spec.rb +37 -15
  66. data/spec/core/common_spec.rb +3 -2
  67. data/spec/core/compile_spec.rb +3 -3
  68. data/spec/core/doc_spec.rb +1 -1
  69. data/spec/core/generate_from_eclipse_spec.rb +280 -0
  70. data/spec/core/run_spec.rb +17 -4
  71. data/spec/core/test_spec.rb +5 -3
  72. data/spec/ide/idea_spec.rb +2 -2
  73. data/spec/java/bdd_spec.rb +2 -2
  74. data/spec/java/cobertura_spec.rb +4 -0
  75. data/spec/java/emma_spec.rb +4 -1
  76. data/spec/java/java_spec.rb +1 -1
  77. data/spec/java/packaging_spec.rb +2 -1
  78. data/spec/java/pom_spec.rb +125 -0
  79. data/spec/packaging/archive_spec.rb +25 -2
  80. data/spec/packaging/artifact_spec.rb +3 -3
  81. data/spec/sandbox.rb +7 -2
  82. data/spec/scala/compiler_spec.rb +41 -0
  83. data/spec/scala/doc_spec.rb +22 -3
  84. data/spec/scala/scala.rb +2 -2
  85. data/spec/scala/tests_spec.rb +2 -2
  86. data/spec/spec_helpers.rb +6 -1
  87. data/spec/version_requirement_spec.rb +2 -0
  88. metadata +651 -480
  89. data/lib/buildr/ide/eclipse/java.rb +0 -49
  90. data/lib/buildr/ide/eclipse/plugin.rb +0 -67
  91. data/lib/buildr/ide/eclipse/scala.rb +0 -64
data/rakelib/stage.rake CHANGED
@@ -13,80 +13,67 @@
13
13
  # License for the specific language governing permissions and limitations under
14
14
  # the License.
15
15
 
16
-
16
+ require 'rubyforge'
17
17
  require 'digest/md5'
18
18
  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
+ gpg_arg = args.gpg || ENV['gpg']
24
+
25
+ if false
23
26
  # Make sure we're doing a release from checked code.
24
27
  lambda do
25
- puts "Checking there are no local changes ... "
28
+ puts 'Checking there are no local changes ... '
26
29
  svn = `svn status`
27
30
  fail "Cannot release unless all local changes are in SVN:\n#{svn}" unless svn.empty?
28
31
  git = `git status -s`
29
32
  fail "Cannot release unless all local changes are in Git:\n#{git}" if git[/^ M/] && ENV["IGNORE_GIT"].nil?
30
- 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'
31
34
  end.call
32
35
 
33
36
  # Make sure we have a valid CHANGELOG entry for this release.
34
37
  lambda do
35
- 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 ... '
36
39
  expecting = "#{spec.version} (#{Time.now.strftime('%Y-%m-%d')})"
37
40
  header = File.readlines('CHANGELOG').first.chomp
38
41
  fail "Expecting CHANGELOG to start with #{expecting}, but found #{header} instead" unless expecting == header
39
- puts "[x] CHANGELOG indicates most recent version and today's date"
42
+ puts '[x] CHANGELOG indicates most recent version and today''s date'
40
43
  end.call
44
+ end
41
45
 
42
46
  # Need GPG to sign the packages.
43
47
  lambda do
44
- args.gpg or fail "Please run with gpg=<argument for gpg --local-user>"
45
- gpg_ok = `gpg2 --list-keys #{args.gpg}`
48
+ gpg_arg or fail 'Please run with gpg=<argument for gpg --local-user>'
49
+ gpg_ok = `gpg2 --list-keys #{gpg_arg}` rescue nil
46
50
  if !$?.success?
47
- gpg_ok = `gpg --list-keys #{args.gpg}`
51
+ gpg_ok = `gpg --list-keys #{gpg_arg}`
48
52
  gpg_cmd = 'gpg'
49
53
  end
50
- fail "No GPG user #{args.gpg}" if gpg_ok.empty?
54
+ fail "No GPG user #{gpg_arg}" if gpg_ok.empty?
51
55
  end.call
52
56
 
53
- task(:license).invoke
54
-
55
- # Need JRuby, Scala and Groovy installed to run all the specs.
56
- lambda do
57
- puts "Checking that we have JRuby, Scala and Groovy available ... "
58
- sh 'jruby --version'
59
- sh 'scala -version'
60
- sh 'groovy -version'
61
- puts "[X] We have JRuby, Scala and Groovy"
62
- end.call
57
+ task('license').invoke
63
58
 
64
59
  # Need Prince to generate PDF
65
60
  lambda do
66
- puts "Checking that we have prince available ... "
61
+ puts 'Checking that we have prince available ... '
67
62
  sh 'prince --version'
68
- puts "[X] We have prince available"
69
- end.call
70
-
71
- # Need RubyForge to upload new release files.
72
- lambda do
73
- puts "[!] Make sure you have admin privileges to make a release on RubyForge"
74
- rubyforge = RubyForge.new.configure
75
- rubyforge.login
76
- rubyforge.scrape_project(spec.name)
63
+ puts '[X] We have prince available'
77
64
  end.call
78
65
 
79
- # We will be speccing in one platform, so also spec the other one.
80
- task(RUBY_PLATFORM =~ /java/ ? 'spec:ruby' : 'spec:jruby').invoke # Test the *other* platform
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'
81
68
  end
82
69
 
83
-
84
- task :stage=>[:clobber, :prepare] do |task, args|
70
+ task 'stage' => %w(clobber prepare) do |task, args|
71
+ gpg_arg = args.gpg || ENV['gpg']
85
72
  mkpath '_staged'
86
73
 
87
74
  # Start by figuring out what has changed.
88
75
  lambda do
89
- puts "Looking for changes between this release and previous one ..."
76
+ puts 'Looking for changes between this release and previous one ...'
90
77
  pattern = /(^(\d+\.\d+(?:\.\d+)?)\s+\(\d{4}-\d{2}-\d{2}\)\s*((:?^[^\n]+\n)*))/
91
78
  changes = File.read('CHANGELOG').scan(pattern).inject({}) { |hash, set| hash[set[1]] = set[2] ; hash }
92
79
  current = changes[spec.version.to_s]
@@ -95,14 +82,14 @@ task :stage=>[:clobber, :prepare] do |task, args|
95
82
  file.write "#{spec.version} (#{Time.now.strftime('%Y-%m-%d')})\n"
96
83
  file.write current
97
84
  end
98
- puts "[X] Listed most recent changed in _staged/CHANGES"
85
+ puts '[X] Listed most recent changed in _staged/CHANGES'
99
86
  end.call
100
87
 
101
88
  # Create the packages (gem, tarball) and sign them. This requires user
102
89
  # intervention so the earlier we do it the better.
103
90
  lambda do
104
- puts "Creating and signing release packages ..."
105
- task(:package).invoke
91
+ puts 'Creating and signing release packages ...'
92
+ task('package').invoke
106
93
  mkpath '_staged/dist'
107
94
  FileList['pkg/*.{gem,zip,tgz}'].each do |source|
108
95
  pkg = source.pathmap('_staged/dist/%n%x')
@@ -110,16 +97,16 @@ task :stage=>[:clobber, :prepare] do |task, args|
110
97
  bytes = File.open(pkg, 'rb') { |file| file.read }
111
98
  File.open(pkg + '.md5', 'w') { |file| file.write Digest::MD5.hexdigest(bytes) << ' ' << File.basename(pkg) }
112
99
  File.open(pkg + '.sha1', 'w') { |file| file.write Digest::SHA1.hexdigest(bytes) << ' ' << File.basename(pkg) }
113
- sh gpg_cmd, '--local-user', args.gpg, '--armor', '--output', pkg + '.asc', '--detach-sig', pkg, :verbose=>true
100
+ sh gpg_cmd, '--local-user', gpg_arg, '--armor', '--output', pkg + '.asc', '--detach-sig', pkg, :verbose=>true
114
101
  end
115
102
  cp 'etc/KEYS', '_staged/dist'
116
- puts "[X] Created and signed release packages in _staged/dist"
103
+ puts '[X] Created and signed release packages in _staged/dist'
117
104
  end.call
118
105
 
119
106
  # The download page should link to the new binaries/sources, and we
120
107
  # want to do that before generating the site/documentation.
121
108
  lambda do
122
- puts "Updating download page with links to release packages ... "
109
+ puts 'Updating download page with links to release packages ... '
123
110
  mirror = "http://www.apache.org/dyn/closer.cgi/#{spec.name}/#{spec.version}"
124
111
  official = "http://www.apache.org/dist/#{spec.name}/#{spec.version}"
125
112
  rows = FileList['_staged/dist/*.{gem,tgz,zip}'].map { |pkg|
@@ -147,10 +134,10 @@ p>. ("Release signing keys":#{official}/KEYS)
147
134
  # Now we can create the Web site, this includes running specs, coverage report, etc.
148
135
  # This will take a while, so we want to do it as last step before upload.
149
136
  lambda do
150
- puts "Creating new Web site"
137
+ puts 'Creating new Web site'
151
138
  task(:site).invoke
152
139
  cp_r '_site', '_staged/site'
153
- puts "[X] Created new Web site in _staged/site"
140
+ puts '[X] Created new Web site in _staged/site'
154
141
  end.call
155
142
 
156
143
 
@@ -189,13 +176,6 @@ The documentation generated for this release is available here:
189
176
  #{base_url}/site/
190
177
  #{base_url}/site/buildr.pdf
191
178
 
192
- The official specification against which this release was tested:
193
- #{base_url}/site/specs.html
194
-
195
- Test coverage report:
196
- #{base_url}/site/coverage/index.html
197
-
198
-
199
179
  The following changes were made since #{previous_version}:
200
180
 
201
181
  #{changes.gsub(/^/, ' ')}
@@ -203,11 +183,9 @@ The following changes were made since #{previous_version}:
203
183
  File.open 'vote-email.txt', 'w' do |file|
204
184
  file.write email
205
185
  end
206
- puts "[X] Created release vote email template in 'vote-email.txt'"
186
+ puts '[X] Created release vote email template in ''vote-email.txt'''
207
187
  puts email
208
188
  end.call
209
-
210
189
  end
211
190
 
212
-
213
- 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
@@ -133,7 +133,7 @@ describe Buildr::Application do
133
133
  write 'build.yaml', <<-YAML
134
134
  gems:
135
135
  - rake
136
- - rspec ~> 2.1.0
136
+ - rspec ~> 2.9.0
137
137
  YAML
138
138
  Buildr.application.should_receive(:listed_gems).and_return([[Gem.loaded_specs['rspec'],Gem.loaded_specs['rake']],[]])
139
139
  Buildr.application.load_gems
@@ -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
@@ -92,21 +92,19 @@ describe Buildr::CCTask do
92
92
  foo.cc.invoke
93
93
  rescue => e
94
94
  p "unexpected exception #{e.inspect}"
95
- p e.backtrace.join("\n").inspect
95
+ p e.backtrace.join("\n")
96
96
  end
97
97
  end
98
98
 
99
- sleep 1
99
+ wait_while { foo.test.compile.run_count != 1 }
100
100
 
101
101
  foo.compile.run_count.should == 1
102
102
  foo.test.compile.run_count.should == 1
103
103
  foo.resources.run_count.should == 1
104
104
 
105
- sleep 1 # Wait one sec as the timestamp needs to be different.
106
-
107
- touch File.join(Dir.pwd, 'src/main/java/Example.java')
105
+ modify_file_times(File.join(Dir.pwd, 'src/main/java/Example.java'))
108
106
 
109
- sleep 1
107
+ wait_while { foo.test.compile.run_count != 2 }
110
108
 
111
109
  foo.compile.run_count.should == 2
112
110
  foo.test.compile.run_count.should == 2
@@ -134,17 +132,18 @@ describe Buildr::CCTask do
134
132
  end
135
133
  end
136
134
 
137
- sleep 1
135
+ wait_while { foo.test.compile.run_count != 1 }
138
136
 
139
137
  foo.compile.run_count.should == 1
140
138
  foo.test.compile.run_count.should == 1
141
139
  foo.resources.run_count.should == 1
142
140
 
143
141
  file("foo/target/classes/Example.class").should exist
142
+
144
143
  tstamp = File.mtime("foo/target/classes/Example.class")
145
- touch File.join(Dir.pwd, 'foo/src/main/java/Example.java')
146
144
 
147
- 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 }
148
147
 
149
148
  foo.compile.run_count.should == 2
150
149
  foo.test.compile.run_count.should == 2
@@ -154,6 +153,23 @@ describe Buildr::CCTask do
154
153
  thread.exit
155
154
  end
156
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
+
157
173
  it 'should support parent and subprojects' do |spec|
158
174
  write 'foo/src/main/java/Example.java', "public class Example {}"
159
175
  write 'foo/src/test/java/ExampleTest.java', "public class ExampleTest {}"
@@ -171,6 +187,8 @@ describe Buildr::CCTask do
171
187
  define('bar')
172
188
  end
173
189
 
190
+ time = Time.now
191
+
174
192
  all = projects("container", "container:foo", "container:bar")
175
193
  all.each { |p| instrument_project(p) }
176
194
 
@@ -183,7 +201,7 @@ describe Buildr::CCTask do
183
201
  end
184
202
  end
185
203
 
186
- sleep 2
204
+ wait_while { all.any? { |p| p.test.compile.run_count != 1 } }
187
205
 
188
206
  all.each do |p|
189
207
  p.compile.run_count.should == 1
@@ -194,14 +212,17 @@ describe Buildr::CCTask do
194
212
  file("foo/target/classes/Example.class").should exist
195
213
  tstamp = File.mtime("foo/target/classes/Example.class")
196
214
 
197
- touch 'foo/src/main/java/Example.java'
198
- sleep 2
215
+ modify_file_times('foo/src/main/java/Example.java')
216
+ wait_while { project("container:foo").test.compile.run_count != 2 }
199
217
 
200
218
  project("container:foo").tap do |p|
201
219
  p.compile.run_count.should == 2
202
220
  p.test.compile.run_count.should == 2
203
221
  p.resources.run_count.should == 2
204
222
  end
223
+
224
+ wait_while { project("container").resources.run_count != 2 }
225
+
205
226
  project("container").tap do |p|
206
227
  p.compile.run_count.should == 1 # not_needed
207
228
  p.test.compile.run_count.should == 1 # not_needed
@@ -209,8 +230,9 @@ describe Buildr::CCTask do
209
230
  end
210
231
  File.mtime("foo/target/classes/Example.class").should_not == tstamp
211
232
 
212
- touch 'src/main/java/Example.java'
213
- sleep 2
233
+ modify_file_times('src/main/java/Example.java')
234
+
235
+ wait_while { project("container").resources.run_count != 3 }
214
236
 
215
237
  project("container").tap do |p|
216
238
  p.compile.run_count.should == 2