buildr 1.3.5-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 (186) hide show
  1. data/CHANGELOG +998 -0
  2. data/LICENSE +176 -0
  3. data/NOTICE +26 -0
  4. data/README.rdoc +134 -0
  5. data/Rakefile +45 -0
  6. data/_buildr +29 -0
  7. data/_jbuildr +29 -0
  8. data/addon/buildr/antlr.rb +65 -0
  9. data/addon/buildr/cobertura.rb +22 -0
  10. data/addon/buildr/drb.rb +281 -0
  11. data/addon/buildr/emma.rb +22 -0
  12. data/addon/buildr/hibernate.rb +142 -0
  13. data/addon/buildr/javacc.rb +85 -0
  14. data/addon/buildr/jdepend.rb +60 -0
  15. data/addon/buildr/jetty.rb +248 -0
  16. data/addon/buildr/jibx.rb +86 -0
  17. data/addon/buildr/nailgun.rb +221 -0
  18. data/addon/buildr/openjpa.rb +90 -0
  19. data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
  20. data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
  21. data/addon/buildr/org/apache/buildr/BuildrNail.java +41 -0
  22. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  23. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  24. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  25. data/addon/buildr/org/apache/buildr/JettyWrapper.java +144 -0
  26. data/addon/buildr/xmlbeans.rb +93 -0
  27. data/bin/buildr +19 -0
  28. data/buildr.buildfile +58 -0
  29. data/buildr.gemspec +65 -0
  30. data/doc/_config.yml +1 -0
  31. data/doc/_layouts/default.html +88 -0
  32. data/doc/_layouts/preface.html +22 -0
  33. data/doc/artifacts.textile +211 -0
  34. data/doc/building.textile +244 -0
  35. data/doc/contributing.textile +252 -0
  36. data/doc/css/default.css +236 -0
  37. data/doc/css/print.css +101 -0
  38. data/doc/css/syntax.css +23 -0
  39. data/doc/download.textile +79 -0
  40. data/doc/extending.textile +186 -0
  41. data/doc/images/1442160941-frontcover.jpg +0 -0
  42. data/doc/images/asf-logo.gif +0 -0
  43. data/doc/images/asf-logo.png +0 -0
  44. data/doc/images/buildr-hires.png +0 -0
  45. data/doc/images/buildr.png +0 -0
  46. data/doc/images/favicon.png +0 -0
  47. data/doc/images/growl-icon.tiff +0 -0
  48. data/doc/images/note.png +0 -0
  49. data/doc/images/project-structure.png +0 -0
  50. data/doc/images/tip.png +0 -0
  51. data/doc/images/zbuildr.png +0 -0
  52. data/doc/images/zbuildr.tif +0 -0
  53. data/doc/index.textile +69 -0
  54. data/doc/installing.textile +266 -0
  55. data/doc/languages.textile +459 -0
  56. data/doc/mailing_lists.textile +25 -0
  57. data/doc/more_stuff.textile +457 -0
  58. data/doc/packaging.textile +430 -0
  59. data/doc/preface.textile +54 -0
  60. data/doc/projects.textile +271 -0
  61. data/doc/quick_start.textile +210 -0
  62. data/doc/scripts/buildr-git.rb +512 -0
  63. data/doc/scripts/gitflow.rb +296 -0
  64. data/doc/scripts/install-jruby.sh +44 -0
  65. data/doc/scripts/install-linux.sh +72 -0
  66. data/doc/scripts/install-osx.sh +52 -0
  67. data/doc/settings_profiles.textile +280 -0
  68. data/doc/testing.textile +222 -0
  69. data/etc/KEYS +151 -0
  70. data/lib/buildr.rb +36 -0
  71. data/lib/buildr/core.rb +35 -0
  72. data/lib/buildr/core/application.rb +656 -0
  73. data/lib/buildr/core/build.rb +452 -0
  74. data/lib/buildr/core/checks.rb +254 -0
  75. data/lib/buildr/core/common.rb +150 -0
  76. data/lib/buildr/core/compile.rb +608 -0
  77. data/lib/buildr/core/environment.rb +129 -0
  78. data/lib/buildr/core/filter.rb +362 -0
  79. data/lib/buildr/core/generate.rb +195 -0
  80. data/lib/buildr/core/help.rb +119 -0
  81. data/lib/buildr/core/osx.rb +46 -0
  82. data/lib/buildr/core/progressbar.rb +156 -0
  83. data/lib/buildr/core/project.rb +866 -0
  84. data/lib/buildr/core/shell.rb +198 -0
  85. data/lib/buildr/core/test.rb +723 -0
  86. data/lib/buildr/core/transports.rb +559 -0
  87. data/lib/buildr/core/util.rb +449 -0
  88. data/lib/buildr/groovy.rb +19 -0
  89. data/lib/buildr/groovy/bdd.rb +106 -0
  90. data/lib/buildr/groovy/compiler.rb +138 -0
  91. data/lib/buildr/groovy/shell.rb +48 -0
  92. data/lib/buildr/ide.rb +19 -0
  93. data/lib/buildr/ide/eclipse.rb +334 -0
  94. data/lib/buildr/ide/eclipse/java.rb +53 -0
  95. data/lib/buildr/ide/eclipse/plugin.rb +68 -0
  96. data/lib/buildr/ide/eclipse/scala.rb +66 -0
  97. data/lib/buildr/ide/idea.ipr.template +300 -0
  98. data/lib/buildr/ide/idea.rb +190 -0
  99. data/lib/buildr/ide/idea7x.ipr.template +290 -0
  100. data/lib/buildr/ide/idea7x.rb +212 -0
  101. data/lib/buildr/java.rb +23 -0
  102. data/lib/buildr/java/ant.rb +94 -0
  103. data/lib/buildr/java/bdd.rb +459 -0
  104. data/lib/buildr/java/cobertura.rb +274 -0
  105. data/lib/buildr/java/commands.rb +213 -0
  106. data/lib/buildr/java/compiler.rb +349 -0
  107. data/lib/buildr/java/deprecated.rb +141 -0
  108. data/lib/buildr/java/emma.rb +244 -0
  109. data/lib/buildr/java/jruby.rb +117 -0
  110. data/lib/buildr/java/jtestr_runner.rb.erb +116 -0
  111. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  112. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +137 -0
  113. data/lib/buildr/java/packaging.rb +716 -0
  114. data/lib/buildr/java/pom.rb +174 -0
  115. data/lib/buildr/java/rjb.rb +155 -0
  116. data/lib/buildr/java/test_result.rb +353 -0
  117. data/lib/buildr/java/tests.rb +333 -0
  118. data/lib/buildr/java/version_requirement.rb +172 -0
  119. data/lib/buildr/packaging.rb +24 -0
  120. data/lib/buildr/packaging/archive.rb +488 -0
  121. data/lib/buildr/packaging/artifact.rb +749 -0
  122. data/lib/buildr/packaging/artifact_namespace.rb +972 -0
  123. data/lib/buildr/packaging/artifact_search.rb +140 -0
  124. data/lib/buildr/packaging/gems.rb +102 -0
  125. data/lib/buildr/packaging/package.rb +238 -0
  126. data/lib/buildr/packaging/tar.rb +186 -0
  127. data/lib/buildr/packaging/version_requirement.rb +172 -0
  128. data/lib/buildr/packaging/zip.rb +73 -0
  129. data/lib/buildr/packaging/ziptask.rb +316 -0
  130. data/lib/buildr/resources/buildr.icns +0 -0
  131. data/lib/buildr/scala.rb +25 -0
  132. data/lib/buildr/scala/bdd.rb +109 -0
  133. data/lib/buildr/scala/compiler.rb +195 -0
  134. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  135. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  136. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +35 -0
  137. data/lib/buildr/scala/shell.rb +55 -0
  138. data/lib/buildr/scala/tests.rb +157 -0
  139. data/lib/buildr/shell.rb +180 -0
  140. data/rakelib/checks.rake +57 -0
  141. data/rakelib/doc.rake +92 -0
  142. data/rakelib/jekylltask.rb +120 -0
  143. data/rakelib/package.rake +73 -0
  144. data/rakelib/release.rake +149 -0
  145. data/rakelib/rspec.rake +73 -0
  146. data/rakelib/setup.rake +54 -0
  147. data/rakelib/stage.rake +213 -0
  148. data/rakelib/stage.rake~ +213 -0
  149. data/spec/addon/drb_spec.rb +328 -0
  150. data/spec/core/application_spec.rb +502 -0
  151. data/spec/core/build_spec.rb +677 -0
  152. data/spec/core/checks_spec.rb +519 -0
  153. data/spec/core/common_spec.rb +670 -0
  154. data/spec/core/compile_spec.rb +583 -0
  155. data/spec/core/extension_spec.rb +93 -0
  156. data/spec/core/generate_spec.rb +33 -0
  157. data/spec/core/project_spec.rb +762 -0
  158. data/spec/core/test_spec.rb +1098 -0
  159. data/spec/core/transport_spec.rb +537 -0
  160. data/spec/core/util_spec.rb +67 -0
  161. data/spec/groovy/bdd_spec.rb +80 -0
  162. data/spec/groovy/compiler_spec.rb +240 -0
  163. data/spec/ide/eclipse_spec.rb +501 -0
  164. data/spec/ide/idea7x_spec.rb +84 -0
  165. data/spec/java/ant_spec.rb +33 -0
  166. data/spec/java/bdd_spec.rb +382 -0
  167. data/spec/java/cobertura_spec.rb +85 -0
  168. data/spec/java/compiler_spec.rb +446 -0
  169. data/spec/java/emma_spec.rb +119 -0
  170. data/spec/java/java_spec.rb +124 -0
  171. data/spec/java/packaging_spec.rb +1134 -0
  172. data/spec/java/test_coverage_helper.rb +257 -0
  173. data/spec/java/tests_spec.rb +493 -0
  174. data/spec/packaging/archive_spec.rb +527 -0
  175. data/spec/packaging/artifact_namespace_spec.rb +654 -0
  176. data/spec/packaging/artifact_spec.rb +795 -0
  177. data/spec/packaging/packaging_helper.rb +63 -0
  178. data/spec/packaging/packaging_spec.rb +684 -0
  179. data/spec/sandbox.rb +142 -0
  180. data/spec/scala/bdd_spec.rb +119 -0
  181. data/spec/scala/compiler_spec.rb +284 -0
  182. data/spec/scala/scala.rb +38 -0
  183. data/spec/scala/tests_spec.rb +261 -0
  184. data/spec/spec_helpers.rb +340 -0
  185. data/spec/version_requirement_spec.rb +129 -0
  186. metadata +383 -0
