You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by as...@apache.org on 2008/04/08 05:07:22 UTC

svn commit: r645757 - in /incubator/buildr/trunk: Rakefile rakelib/apache.rake rakelib/doc.rake rakelib/package.rake rakelib/release.rake rakelib/release.rb rakelib/rspec.rake rakelib/setup.rake

Author: assaf
Date: Mon Apr  7 20:07:18 2008
New Revision: 645757

URL: http://svn.apache.org/viewvc?rev=645757&view=rev
Log:
Minor cleanup.
Please no moving of methods from Rakefile/rakelib into Buildr.


Added:
    incubator/buildr/trunk/rakelib/release.rake
    incubator/buildr/trunk/rakelib/setup.rake
Removed:
    incubator/buildr/trunk/rakelib/release.rb
Modified:
    incubator/buildr/trunk/Rakefile
    incubator/buildr/trunk/rakelib/apache.rake
    incubator/buildr/trunk/rakelib/doc.rake
    incubator/buildr/trunk/rakelib/package.rake
    incubator/buildr/trunk/rakelib/rspec.rake

Modified: incubator/buildr/trunk/Rakefile
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/Rakefile?rev=645757&r1=645756&r2=645757&view=diff
==============================================================================
--- incubator/buildr/trunk/Rakefile (original)
+++ incubator/buildr/trunk/Rakefile Mon Apr  7 20:07:18 2008
@@ -13,17 +13,10 @@
 # License for the specific language governing permissions and limitations under
 # the License.
 
