You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by la...@apache.org on 2008/08/31 18:52:13 UTC
svn commit: r690727 - in /incubator/buildr/trunk: CHANGELOG
lib/buildr/core/build.rb spec/build_spec.rb
Author: lacton
Date: Sun Aug 31 09:52:13 2008
New Revision: 690727
URL: http://svn.apache.org/viewvc?rev=690727&view=rev
Log:
BUILDR-141 "Release task is confusing". Removed NEXT_VERSION.
Added tests on Release#make (the most important method!).
Extracted a buildr method to make testing easier. Otherwise, the make method would fail when trying to spawn a new buildr instance.
Removed some parameters from some methods' signatures when the values could be deduced from the context.
Reduced duplication by reusing Release#change_version.
Modified:
incubator/buildr/trunk/CHANGELOG
incubator/buildr/trunk/lib/buildr/core/build.rb
incubator/buildr/trunk/spec/build_spec.rb
Modified: incubator/buildr/trunk/CHANGELOG
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/CHANGELOG?rev=690727&r1=690726&r2=690727&view=diff
==============================================================================
--- incubator/buildr/trunk/CHANGELOG (original)
+++ incubator/buildr/trunk/CHANGELOG Sun Aug 31 09:52:13 2008
@@ -13,6 +13,7 @@
(http://www.scala-lang.org/node/94)
* Change: Buildr.application.buildfile returns a task instead of a String.
* Change: BUILDR-139 Incremental test run.
+* Change: BUILDR-141 Removed NEXT_VERSION from release task.
* Fixed: BUILDR-106 download(artifact(...)=>url) broken in certain cases
(Lacton).
* Fixed: BUILDR-108 Trace to explain why a compile is done (Lacton).
Modified: incubator/buildr/trunk/lib/buildr/core/build.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/buildr/core/build.rb?rev=690727&r1=690726&r2=690727&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/buildr/core/build.rb (original)
+++ incubator/buildr/trunk/lib/buildr/core/build.rb Sun Aug 31 09:52:13 2008
@@ -150,7 +150,6 @@
class Release
THIS_VERSION_PATTERN = /(THIS_VERSION|VERSION_NUMBER)\s*=\s*(["'])(.*)\2/
- NEXT_VERSION_PATTERN = /NEXT_VERSION\s*=\s*(["'])(.*)\1/
class << self
@@ -160,32 +159,25 @@
# Make a release.
def make()
check
- version = with_next_version do |filename|
- options = ['--buildfile', filename, 'DEBUG=no']
+ with_release_candidate_version do |release_candidate_buildfile|
+ options = ['--buildfile', release_candidate_buildfile, 'DEBUG=no']
options << '--environment' << Buildr.environment unless Buildr.environment.to_s.empty?
- sh "#{command} _#{Buildr::VERSION}_ clean upload #{options.join(' ')}"
+ buildr %w{clean upload}, options
end
- tag version
- commit version + '-SNAPSHOT'
+ tag_release
+ commit_new_snapshot
end
# :call-seq:
- # extract_versions(buildfile) => this_version, next_version
+ # extract_version() => this_version
#
- # Extract the current and next version numbers from a buildfile.
+ # Extract the current version number from the buildfile.
# Raise an error if not found.
- def extract_versions buildfile
- begin
- this_version = buildfile.scan(THIS_VERSION_PATTERN)[0][2]
- rescue
- fail 'Looking for THIS_VERSION = "..." in your Buildfile, none found'
- end
- begin
- next_version = buildfile.scan(NEXT_VERSION_PATTERN)[0][1]
- rescue
- fail 'Looking for NEXT_VERSION = "..." in your Buildfile, none found'
- end
- [this_version, next_version]
+ def extract_version
+ buildfile = File.read(Buildr.application.buildfile.to_s)
+ buildfile.scan(THIS_VERSION_PATTERN)[0][2]
+ rescue
+ fail 'Looking for THIS_VERSION = "..." in your Buildfile, none found'
end
# :call-seq:
@@ -216,86 +208,92 @@
protected
+ # :call-seq:
+ # buildr(tasks, options)
+ #
+ # Calls another instance of buildr.
+ def buildr tasks, options
+ sh "#{command} _#{Buildr::VERSION}_ #{tasks.join(' ')} #{options.join(' ')}"
+ end
+
def command() #:nodoc:
Config::CONFIG['arch'] =~ /dos|win32/i ? $PROGRAM_NAME.ext('cmd') : $PROGRAM_NAME
end
# :call-seq:
- # with_next_version() { |filename| ... } => version
+ # with_release_candidate_version() { |filename| ... }
#
- # Yields to block with upgraded version number, before committing to use it. Returns the *new*
- # current version number.
+ # Yields to block with release candidate buildfile, before committing to use it.
#
# We need a Buildfile with upgraded version numbers to run the build, but we don't want the
- # Buildfile modified unless the build succeeds. So this method updates the version numbers in
+ # Buildfile modified unless the build succeeds. So this method updates the version number in
# a separate (Buildfile.next) file, yields to the block with that filename, and if successful
# copies the new file over the existing one.
#
- # Version numbers are updated as follows. The next release version becomes the current one,
- # and the next version is upgraded by one to become the new next version. So:
- # THIS_VERSION = 1.1.0
- # NEXT_VERSION = 1.2.0
+ # The release version is the current version without '-SNAPSHOT'. So:
+ # THIS_VERSION = 1.1.0-SNAPSHOT
# becomes:
- # THIS_VERSION = 1.2.0
- # NEXT_VERSION = 1.2.1
- # and the method will return 1.2.0.
- def with_next_version()
- new_filename = Buildr.application.buildfile.to_s + '.next'
- modified = change_version do |this_version, next_version|
- one_after = next_version.split('.')
- one_after[-1] = one_after[-1].to_i + 1
- [ next_version, one_after.join('.') ]
+ # THIS_VERSION = 1.1.0
+ # for the release buildfile.
+ def with_release_candidate_version
+ release_candidate_buildfile = Buildr.application.buildfile.to_s + '.next'
+ release_candidate_buildfile_contents = change_version do |version|
+ release_candidate_version = version.split('.')
+ release_candidate_version[-1] = release_candidate_version[-1].to_i
+ release_candidate_version.join('.')
end
- File.open(new_filename, 'w') { |file| file.write modified }
+ File.open(release_candidate_buildfile, 'w') { |file| file.write release_candidate_buildfile_contents }
begin
- yield new_filename
- mv new_filename, Buildr.application.buildfile.to_s
+ yield release_candidate_buildfile
+ mv release_candidate_buildfile, Buildr.application.buildfile.to_s
ensure
- rm new_filename rescue nil
+ rm release_candidate_buildfile rescue nil
end
- extract_versions(File.read(Buildr.application.buildfile.to_s))[0]
end
# :call-seq:
- # change_version() { |this, next| ... } => buildfile
+ # change_version() { |this_version| ... } => buildfile
#
- # Change version numbers in the current Buildfile, but without writing a new file (yet).
- # Returns the contents of the Buildfile with the modified version numbers.
+ # Change version number in the current Buildfile, but without writing a new file (yet).
+ # Returns the contents of the Buildfile with the modified version number.
#
- # This method yields to the block with the current (this) and next version numbers and expects
- # an array with the new this and next version numbers.
+ # This method yields to the block with the current (this) version number and expects
+ # a new version number.
def change_version()
- buildfile = File.read(Buildr.application.buildfile.to_s)
- this_version, next_version = extract_versions buildfile
- this_version, next_version = yield(this_version, next_version)
+ this_version = extract_version
+ new_version = yield(this_version)
if verbose
- puts 'Upgrading version numbers:'
+ puts 'Upgrading version numbers:' # TODO Add tests on this
puts " This: #{this_version}"
- puts " Next: #{next_version}"
+ puts " Next: #{new_version}"
end
- buildfile.gsub(THIS_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{this_version}"}) }.
- gsub(NEXT_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{next_version}"}) }
+ buildfile = File.read(Buildr.application.buildfile.to_s)
+ buildfile.gsub(THIS_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{new_version}"}) }
end
# :call-seq:
- # tag(version)
+ # tag_release()
#
# Tags the current working copy with the release version number.
- def tag(version)
+ def tag_release
+ version = extract_version
url = tag_url Svn.repo_url, version
Svn.remove url, 'Removing old copy' rescue nil
Svn.copy Dir.pwd, url, "Release #{version}"
end
# :call-seq:
- # commit(version)
+ # commit_new_snapshot()
#
- # Last, we commit what we currently have in the working copy.
- def commit(version)
- buildfile = File.read(Buildr.application.buildfile.to_s).
- gsub(THIS_VERSION_PATTERN) { |ver| ver.sub(/(["']).*\1/, %Q{"#{version}"}) }
+ # Last, we commit what we currently have in the working copy with an upgraded version number.
+ def commit_new_snapshot
+ buildfile = change_version do |version|
+ version = version.split('.')
+ version[-1] = version[-1].to_i + 1
+ version.join('.') + '-SNAPSHOT'
+ end
File.open(Buildr.application.buildfile.to_s, 'w') { |file| file.write buildfile }
- Svn.commit Buildr.application.buildfile.to_s, "Changed version number to #{version}"
+ Svn.commit Buildr.application.buildfile.to_s, "Changed version number to #{extract_version}"
end
end
end
Modified: incubator/buildr/trunk/spec/build_spec.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/build_spec.rb?rev=690727&r1=690726&r2=690727&view=diff
==============================================================================
--- incubator/buildr/trunk/spec/build_spec.rb (original)
+++ incubator/buildr/trunk/spec/build_spec.rb Sun Aug 31 09:52:13 2008
@@ -193,6 +193,39 @@
end
+describe Buildr::Release, '#make' do
+ before do
+ write 'buildfile', "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
+ # Prevent a real call to a spawned buildr process.
+ Release.stub!(:buildr)
+ Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
+ Svn.stub!(:uncommitted_files).and_return('')
+ Svn.stub!(:remove)
+ Svn.stub!(:copy)
+ Svn.stub!(:commit)
+ end
+
+ it 'should tag a release with the release version' do
+ Svn.should_receive(:copy).with(Dir.pwd, 'http://my.repo.org/foo/tags/1.0.0', 'Release 1.0.0').and_return {
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.0"')
+ }
+ Release.make
+ end
+
+ it 'should update the buildfile with the next version number' do
+ Release.make
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.1-SNAPSHOT"')
+ end
+
+ it 'should commit the updated buildfile' do
+ Svn.should_receive(:commit).with(File.expand_path('buildfile'), 'Changed version number to 1.0.1-SNAPSHOT').and_return {
+ file('buildfile').should contain('VERSION_NUMBER = "1.0.1-SNAPSHOT"')
+ }
+ Release.make
+ end
+end
+
+
describe Buildr::Release, '#check' do
before do
Buildr::Svn.stub!(:uncommitted_files).and_return('')
@@ -208,7 +241,7 @@
lambda { Release.check }.should_not raise_error
end
- it 'should reject to release from a tag' do
+ it 'should reject releasing from a tag' do
Buildr::Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/tags/1.0.0')
lambda { Release.check }.should raise_error(RuntimeError, "SVN URL must contain 'trunk' or 'branches/...'")
end
@@ -228,36 +261,31 @@
end
-describe Buildr::Release, '#extract_versions' do
+describe Buildr::Release, '#extract_version' do
- it 'should extract VERSION_NUMBER and NEXT_VERSION with single quotes' do
- buildfile = ["VERSION_NUMBER = '1.0.0-SNAPSHOT'", "NEXT_VERSION = '1.0.1'"].join("\n")
- Release.extract_versions(buildfile).should == ['1.0.0-SNAPSHOT', '1.0.1']
+ it 'should extract VERSION_NUMBER with single quotes' do
+ write 'buildfile', "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
+ Release.extract_version.should == '1.0.0-SNAPSHOT'
end
- it 'should extract VERSION_NUMBER and NEXT_VERSION with double quotes' do
- buildfile = [%{VERSION_NUMBER = "1.0.1-SNAPSHOT"}, %{NEXT_VERSION = "1.0.2"}].join("\n")
- Release.extract_versions(buildfile).should == ['1.0.1-SNAPSHOT', '1.0.2']
+ it 'should extract VERSION_NUMBER with double quotes' do
+ write 'buildfile', %{VERSION_NUMBER = "1.0.1-SNAPSHOT"}
+ Release.extract_version.should == '1.0.1-SNAPSHOT'
end
- it 'should extract VERSION_NUMBER and NEXT_VERSION without any spaces' do
- buildfile = ["VERSION_NUMBER='1.0.2-SNAPSHOT'", "NEXT_VERSION='1.0.3'"].join("\n")
- Release.extract_versions(buildfile).should == ['1.0.2-SNAPSHOT', '1.0.3']
+ it 'should extract VERSION_NUMBER without any spaces' do
+ write 'buildfile', "VERSION_NUMBER='1.0.2-SNAPSHOT'"
+ Release.extract_version.should == '1.0.2-SNAPSHOT'
end
it 'should extract THIS_VERSION as an alternative to VERSION_NUMBER' do
- buildfile = ["THIS_VERSION = '1.0.3-SNAPSHOT'", "NEXT_VERSION = '1.0.4'"].join("\n")
- Release.extract_versions(buildfile).should == ['1.0.3-SNAPSHOT', '1.0.4']
+ write 'buildfile', "THIS_VERSION = '1.0.3-SNAPSHOT'"
+ Release.extract_version.should == '1.0.3-SNAPSHOT'
end
it 'should complain if no current version number' do
- buildfile = "NEXT_VERSION = '1.0.1'"
- lambda { Release.extract_versions(buildfile) }.should raise_error('Looking for THIS_VERSION = "..." in your Buildfile, none found')
- end
-
- it 'should complain if no next version number' do
- buildfile = "VERSION_NUMBER = '1.0.0-SNAPSHOT'"
- lambda { Release.extract_versions(buildfile) }.should raise_error('Looking for NEXT_VERSION = "..." in your Buildfile, none found')
+ write 'buildfile', 'define foo'
+ lambda { Release.extract_version }.should raise_error('Looking for THIS_VERSION = "..." in your Buildfile, none found')
end
end
@@ -301,39 +329,29 @@
end
-describe Buildr::Release, '#with_next_version' do
+describe Buildr::Release, '#with_release_candidate_version' do
before do
Buildr.application.stub!(:buildfile).and_return(file('buildfile'))
- write 'buildfile', <<-EOF
- THIS_VERSION = '1.1.0'
- NEXT_VERSION = '1.2.0'
- EOF
+ write 'buildfile', "THIS_VERSION = '1.1.0-SNAPSHOT'"
end
- it 'should yield the name of an updated buildfile' do
- Release.send :with_next_version do |new_filename|
- File.read(new_filename).should == <<-EOF
- THIS_VERSION = "1.2.0"
- NEXT_VERSION = "1.2.1"
- EOF
+ it 'should yield the name of the release candidate buildfile' do
+ Release.send :with_release_candidate_version do |new_filename|
+ File.read(new_filename).should == %{THIS_VERSION = "1.1.0"}
end
end
it 'should yield a name different from the original buildfile' do
- Release.send :with_next_version do |new_filename|
+ Release.send :with_release_candidate_version do |new_filename|
new_filename.should_not point_to_path('buildfile')
end
end
-
- it 'should return the new version number' do
- new_version = Release.send(:with_next_version) {}
- new_version.should == '1.2.0'
- end
end
-describe Buildr::Release, '#tag' do
+describe Buildr::Release, '#tag_release' do
before do
+ write 'buildfile', "THIS_VERSION = '1.0.1'"
Svn.stub!(:repo_url).and_return('http://my.repo.org/foo/trunk')
Svn.stub!(:copy)
end
@@ -341,34 +359,34 @@
it 'should tag the working copy' do
Svn.stub!(:remove)
Svn.should_receive(:copy).with(Dir.pwd, 'http://my.repo.org/foo/tags/1.0.1', 'Release 1.0.1')
- Release.send :tag, '1.0.1'
+ Release.send :tag_release
end
it 'should remove the tag if it already exists' do
Svn.should_receive(:remove).with('http://my.repo.org/foo/tags/1.0.1', 'Removing old copy')
- Release.send :tag, '1.0.1'
+ Release.send :tag_release
end
it 'should accept that the tag does not exist' do
Svn.stub!(:remove).and_raise(RuntimeError)
- Release.send :tag, '1.0.1'
+ Release.send :tag_release
end
end
-describe Buildr::Release, '#commit' do
+describe Buildr::Release, '#commit_new_snapshot' do
before do
write 'buildfile', 'THIS_VERSION = "1.0.0"'
end
- it 'should update the buildfile with the given version number' do
+ it 'should update the buildfile with a new version number' do
Svn.stub!(:commit)
- Release.send :commit, '1.0.1-SNAPSHOT'
+ Release.send :commit_new_snapshot
file('buildfile').should contain('THIS_VERSION = "1.0.1-SNAPSHOT"')
end
it 'should commit the new buildfile on the trunk' do
Svn.should_receive(:commit).with(File.expand_path('buildfile'), 'Changed version number to 1.0.1-SNAPSHOT')
- Release.send :commit, '1.0.1-SNAPSHOT'
+ Release.send :commit_new_snapshot
end
end
\ No newline at end of file