@@ -0,0 +1,677 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
+
19
+
20
+ describe 'local task', :shared=>true do
21
+ it "should execute task for project in current directory" do
22
+ define 'foobar'
23
+ lambda { @task.invoke }.should run_task("foobar:#{@task.name}")
24
+ end
25
+
26
+ it "should not execute task for projects in other directory" do
27
+ define 'foobar', :base_dir=>'elsewhere'
28
+ lambda { task('build').invoke }.should_not run_task('foobar:build')
29
+ end
30
+ end
31
+
32
+
33
+ describe 'build task' do
34
+ it_should_behave_like 'local task'
35
+ before(:each) { @task = task('build') }
36
+ end
37
+
38
+ describe 'clean task' do
39
+ it_should_behave_like 'local task'
40
+ before(:each) { @task = task('clean') }
41
+ end
42
+
43
+ describe 'package task' do
44
+ it_should_behave_like 'local task'
45
+ before(:each) { @task = task('package') }
46
+
47
+ it 'should execute build task as prerequisite' do
48
+ lambda { @task.invoke }.should run_task('build')
49
+ end
50
+ end
51
+
52
+ describe 'install task' do
53
+ it_should_behave_like 'local task'
54
+ before(:each) { @task = task('install') }
55
+
56
+ it 'should execute package task as prerequisite' do
57
+ lambda { @task.invoke }.should run_task('package')
58
+ end
59
+ end
60
+
61
+ describe 'uninstall task' do
62
+ it_should_behave_like 'local task'
63
+ before(:each) { @task = task('uninstall') }
64
+ end
65
+
66
+ describe 'upload task' do
67
+ it_should_behave_like 'local task'
68
+ before(:each) { @task = task('upload') }
69
+
70
+ it 'should execute package task as prerequisite' do
71
+ lambda { @task.invoke }.should run_task('package')
72
+ end
73
+ end
74
+
75
+
76
+ describe Project, '#build' do
77
+ it 'should return the project\'s build task' do
78
+ define('foo').build.should eql(task('foo:build'))
79
+ end
80
+
81
+ it 'should enhance the project\'s build task' do
82
+ task 'prereq'
83
+ task 'action'
84
+ define 'foo' do
85
+ build 'prereq' do
86
+ task('action').invoke
87
+ end
88
+ end
89
+ lambda { project('foo').build.invoke }.should run_tasks('prereq', 'action')
90
+ end
91
+
92
+ it 'should execute build task for sub-project' do
93
+ define 'foo' do
94
+ define 'bar'
95
+ end
96
+ lambda { task('foo:build').invoke }.should run_task('foo:bar:build')
97
+ end
98
+
99
+ it 'should not execute build task of other projects' do
100
+ define 'foo'
101
+ define 'bar'
102
+ lambda { task('foo:build').invoke }.should_not run_task('bar:build')
103
+ end
104
+ end
105
+
106
+
107
+ describe Project, '#clean' do
108
+ it 'should return the project\'s clean task' do
109
+ define('foo').clean.should eql(task('foo:clean'))
110
+ end
111
+
112
+ it 'should enhance the project\'s clean task' do
113
+ task 'prereq'
114
+ task 'action'
115
+ define 'foo' do
116
+ clean 'prereq' do
117
+ task('action').invoke
118
+ end
119
+ end
120
+ lambda { project('foo').clean.invoke }.should run_tasks('prereq', 'action')
121
+ end
122
+
123
+ it 'should remove target directory' do
124
+ define 'foo' do
125
+ self.layout[:target] = 'targeted'
126
+ end
127
+ mkpath 'targeted'
128
+ lambda { project('foo').clean.invoke }.should change { File.exist?('targeted') }.from(true).to(false)
129
+ end
130
+
131
+ it 'should remove reports directory' do
132
+ define 'foo' do
133
+ self.layout[:reports] = 'reported'
134
+ end
135
+ mkpath 'reported'
136
+ lambda { project('foo').clean.invoke }.should change { File.exist?('reported') }.from(true).to(false)
137
+ end
138
+
139
+ it 'should execute clean task for sub-project' do
140
+ define 'foo' do
141
+ define 'bar'
142
+ end
143
+ lambda { task('foo:clean').invoke }.should run_task('foo:bar:clean')
144
+ end
145
+
146
+ it 'should not execute clean task of other projects' do
147
+ define 'foo'
148
+ define 'bar'
149
+ lambda { task('foo:clean').invoke }.should_not run_task('bar:clean')
150
+ end
151
+ end
152
+
153
+
154
+ describe Project, '#target' do
155
+ before :each do
156
+ @project = define('foo', :layout=>Layout.new)
157
+ end
158
+
159
+ it 'should default to target' do
160
+ @project.target.should eql('target')
161
+ end
162
+
163
+ it 'should set layout :target' do
164
+ @project.target = 'bar'
165
+ @project.layout.expand(:target).should point_to_path('bar')
166
+ end
167
+
168
+ it 'should come from layout :target' do
169
+ @project.layout[:target] = 'baz'
170
+ @project.target.should eql('baz')
171
+ end
172
+
173
+ it 'should be removed in version 1.5 since it was deprecated in version 1.3' do
174
+ Buildr::VERSION.should < '1.5'
175
+ end
176
+ end
177
+
178
+
179
+ describe Project, '#reports' do
180
+ before :each do
181
+ @project = define('foo', :layout=>Layout.new)
182
+ end
183
+
184
+ it 'should default to reports' do
185
+ @project.reports.should eql('reports')
186
+ end
187
+
188
+ it 'should set layout :reports' do
189
+ @project.reports = 'bar'
190
+ @project.layout.expand(:reports).should point_to_path('bar')
191
+ end
192
+
193
+ it 'should come from layout :reports' do
194
+ @project.layout[:reports] = 'baz'
195
+ @project.reports.should eql('baz')
196
+ end
197
+
198
+ it 'should be removed in version 1.5 since it was deprecated in version 1.3' do
199
+ Buildr::VERSION.should < '1.5'
200
+ end
201
+ end
202
+
203
+
204
+ describe Git do
205
+ describe '#uncommitted_files' do
206
+ it 'should return an empty array on a clean repository' do
207
+ Git.should_receive(:`).with('git status').and_return <<-EOF
208
+ # On branch master
209
+ nothing to commit (working directory clean)
210
+ EOF
211
+ Git.uncommitted_files.should be_empty
212
+ end
213
+
214
+ it 'should reject a dirty repository, Git 1.4.2 or former' do
215
+ Git.should_receive(:`).with('git status').and_return <<-EOF
216
+ # On branch master
217
+ #
218
+ # Changed but not updated:
219
+ # (use "git add <file>..." to update what will be committed)
220
+ # (use "git checkout -- <file>..." to discard changes in working directory)
221
+ #
222
+ # modified: lib/buildr.rb
223
+ # modified: spec/buildr_spec.rb
224
+ #
225
+ # Untracked files:
226
+ # (use "git add <file>..." to include in what will be committed)
227
+ #
228
+ # error.log
229
+ EOF
230
+ Git.uncommitted_files.should include('lib/buildr.rb', 'error.log')
231
+ end
232
+
233
+ it 'should reject a dirty repository, Git 1.4.3 or higher' do
234
+ Git.should_receive(:`).with('git status').and_return <<-EOF
235
+ # On branch master
236
+ # Changed but not updated:
237
+ # (use "git add <file>..." to update what will be committed)
238
+ #
239
+ #\tmodified: lib/buildr.rb
240
+ #\tmodified: spec/buildr_spec.rb
241
+ #
242
+ # Untracked files:
243
+ # (use "git add <file>..." to include in what will be committed)
244
+ #
245
+ #\terror.log
246
+ no changes added to commit (use "git add" and/or "git commit -a")
247
+ EOF
248
+ Git.uncommitted_files.should include('lib/buildr.rb', 'error.log')
249
+ end
250
+ end
251
+
252
+ describe '#remote' do
253
+ it 'should return the name of the corresponding remote' do
254
+ Git.should_receive(:git).with('config', '--get', 'branch.master.remote').and_return "origin\n"
255
+ Git.should_receive(:git).with('remote').and_return "upstream\norigin\n"
256
+ Git.send(:remote, 'master').should == 'origin'
257
+ end
258
+
259
+ it 'should return nil if no remote for the given branch' do
260
+ Git.should_receive(:git).with('config', '--get', 'branch.master.remote').and_return "\n"
261
+ Git.should_not_receive(:git).with('remote')
262
+ Git.send(:remote, 'master').should be_nil
263
+ end
264
+ end
265
+
266
+ describe '#current_branch' do
267
+ it 'should return the current branch' do
268
+ Git.should_receive(:git).with('branch').and_return(" master\n* a-clever-idea\n ze-great-idea")
269
+ Git.send(:current_branch).should == 'a-clever-idea'
270
+ end
271
+ end
272
+
273
+ end # of Git
274
+
275
+
276
+ describe Svn do
277
+ describe '#tag' do
278
+ it 'should remove any existing tag with the same name' do
279
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
280
+ Svn.stub!(:copy)
281
+ Svn.should_receive(:remove).with('http://my.repo.org/foo/tags/1.0.0', 'Removing old copy')
282
+
283
+ Svn.tag '1.0.0'
284
+ end
285
+
286
+ it 'should do an svn copy with the release version' do
287
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
288
+ Svn.stub!(:remove)
289
+ Svn.should_receive(:copy).with(Dir.pwd, 'http://my.repo.org/foo/tags/1.0.0', 'Release 1.0.0')
290
+
291
+ Svn.tag '1.0.0'
292
+ end
293
+ end
294
+
295
+ # Reference: http://svnbook.red-bean.com/en/1.4/svn.reposadmin.planning.html#svn.reposadmin.projects.chooselayout
296
+ describe '#tag_url' do
297
+ it 'should accept to tag foo/trunk' do
298
+ Svn.tag_url('http://my.repo.org/foo/trunk', '1.0.0').should == 'http://my.repo.org/foo/tags/1.0.0'
299
+ end
300
+
301
+ it 'should accept to tag foo/branches/1.0' do
302
+ Svn.tag_url('http://my.repo.org/foo/branches/1.0', '1.0.1').should == 'http://my.repo.org/foo/tags/1.0.1'
303
+ end
304
+
305
+ it 'should accept to tag trunk/foo' do
306
+ Svn.tag_url('http://my.repo.org/trunk/foo', '1.0.0').should == 'http://my.repo.org/tags/foo/1.0.0'
307
+ end
308
+
309
+ it 'should accept to tag branches/foo/1.0' do
310
+ Svn.tag_url('http://my.repo.org/branches/foo/1.0', '1.0.0').should == 'http://my.repo.org/tags/foo/1.0.0'
311
+ end
312
+
313
+ describe '#repo_url' do
314
+ it 'should extract the SVN URL from svn info' do
315
+ Svn.should_receive(:svn).and_return <<-XML
316
+ <?xml version="1.0"?>
317
+ <info>
318
+ <entry
319
+ kind="dir"
320
+ path="."
321
+ revision="724987">
322
+ <url>http://my.repo.org/foo/trunk</url>
323
+ <repository>
324
+ <root>http://my.repo.org</root>
325
+ <uuid>13f79535-47bb-0310-9956-ffa450edef68</uuid>
326
+ </repository>
327
+ <wc-info>
328
+ <schedule>normal</schedule>
329
+ <depth>infinity</depth>
330
+ </wc-info>
331
+ <commit
332
+ revision="724955">
333
+ <author>boisvert</author>
334
+ <date>2008-12-10T01:53:51.240936Z</date>
335
+ </commit>
336
+ </entry>
337
+ </info>
338
+ XML
339
+ Svn.repo_url.should == 'http://my.repo.org/foo/trunk'
340
+ end
341
+ end
342
+
343
+ end
344
+
345
+ end # of Buildr::Svn
346
+
347
+
348
+ describe Release do
349
+ describe 'find' do
350
+ it 'should return GitRelease if project uses Git' do
351
+ write '.git/config'
352
+ Release.find.should be_instance_of(GitRelease)
353
+ end
354
+
355
+ it 'should return SvnRelease if project uses SVN' do
356
+ write '.svn/xml'
357
+ Release.find.should be_instance_of(SvnRelease)
358
+ end
359
+
360
+ it 'should return nil if no known release process' do
361
+ Dir.chdir(Dir.tmpdir) do
362
+ Release.find.should be_nil
363
+ end
364
+ end
365
+
366
+ after :each do
367
+ Release.instance_exec { @release = nil }
368
+ end
369
+ end
370
+ end
371
+
372
+
373
+ describe 'a release process', :shared=>true do
374
+
375
+ describe '#make' do
376
+ before do
377
+ write 'buildfile', "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
378
+ # Prevent a real call to a spawned buildr process.
379
+ @release.stub!(:buildr)
380
+ @release.stub!(:check)
381
+ @release.should_receive(:ruby).with('-S', 'buildr', "_#{Buildr::VERSION}_", '--buildfile', File.expand_path('buildfile.next'),
382
+ '--environment', 'development', 'clean', 'upload', 'DEBUG=no')
383
+ end
384
+
385
+ it 'should tag a release with the release version' do
386
+ @release.stub!(:update_version_to_next)
387
+ @release.should_receive(:tag_release).with('1.0.0')
388
+ @release.make
389
+ end
390
+
391
+ it 'should not alter the buildfile before tagging' do
392
+ @release.stub!(:update_version_to_next)
393
+ @release.should_receive(:tag_release).with('1.0.0')
394
+ @release.make
395
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.0"')
396
+ end
397
+
398
+ it 'should update the buildfile with the next version number' do
399
+ @release.stub!(:tag_release)
400
+ @release.make
401
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.1-SNAPSHOT"')
402
+ end
403
+
404
+ it 'should keep leading zeros in the next version number' do
405
+ write 'buildfile', "VERSION_NUMBER = '1.0.001-SNAPSHOT'"
406
+ @release.stub!(:tag_release)
407
+ @release.make
408
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.002-SNAPSHOT"')
409
+ end
410
+
411
+ it 'should commit the updated buildfile' do
412
+ @release.stub!(:tag_release)
413
+ @release.make
414
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.1-SNAPSHOT"')
415
+ end
416
+ end
417
+
418
+ describe '#resolve_tag' do
419
+ before do
420
+ @release.stub!(:extract_version).and_return('1.0.0')
421
+ end
422
+
423
+ it 'should return tag specified by tag_name' do
424
+ @release.tag_name = 'first'
425
+ @release.send(:resolve_tag).should == 'first'
426
+ end
427
+
428
+ it 'should use tag returned by tag_name if tag_name is a proc' do
429
+ @release.tag_name = lambda { |version| "buildr-#{version}" }
430
+ @release.send(:resolve_tag).should == 'buildr-1.0.0'
431
+ end
432
+ after { @release.tag_name = nil }
433
+ end
434
+
435
+ describe '#tag_release' do
436
+ it 'should inform the user' do
437
+ @release.stub!(:extract_version).and_return('1.0.0')
438
+ lambda { @release.tag_release('1.0.0') }.should show_info('Tagging release 1.0.0')
439
+ end
440
+ end
441
+
442
+ describe '#extract_version' do
443
+ it 'should extract VERSION_NUMBER with single quotes' do
444
+ write 'buildfile', "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
445
+ @release.extract_version.should == '1.0.0-SNAPSHOT'
446
+ end
447
+
448
+ it 'should extract VERSION_NUMBER with double quotes' do
449
+ write 'buildfile', %{VERSION_NUMBER = "1.0.1-SNAPSHOT"}
450
+ @release.extract_version.should == '1.0.1-SNAPSHOT'
451
+ end
452
+
453
+ it 'should extract VERSION_NUMBER without any spaces' do
454
+ write 'buildfile', "VERSION_NUMBER='1.0.2-SNAPSHOT'"
455
+ @release.extract_version.should == '1.0.2-SNAPSHOT'
456
+ end
457
+
458
+ it 'should extract THIS_VERSION as an alternative to VERSION_NUMBER' do
459
+ write 'buildfile', "THIS_VERSION = '1.0.3-SNAPSHOT'"
460
+ @release.extract_version.should == '1.0.3-SNAPSHOT'
461
+ end
462
+
463
+ it 'should complain if no current version number' do
464
+ write 'buildfile', 'define foo'
465
+ lambda { @release.extract_version }.should raise_error('Looking for THIS_VERSION = "..." in your Buildfile, none found')
466
+ end
467
+ end
468
+
469
+ describe '#with_release_candidate_version' do
470
+ before do
471
+ Buildr.application.stub!(:buildfile).and_return(file('buildfile'))
472
+ write 'buildfile', "THIS_VERSION = '1.1.0-SNAPSHOT'"
473
+ end
474
+
475
+ it 'should yield the name of the release candidate buildfile' do
476
+ @release.send :with_release_candidate_version do |new_filename|
477
+ File.read(new_filename).should == %{THIS_VERSION = "1.1.0"}
478
+ end
479
+ end
480
+
481
+ it 'should yield a name different from the original buildfile' do
482
+ @release.send :with_release_candidate_version do |new_filename|
483
+ new_filename.should_not point_to_path('buildfile')
484
+ end
485
+ end
486
+ end
487
+
488
+ describe '#update_version_to_next' do
489
+ before do
490
+ write 'buildfile', 'THIS_VERSION = "1.0.0"'
491
+ end
492
+
493
+ it 'should update the buildfile with a new version number' do
494
+ @release.send :update_version_to_next
495
+ file('buildfile').should contain('THIS_VERSION = "1.0.1-SNAPSHOT"')
496
+ end
497
+
498
+ it 'should commit the new buildfile on the trunk' do
499
+ @release.should_receive(:message).and_return('Changed version number to 1.0.1-SNAPSHOT')
500
+ @release.update_version_to_next
501
+ end
502
+
503
+ it 'should use the commit message specified by commit_message' do
504
+ @release.commit_message = 'Here is my custom message'
505
+ @release.should_receive(:message).and_return('Here is my custom message')
506
+ @release.update_version_to_next
507
+ end
508
+
509
+ it 'should use the commit message returned by commit_message if commit_message is a proc' do
510
+ @release.commit_message = lambda { |new_version|
511
+ new_version.should == '1.0.1-SNAPSHOT'
512
+ "increment version number to #{new_version}"
513
+ }
514
+ @release.should_receive(:message).and_return('increment version number to 1.0.1-SNAPSHOT')
515
+ @release.update_version_to_next
516
+ end
517
+
518
+ it 'should inform the user of the new version' do
519
+ lambda { @release.update_version_to_next }.should show_info('Current version is now 1.0.1-SNAPSHOT')
520
+ end
521
+ end
522
+
523
+ end
524
+
525
+
526
+ describe GitRelease do
527
+ it_should_behave_like 'a release process'
528
+
529
+ before do
530
+ @release = GitRelease.new
531
+ Git.stub!(:git)
532
+ Git.stub!(:current_branch).and_return('master')
533
+ end
534
+
535
+ describe '#applies_to?' do
536
+ it 'should reject a non-git repo' do
537
+ Dir.chdir(Dir.tmpdir) do
538
+ GitRelease.applies_to?.should be_false
539
+ end
540
+ end
541
+
542
+ it 'should accept a git repo' do
543
+ FileUtils.mkdir '.git'
544
+ FileUtils.touch File.join('.git', 'config')
545
+ GitRelease.applies_to?.should be_true
546
+ end
547
+ end
548
+
549
+ describe '#release_check' do
550
+ before do
551
+ @release = GitRelease.new
552
+ end
553
+
554
+ it 'should accept a clean repository' do
555
+ Git.should_receive(:`).with('git status').and_return <<-EOF
556
+ # On branch master
557
+ nothing to commit (working directory clean)
558
+ EOF
559
+ Git.should_receive(:remote).and_return('master')
560
+ lambda { @release.check }.should_not raise_error
561
+ end
562
+
563
+ it 'should reject a dirty repository' do
564
+ Git.should_receive(:`).with('git status').and_return <<-EOF
565
+ # On branch master
566
+ # Untracked files:
567
+ # (use "git add <file>..." to include in what will be committed)
568
+ #
569
+ # foo.temp
570
+ EOF
571
+ lambda { @release.check }.should raise_error(RuntimeError, /uncommitted files/i)
572
+ end
573
+
574
+ it 'should reject a repository not tracking remote branch' do
575
+ Git.should_receive(:uncommitted_files).and_return([])
576
+ Git.should_receive(:remote).and_return(nil)
577
+ lambda{ @release.check }.should raise_error(RuntimeError,
578
+ "You are releasing from a local branch that does not track a remote!")
579
+ end
580
+ end
581
+
582
+ describe '#tag_release' do
583
+ before do
584
+ @release = GitRelease.new
585
+ @release.stub!(:extract_version).and_return('1.0.1')
586
+ @release.stub!(:resolve_tag).and_return('TEST_TAG')
587
+ Git.stub!(:git).with('tag', '-a', 'TEST_TAG', '-m', '[buildr] Cutting release TEST_TAG')
588
+ Git.stub!(:git).with('push', 'origin', 'tag', 'TEST_TAG')
589
+ Git.stub!(:commit)
590
+ Git.stub!(:push)
591
+ Git.stub!(:remote).and_return('origin')
592
+ end
593
+
594
+ it 'should delete any existing tag with the same name' do
595
+ Git.should_receive(:git).with('tag', '-d', 'TEST_TAG')
596
+ Git.should_receive(:git).with('push', 'origin', ':refs/tags/TEST_TAG')
597
+ @release.tag_release 'TEST_TAG'
598
+ end
599
+
600
+ it 'should commit the buildfile before tagging' do
601
+ Git.should_receive(:commit).with(File.basename(Buildr.application.buildfile.to_s), "Changed version number to 1.0.1")
602
+ @release.tag_release 'TEST_TAG'
603
+ end
604
+
605
+ it 'should push the tag if a remote is tracked' do
606
+ Git.should_receive(:git).with('tag', '-d', 'TEST_TAG')
607
+ Git.should_receive(:git).with('push', 'origin', ':refs/tags/TEST_TAG')
608
+ Git.should_receive(:git).with('tag', '-a', 'TEST_TAG', '-m', '[buildr] Cutting release TEST_TAG')
609
+ Git.should_receive(:git).with('push', 'origin', 'tag', 'TEST_TAG')
610
+ @release.tag_release 'TEST_TAG'
611
+ end
612
+
613
+ it 'should NOT push the tag if no remote is tracked' do
614
+ Git.stub!(:remote).and_return(nil)
615
+ Git.should_not_receive(:git).with('push', 'origin', 'tag', 'TEST_TAG')
616
+ @release.tag_release 'TEST_TAG'
617
+ end
618
+ end
619
+ end
620
+
621
+
622
+ describe SvnRelease do
623
+ it_should_behave_like 'a release process'
624
+
625
+ before do
626
+ @release = SvnRelease.new
627
+ Svn.stub!(:svn)
628
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
629
+ Svn.stub!(:tag)
630
+ end
631
+
632
+ describe '#applies_to?' do
633
+ it 'should reject a non-git repo' do
634
+ SvnRelease.applies_to?.should be_false
635
+ end
636
+
637
+ it 'should accept a git repo' do
638
+ FileUtils.touch '.svn'
639
+ SvnRelease.applies_to?.should be_true
640
+ end
641
+ end
642
+
643
+ describe '#check' do
644
+ before do
645
+ Svn.stub!(:uncommitted_files).and_return([])
646
+ @release = SvnRelease.new
647
+ end
648
+
649
+ it 'should accept to release from the trunk' do
650
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
651
+ lambda { @release.check }.should_not raise_error
652
+ end
653
+
654
+ it 'should accept to release from a branch' do
655
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/branches/1.0')
656
+ lambda { @release.check }.should_not raise_error
657
+ end
658
+
659
+ it 'should reject releasing from a tag' do
660
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/tags/1.0.0')
661
+ lambda { @release.check }.should raise_error(RuntimeError, "SVN URL must contain 'trunk' or 'branches/...'")
662
+ end
663
+
664
+ it 'should reject a non standard repository layout' do
665
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/bar')
666
+ lambda { @release.check }.should raise_error(RuntimeError, "SVN URL must contain 'trunk' or 'branches/...'")
667
+ end
668
+
669
+ it 'should reject an uncommitted file' do
670
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
671
+ Svn.stub!(:uncommitted_files).and_return(['foo.rb'])
672
+ lambda { @release.check }.should raise_error(RuntimeError,
673
+ "Uncommitted files violate the First Principle Of Release!\n" +
674
+ "foo.rb")
675
+ end
676
+ end
677
+ end