-# Load file/system utilities used shared between Buildr's runtime and this Rakefile
-require File.expand_path('lib/buildr/core/util', File.dirname(__FILE__))
-extend Buildr::Util
-
-class << self
-  alias_method :say, :puts
-end unless respond_to?(:say)
-
-# We need two specifications, for Ruby and Java, and one for the platform we run on.
-$specs = ['ruby', 'java'].inject({}) { |hash, platform|
-  spec = Gem::Specification.new do |spec|
+
+def spec(platform = 'ruby')
+  @specs ||= {}
+  @specs[platform] ||= Gem::Specification.new do |spec|
     spec.name           = 'buildr'
     spec.version        = File.read(__FILE__.pathmap('%d/lib/buildr.rb')).scan(/VERSION\s*=\s*(['"])(.*)\1/)[0][1]
     spec.author         = 'Apache Buildr'
@@ -57,27 +50,12 @@
     spec.add_dependency 'xml-simple',           '~> 1.0'
     spec.add_dependency 'archive-tar-minitar',  '~> 0.5'
     spec.add_dependency 'rubyforge',            '~> 0.4'
-    spec.add_dependency 'rjb',                  '~> 1.1' if platform =~ /ruby/
+    spec.add_dependency 'rjb',                  '~> 1.1' unless platform =~ /java/
   end
-  hash.update(platform=>spec)
-}
-$spec = $specs[java_platform? ? 'java' : 'ruby']
-
-$license_excluded = ['lib/core/progressbar.rb', 'spec/spec.opts', 'doc/css/syntax.css', '.textile', '.haml']
-
-begin
-  require 'highline/import'
-rescue LoadError 
-  puts 'HighLine required, please run rake setup first'
 end
 
-# Setup environment for running this Rakefile (RSpec, Docter, etc).
-desc "If you're building from sources, run this task one to setup the necessary dependencies."
-task 'setup' do
-  dependencies = $spec.dependencies
-  dependencies << Gem::Dependency.new('win32console', '> 0') if win_os? # Colors for RSpec.
-  install_gems(*dependencies)
-end
+
+$license_excluded = ['lib/core/progressbar.rb', 'spec/spec.opts', 'doc/css/syntax.css', '.textile', '.haml']
 
 namespace 'release' do
 

Modified: incubator/buildr/trunk/rakelib/apache.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/apache.rake?rev=645757&r1=645756&r2=645757&view=diff
==============================================================================
--- incubator/buildr/trunk/rakelib/apache.rake (original)
+++ incubator/buildr/trunk/rakelib/apache.rake Mon Apr  7 20:07:18 2008
@@ -25,7 +25,7 @@
   task 'license' do
     say 'Checking that files contain the Apache license ... '
     excluded = ['.class', '.png', '.jar', '.tif', 'README', 'LICENSE', 'CHANGELOG', 'DISCLAIMER', 'NOTICE', 'KEYS']
-    required = FileList[$spec.files].exclude(*excluded).exclude(*Array($license_excluded)).select { |fn| File.file?(fn) }
+    required = FileList[spec.files].exclude(*excluded).exclude(*Array($license_excluded)).select { |fn| File.file?(fn) }
     missing = required.reject { |fn| 
       comments = File.read(fn).scan(/(\/\*(.*?)\*\/)|^#\s+(.*?)$|<!--(.*?)-->/m).
         map { |match| match.compact }.flatten.join("\n")

Modified: incubator/buildr/trunk/rakelib/doc.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/doc.rake?rev=645757&r1=645756&r2=645757&view=diff
==============================================================================
--- incubator/buildr/trunk/rakelib/doc.rake (original)
+++ incubator/buildr/trunk/rakelib/doc.rake Mon Apr  7 20:07:18 2008
@@ -19,10 +19,10 @@
 desc 'Generate RDoc documentation'
 rdoc = Rake::RDocTask.new('rdoc') do |rdoc|
   rdoc.rdoc_dir = 'rdoc'
-  rdoc.title    = $spec.name
-  rdoc.options  = $spec.rdoc_options + ['--promiscuous']
+  rdoc.title    = spec.name
+  rdoc.options  = spec.rdoc_options + ['--promiscuous']
   rdoc.rdoc_files.include('lib/**/*.rb')
-  rdoc.rdoc_files.include $spec.extra_rdoc_files
+  rdoc.rdoc_files.include spec.extra_rdoc_files
 end
 
 
@@ -32,7 +32,7 @@
 rescue LoadError
   puts 'Please run rake setup to install the Allison RDoc template'
   task 'setup' do
-    install_gems 'allison'
+    install_gem 'allison'
   end
   task 'release:check' do
     fail 'Please run rake setup to install the Allison RDoc template'
@@ -50,7 +50,7 @@
   #  html.gsub(/<p id="fn(\d+)">(.*?)<\/p>/, %{<p id="fn\\1" class="footnote">\\2</p>})
   #end
 
-  collection = Docter.collection($spec.name).using('doc/site.toc.yaml').include('doc/pages', 'LICENSE', 'CHANGELOG')
+  collection = Docter.collection(spec.name).using('doc/site.toc.yaml').include('doc/pages', 'LICENSE', 'CHANGELOG')
   template   = Docter.template('doc/site.haml').
     include('doc/css', 'doc/images', 'doc/scripts', 'reports/specs.html', 'reports/coverage', 'rdoc', 'print/buildr.pdf')
 
@@ -60,28 +60,12 @@
   desc 'Generate Web site in directory site'
   Docter::Rake.generate 'site', collection, template
 
-  task 'clobber' do
-    rm_rf 'site'
-  end
-
-rescue LoadError
-  puts 'Please run rake setup to install the Docter document generation library'
-  task 'setup' do
-    install_gems 'docter'
-  end
-  task 'release:check' do
-    fail 'Please run rake setup to install the Docter document generation library'
-  end
-end
-
-
-if Object.const_defined?(:Docter) && which('prince')
-
   Docter::Rake.generate 'print',
-    Docter.collection($spec.name).using('doc/print.toc.yaml').include('doc/pages', 'LICENSE'),
+    Docter.collection(spec.name).using('doc/print.toc.yaml').include('doc/pages', 'LICENSE'),
     Docter.template('doc/print.haml').include('doc/css', 'doc/images'), :one_page
 
-  file('print/buildr.pdf'=>'print') do |task|
+  file('site/buildr.pdf'=>'print') do |task|
+    mkpath 'site'
     sh 'prince', 'print/index.html', '-o', task.name, '--media=print' do |ok, res|
       fail 'Failed to create PDF, see errors above' unless ok
     end
@@ -94,21 +78,26 @@
 
   task 'clobber' do
     rm_rf 'print'
+    rm_rf 'site'
   end
 
-else
+rescue LoadError
+  puts 'Please run rake setup to install the Docter document generation library'
+  task 'setup' do
+    install_gem 'docter'
+  end
   task 'release:check' do
-    fail 'Release requires PrinceXML to generate PDF documentation!'
+    fail 'Please run rake setup to install the Docter document generation library'
   end
 end
 
 
 namespace 'release' do
   task 'prepare'=>'docs' do
-    puts 'Checking that we have site documentation, RDoc and PDF ... '
+    say 'Checking that we have site documentation, RDoc and PDF ... '
     fail 'No PDF generated, you need to install PrinceXML!' unless File.exist?('site/buildr.pdf')
     fail 'No RDocs in site directory' unless File.exist?('site/rdoc/files/lib/buildr_rb.html')
     fail 'No site documentation in site directory' unless File.exist?('site/index.html')
-    puts 'OK'
+    say 'OK'
   end
 end

Modified: incubator/buildr/trunk/rakelib/package.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/package.rake?rev=645757&r1=645756&r2=645757&view=diff
==============================================================================
--- incubator/buildr/trunk/rakelib/package.rake (original)
+++ incubator/buildr/trunk/rakelib/package.rake Mon Apr  7 20:07:18 2008
@@ -23,28 +23,30 @@
 desc 'Compile Java libraries used by Buildr'
 task 'compile' do
   say 'Compiling Java libraries ... '
-  ruby '-Ilib', '-Iaddon', 'bin/buildr', 'compile'
+  sh Config::CONFIG['ruby_install_name'], '-Ilib', '-Iaddon', 'bin/buildr', 'compile'
   say 'OK'
 end
 
-Rake::GemPackageTask.new($specs['ruby']) do |pkg|
+Rake::GemPackageTask.new(spec('ruby')) do |pkg|
   pkg.need_tar = pkg.need_zip = true
   file pkg.package_dir_path=>'compile'
   file pkg.package_dir=>'compile'
 end
-Rake::GemPackageTask.new($specs['java']) do |pkg|
+Rake::GemPackageTask.new(spec('java')) do |pkg|
   file pkg.package_dir_path=>'compile'
 end
 
-current = Rake::GemPackageTask.new($spec)
+current = Rake::GemPackageTask.new(spec)
 desc 'Install the package locally'
 task 'install'=>"#{current.package_dir}/#{current.gem_file}" do |task|
-  ruby 'install',  "#{current.package_dir}/#{current.gem_file}", :command=>'gem', :sudo=>true
+  install_gem "#{current.package_dir}/#{current.gem_file}"
 end
 
 desc 'Uninstall previously installed packaged'
 task 'uninstall' do |task|
   say "Uninstalling #{$spec.name} ... "
-  ruby 'install', $spec.name, :command=>'gem', :sudo=>true
+  args = [Config::CONFIG['ruby_install_name'], '-S', 'gem', 'uninstall', spec.name, '--version', spec.version]
+  args.unshift('sudo') unless windows?
+  sh *args
   say 'Done'
 end

Added: incubator/buildr/trunk/rakelib/release.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/release.rake?rev=645757&view=auto
==============================================================================
--- incubator/buildr/trunk/rakelib/release.rake (added)
+++ incubator/buildr/trunk/rakelib/release.rake Mon Apr  7 20:07:18 2008
@@ -0,0 +1,111 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with this
+# work for additional information regarding copyright ownership.  The ASF
+# licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+
+begin
+  require 'rubyforge'
+rescue LoadError
+  say 'Please run rake setup to install the RubyForge gem'
+  task 'setup' do
+    install_gem 'rubyforge'
+  end
+  task 'release:check' do
+    fail 'Please run rake setup to install the RubyForge gem'
+  end
+end
+
+
+namespace 'release' do
+ 
+  # This task does all prerequisites checks before starting the release, for example,
+  # that we have Groovy and Scala to run all the test cases, or that we have Allison
+  # and PrinceXML to generate the full documentation.
+  task 'check'=>'setup'
+  # This task does all the preparation work before making a release and also checks
+  # that we generate all the right material, for example, that we compiled Java sources,
+  # created the PDF, have coverage report.
+  task 'prepare'=>['clobber', 'check']
+
+  # Does CHANGELOG reflects current release?
+  task 'check' do
+    say 'Checking that CHANGELOG indicates most recent version and today\'s date ... '
+    expecting = "#{ruby_spec.version} (#{Time.now.strftime('%Y-%m-%d')})"
+    header = File.readlines('CHANGELOG').first
+    fail "Expecting CHANGELOG to start with #{expecting}, but found #{header} instead" unless expecting == header
+    say 'OK'
+  end
+
+  # No local changes.
+  task 'check' do
+    status = `svn status`
+    fail "Cannot release unless all local changes are in SVN:\n#{status}" unless status.empty?
+  end
+
+  desc 'Make a release'
+  task 'make'=>'prepare' do
+    enhance do
+      task('release:wrapup').invoke
+    end
+  end
+
+  task 'rubyforge'=>'pacakge' do
+    # Read the changes for this release.
+    say 'Looking for changes between this release and previous one ... '
+    pattern = /(^(\d+\.\d+(?:\.\d+)?)\s+\(\d{4}-\d{2}-\d{2}\)\s*((:?^[^\n]+\n)*))/
+    changelog = File.read(__FILE__.pathmap('%d/CHANGELOG'))
+    changes = changelog.scan(pattern).inject({}) { |hash, set| hash[set[1]] = set[2] ; hash }
+    current = changes[spec.version.to_s]
+    current = changes[spec.version.to_s.split('.')[0..-2].join('.')] if !current && spec.version.to_s =~ /\.0$/
+    fail "No changeset found for version #{spec.version}" unless current
+    say 'OK'
+
+    say "Uploading #{spec.version} to RubyForge ... "
+    files = Dir.glob('pkg/*.{gem,tgz,zip}')
+    rubyforge = RubyForge.new
+    rubyforge.login    
+    File.open('.changes', 'w'){|f| f.write(current)}
+    rubyforge.userconfig.merge!('release_changes' => '.changes',  'preformatted' => true)
+    rubyforge.add_release spec.rubyforge_project.downcase, spec.name.downcase, spec.version, *files
+    rm '.changes'
+    say 'Done'
+  end
+
+  # Tag this release in SVN.
+  task 'tag' do
+    say "Tagging release as tags/#{ruby_spec.version} ... "
+    cur_url = `svn info`.scan(/URL: (.*)/)[0][0]
+    new_url = cur_url.sub(/(trunk$)|(branches\/\w*)$/, "tags/#{ruby_spec.version.to_s}")
+    sh 'svn', 'copy', cur_url, new_url, '-m', "Release #{ruby_spec.version.to_s}", :verbose=>false
+    say "OK"
+  end
+
+  # Update lib/buildr.rb to next vesion number, add new entry in CHANGELOG.
+  task 'next_version'=>'tag' do
+    next_version = ruby_spec.version.to_ints.zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join('.')
+    say "Updating lib/buildr.rb to next version number (#{next_version}) ... "
+    buildr_rb = File.read(__FILE__.pathmap('%d/lib/buildr.rb')).
+      sub(/(VERSION\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" } 
+    File.open(__FILE__.pathmap('%d/lib/buildr.rb'), 'w') { |file| file.write buildr_rb }
+    say "OK"
+
+    say 'Adding new entry to CHANGELOG ... '
+    changelog = File.read(__FILE__.pathmap('%d/CHANGELOG'))
+    File.open(__FILE__.pathmap('%d/CHANGELOG'), 'w') { |file| file.write "#{next_version} (Pending)\n\n#{changelog}" }
+    say "OK"
+  end
+
+  task 'wrapup'=>['tag', 'next_version']
+
+end

Modified: incubator/buildr/trunk/rakelib/rspec.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/rspec.rake?rev=645757&r1=645756&r2=645757&view=diff
==============================================================================
--- incubator/buildr/trunk/rakelib/rspec.rake (original)
+++ incubator/buildr/trunk/rakelib/rspec.rake Mon Apr  7 20:07:18 2008
@@ -29,7 +29,6 @@
     task.spec_opts << '--options' << 'spec/spec.opts' << '--format' << 'failing_examples:failing' << '--example' << 'failing'
   end
 
-  directory 'reports'
   desc 'Run RSpec and generate Spec and coverage reports (slow)'
   Spec::Rake::SpecTask.new('reports') do |task|
     task.spec_files = FileList['spec/**/*_spec.rb']
@@ -38,6 +37,7 @@
     task.rcov_opts = ['--exclude', 'spec,bin']
   end
   task 'reports' do
+    mkpath 'reports'
     mv 'coverage', 'reports'
   end
 
@@ -46,11 +46,12 @@
     rm_rf 'reports'
   end
 
-rescue LoadError
-  say 'Please run rake setup to install RSpec'
   task 'setup' do
-    ruby 'install', 'rspec', :command=>'gem', :sudo=>true
+    install_gem 'win32console' if Gem.win_platform? # Colors for RSpec, only on Windows platform.
   end
+
+rescue LoadError
+  say 'Please run rake setup to install RSpec'
   task 'release:check' do
     fail 'Please run rake setup to install RSpec'
   end
@@ -62,13 +63,13 @@
   desc 'Run all specs specifically with Ruby'
   task 'ruby' do
     say 'Running test suite using Ruby ...'
-    system 'ruby -S rake spec'
+    sh 'ruby -S rake spec'
   end
 
   desc 'Run all specs specifically with JRuby'
   task 'jruby' do
     say 'Running test suite using JRuby ...'
-    system 'jruby -S rake spec'
+    sh 'jruby -S rake spec'
   end
 end
 

Added: incubator/buildr/trunk/rakelib/setup.rake
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/rakelib/setup.rake?rev=645757&view=auto
==============================================================================
--- incubator/buildr/trunk/rakelib/setup.rake (added)
+++ incubator/buildr/trunk/rakelib/setup.rake Mon Apr  7 20:07:18 2008
@@ -0,0 +1,39 @@
+# True if running on the Windows operating sytem.  Different from Gem.win_platform?
+# which returns true if running on the Windows platform of MRI, false when using JRuby.
+def windows?
+  Config::CONFIG['host_os'] =~ /windows|cygwin|bccwin|cygwin|djgpp|mingw|mswin|wince/i
+end
+
+
+# Finds and returns path to executable.  Consults PATH environment variable.
+# Returns nil if executable not found.
+def which(name)
+  if windows?
+    path = ENV['PATH'].split(File::PATH_SEPARATOR).map { |path| path.gsub('\\', '/') }.map { |path| "#{path}/#{name}.{exe,bat,com}" }
+  else
+    path = ENV['PATH'].split(File::PATH_SEPARATOR).map { |path| "#{path}/#{name}" }
+  end
+  FileList[path].existing.first
+end
+
+
+def install_gem(name, ver_requirement = nil)
+  dep = Gem::Dependency.new(name, ver_requirement)
+  if Gem::SourceIndex.from_installed_gems.search(dep).empty? 
+    puts "Installing #{name} #{ver_requirement} ..."
+    args = [Config::CONFIG['ruby_install_name'], '-S', 'gem', 'install', name]
+    args.unshift('sudo') unless windows?
+    args << '-v' << ver_requirement.to_s if ver_requirement
+    sh *args
+  end
+end
+
+# Setup environment for running this Rakefile (RSpec, Docter, etc).
+desc "If you're building from sources, run this task one to setup the necessary dependencies."
+missing = spec.dependencies.select { |dep| Gem::SourceIndex.from_installed_gems.search(dep).empty? }
+task 'setup' do
+  missing.each do |dep|
+    install_gem dep.name, dep.version_requirements
+  end
+end
+puts "Missing Gems #{missing.join(', ')}, please run rake setup first!" unless missing.empty?