# Rakefile for RubyGems -*- ruby -*-
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++
$:.unshift 'lib'
require 'rubygems'
require 'rake/clean'
require 'rake/testtask'
require 'rake/packagetask'
require 'rake/gempackagetask'
require 'rake/rdoctask'
def announce(msg='')
$stderr.puts msg
end
def generate_rubygems_version(path, version)
open path, 'w' do |f|
f.puts <<-EOF
# DO NOT EDIT
# This file is auto-generated by build scripts.
# See: rake update_version
module Gem
RubyGemsVersion = '#{version}'
end
EOF
end
end
if RUBY_PLATFORM.match('mswin')
ENV['CERT_DIR'] ||= (File.join(ENV['USERPROFILE'], '.gem'))
else
ENV['CERT_DIR'] ||= File.expand_path(File.join('~', '.gem'))
end
PKG_NAME = 'rubygems'
def package_version
`ruby -Ilib bin/gem environment packageversion`.chomp
end
if ENV['REL']
PKG_VERSION = ENV['REL']
CURRENT_VERSION = package_version
else
PKG_VERSION = package_version
CURRENT_VERSION = PKG_VERSION
end
CLEAN.include("COMMENTS")
CLOBBER.include(
'InstalledFiles',
"test/data/one/one-*0.0.1.gem",
"test/temp",
'test/mock/gem/doc',
'test/mock/gem/cache',
'test/data/gemhome',
'test/data/[a-z]*.gem',
'scripts/*.hieraki',
'data__',
'html',
'pkgs/sources/sources*.gem',
'.config',
'**/debug.log',
'logs',
'*.out'
)
CLOBBER.exclude('test/data/broken-1.0.0.gem')
desc "Run all tests"
task :default => [:test]
desc "Run unit tests (functionals fail on win32)"
task :test => [:test_units]
desc "Run just the unit tests"
Rake::TestTask.new(:test_units) do |t|
t.test_files = FileList['test/test*.rb']
t.warning = true
end
desc "Run just the functional tests"
Rake::TestTask.new(:test_functional) do |t|
t.test_files = FileList['test/functional*.rb']
t.warning = true
end
desc "Run the unit and functional tests"
Rake::TestTask.new(:test_all) do |t|
t.test_files = FileList['test/{test,functional}*.rb']
t.warning = true
end
desc "Run the tests for a build"
task :build_tests do
html_dir = ENV['TESTRESULTS'] || 'html/tests'
ruby %{-Ilib scripts/buildtests.rb #{html_dir}}
open("#{html_dir}/summary.html") do |inf|
open("#{html_dir}/summary.new", "w") do |outf|
inf.each do |line|
if line =~ /td align/
line = "
#{Time.now} | "
end
outf.puts line
end
end
end
mv "#{html_dir}/summary.html", "#{html_dir}/summary.old"
mv "#{html_dir}/summary.new", "#{html_dir}/summary.html"
end
# Shortcuts for test targets
task :tf => [:test_functional]
task :tu => [:test_units]
task :ta => [:test_all]
task :gemtest do
ruby %{-Ilib -rscripts/runtest -e 'run_tests("test/test_gempaths.rb", true)'}
end
# --------------------------------------------------------------------
# Creating a release
desc "Make a new release"
task :release => [
:prerelease,
:clobber,
:test_all,
:update_version,
:package,
:tag] do
announce
announce "**************************************************************"
announce "* Release #{PKG_VERSION} Complete."
announce "* Packages ready to upload."
announce "**************************************************************"
announce
end
desc "Validate that everything is ready to go for a release."
task :prerelease do
announce
announce "**************************************************************"
announce "* Making RubyGem Release #{PKG_VERSION}"
announce "* (current version #{CURRENT_VERSION})"
announce "**************************************************************"
announce
# Is a release number supplied?
raise "Usage: rake release REL=x.y.z [REUSE=tag_suffix]" unless ENV['REL']
# Is the release different than the current release.
# (or is REUSE set?)
if PKG_VERSION == CURRENT_VERSION && ! ENV['REUSE']
raise "Current version is #{PKG_VERSION}, must specify REUSE=tag_suffix to reuse version"
end
# Are all source files checked in?
if ENV['RELTEST']
announce "Release Task Testing, skipping checked-in file test"
else
announce "Checking for unchecked-in files..."
data = `svn st`
unless data =~ /^$/
abort "svn status is not clean ... do you have unchecked-in files?"
end
announce "No outstanding checkins found ... OK"
end
end
task :update_version => [:prerelease] do
if PKG_VERSION == CURRENT_VERSION
announce "No version change ... skipping version update"
else
announce "Updating RubyGem version to #{PKG_VERSION}"
generate_rubygems_version 'lib/rubygems/rubygems_version.rb', PKG_VERSION
if ENV['RELTEST']
announce "Release Task Testing, skipping commiting of new version"
else
sh %{svn commit -m "Updated to version #{PKG_VERSION}" lib/rubygems/rubygems_version.rb} # "
end
end
end
task :tag => [:prerelease] do
reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}"
reltag = "REL_#{ENV['REUSE'].gsub(/\./, '_')}" if ENV['REUSE']
announce "Tagging SVN with [#{reltag}]"
software_dir = File.basename(Dir.pwd)
if ENV['RELTEST']
announce "Release Task Testing, skipping SVN tagging (in dir #{software_dir})"
else
sh %{svn copy svn+ssh://rubyforge.org/var/svn/rubygems/trunk svn+ssh://rubyforge.org/var/svn/rubygems/tags/#{reltag}}
end
end
# --------------------------------------------------------------------
begin # rcov
require 'rcov/rcovtask'
Rcov::RcovTask.new do |t|
t.libs << "test"
t.rcov_opts = ['-xRakefile', '-xrakefile', '-xpublish.rf', '--text-report']
t.test_files = FileList[
'test/{functional,test}*.rb'
]
t.verbose = true
end
rescue LoadError
end
# --------------------------------------------------------------------
# Create a task to build the RDOC documentation tree.
desc "Create the RDOC html files"
Rake::RDocTask.new("rdoc") { |rdoc|
rdoc.rdoc_dir = 'html'
rdoc.title = "RubyGems"
rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
rdoc.rdoc_files.include('README', 'TODO', 'LICENSE.txt', 'GPL.txt')
rdoc.rdoc_files.include('lib/**/*.rb')
rdoc.rdoc_files.include('doc/**/*.rdoc')
}
desc "Publish the RDOCs on RubyForge"
task :publish_rdoc => ["html/index.html"] do
# NOTE: This task assumes that you have an SSH alias setup for rubyforge.
mkdir_p "emptydir"
sh "scp -rq emptydir rubyforge:/var/www/gforge-projects/rubygems/rdoc"
sh "scp -rq html/* rubyforge:/var/www/gforge-projects/rubygems/rdoc"
rm_r "emptydir"
end
# Wiki Doc Targets
desc "Upload the Hieraki Data"
task :upload => [:upload_gemdoc]
task :upload_gemdoc => ['scripts/gemdoc.hieraki'] do
ruby %{scripts/upload_gemdoc.rb}
end
desc "Build the Hieraki documentation"
task :hieraki => ['scripts/gemdoc.hieraki', 'scripts/specdoc.hieraki']
file 'scripts/gemdoc.hieraki' => ['scripts/gemdoc.rb', 'scripts/gemdoc.data'] do
chdir('scripts') do
ruby %{-I../lib gemdoc.rb gemdoc.hieraki}
end
end
file 'scripts/specdoc.hieraki' =>
['scripts/specdoc.rb', 'scripts/specdoc.data', 'scripts/specdoc.yaml'] do
chdir('scripts') do
ruby %{-I../lib specdoc.rb >specdoc.hieraki}
end
end
# Package tasks
PKG_FILES = FileList[
".document",
"ChangeLog",
"GPL.txt",
"LICENSE.txt",
"README",
"Rakefile",
"TODO",
"bin/*",
"doc/release_notes/*",
"lib/**/*.rb",
"pkgs/**/*",
"scripts/*.rb",
"setup.rb",
"test/**/*"
]
PKG_FILES.exclude %r(^test/temp(/|$))
PKG_FILES.exclude %r(\*\.rbc$)
task :package_files do
puts PKG_FILES.join("\n")
end
Rake::PackageTask.new("package") do |p|
p.name = PKG_NAME
p.version = PKG_VERSION
p.need_tar = true
p.need_zip = true
p.package_files = PKG_FILES
end
Spec = Gem::Specification.new do |s|
s.name = PKG_NAME + "-update"
s.version = PKG_VERSION
s.required_ruby_version = Gem::Requirement.new '> 1.8.3'
s.summary = "RubyGems Update GEM"
s.description = %{RubyGems is a package management framework for Ruby. This Gem
is a update for the base RubyGems software. You must have a base
installation of RubyGems before this update can be applied.
}
s.files = PKG_FILES.to_a
s.require_path = 'lib'
s.authors = ['Jim Weirich', 'Chad Fowler', 'Eric Hodel']
s.email = "rubygems-developers@rubyforge.org"
s.homepage = "http://rubygems.rubyforge.org"
s.rubyforge_project = "rubygems"
s.bindir = "bin" # Use these for applications.
s.executables = ["update_rubygems"]
certdir = ENV['CERT_DIR']
if certdir
s.signing_key = File.join(certdir, 'gem-private_key.pem')
s.cert_chain = [File.join(certdir, 'gem-public_cert.pem')]
end
end
# Add console output about signing the Gem
file "pkg/#{Spec.full_name}.gem" do
puts "Signed with certificates in '#{ENV['CERT_DIR']}'" if ENV['CERT_DIR']
end
Rake::GemPackageTask.new(Spec) do |p| end
desc "Build the Gem spec file for the rubygems-update package"
task :gemspec => "pkg/rubygems-update.gemspec"
file "pkg/rubygems-update.gemspec" => ["pkg", "Rakefile"] do |t|
open(t.name, "w") do |f| f.puts Spec.to_yaml end
end
desc "Install RubyGems"
task :install do
ruby 'setup.rb'
svnversion = `svnversion`.split(':').last.sub(/[^\d]/, '').strip
unless svnversion.empty? then
File.read('lib/rubygems/rubygems_version.rb') =~ /RubyGemsVersion = '(.*)'/
current_version = $1.split '.', 4
rubygems_version = (current_version[0, 3] << svnversion).join '.'
rubygems_version_file = File.join Gem::ConfigMap[:sitelibdir], 'rubygems',
'rubygems_version.rb'
generate_rubygems_version rubygems_version_file, rubygems_version
end
end
desc "Run local 'gem' e.g. rake rungem -- install -i ~/tmp/gems"
task :rungem do
ARGV.shift
exec(Gem.ruby, '-Ilib', 'bin/gem', *ARGV)
end
# Misc Tasks ---------------------------------------------------------
def egrep(pattern)
Dir['{bin,lib,test,util}/**/*.rb'].each do |fn|
count = 0
open(fn) do |f|
while line = f.gets
count += 1
if line =~ pattern
puts "#{fn}:#{count}:#{line}"
end
end
end
end
end
desc "Look for TODO and FIXME tags in the code"
task :todo do
egrep /#.*(FIXME|TODO|TBD)/
end
desc "Look for Debugging print lines"
task :dbg do
egrep /\bDBG|\bbreakpoint\b/
end
desc "List all ruby files"
task :rubyfiles do
puts Dir['**/*.rb'].reject { |fn| fn =~ /^pkg/ }
puts Dir['bin/*'].reject { |fn| fn =~ /CVS|(~$)|(\.rb$)/ }
end
task :rf => :rubyfiles
# These tasks expect to have the following directory structure:
#
# git/git.rubini.us/code # Rubinius git HEAD checkout
# svn/ruby/trunk # ruby subversion HEAD checkout
# svn/rubygems/trunk # RubyGems subversion HEAD checkout
#
# If you don't have this directory structure, set RUBY_PATH and/or
# RUBINIUS_PATH.
diff_options = "-urpN --exclude '*svn*' --exclude '*swp' --exclude '*rbc'"
rsync_options = "-avP --exclude '*svn*' --exclude '*swp' --exclude '*rbc' --exclude '*.rej' --exclude '*.orig' --exclude 'lib/rubygems/defaults/*'"
rubinius_dir = ENV['RUBINIUS_PATH'] || '../../../git/git.rubini.us/code'
ruby_dir = ENV['RUBY_PATH'] || '../../ruby/trunk'
desc "Updates Ruby HEAD with the currently checked-out copy of RubyGems."
task :update_ruby do
sh "rsync #{rsync_options} bin/gem #{ruby_dir}/bin/gem"
sh "rsync #{rsync_options} lib/ #{ruby_dir}/lib"
sh "rsync #{rsync_options} test/ #{ruby_dir}/test/rubygems"
sh "rsync #{rsync_options} util/gem_prelude.rb #{ruby_dir}/gem_prelude.rb"
end
desc "Diffs Ruby HEAD with the currently checked-out copy of RubyGems."
task :diff_ruby do
options = "-urpN --exclude '*svn*' --exclude '*swp' --exclude '*rbc'"
sh "diff #{diff_options} bin/gem #{ruby_dir}/bin/gem; true"
sh "diff #{diff_options} lib/ubygems.rb #{ruby_dir}/lib/ubygems.rb; true"
sh "diff #{diff_options} lib/rubygems.rb #{ruby_dir}/lib/rubygems.rb; true"
sh "diff #{diff_options} lib/rubygems #{ruby_dir}/lib/rubygems; true"
sh "diff #{diff_options} lib/rbconfig #{ruby_dir}/lib/rbconfig; true"
sh "diff #{diff_options} test #{ruby_dir}/test/rubygems; true"
sh "diff #{diff_options} util/gem_prelude.rb #{ruby_dir}/gem_prelude.rb; true"
end
desc "Updates Rubinius HEAD with the currently checked-out copy of RubyGems."
task :update_rubinius do
sh "rsync #{rsync_options} bin/gem #{rubinius_dir}/lib/bin/gem"
sh "rsync #{rsync_options} lib/ #{rubinius_dir}/lib"
sh "rsync #{rsync_options} test/ #{rubinius_dir}/test/rubygems"
sh "rsync #{rsync_options} util/gem_prelude.rb #{rubinius_dir}/kernel/core/gem_prelude.rb"
end
desc "Diffs Rubinius HEAD with the currently checked-out copy of RubyGems."
task :diff_rubinius do
sh "diff #{diff_options} bin/gem #{rubinius_dir}/lib/bin/gem; true"
sh "diff #{diff_options} lib/ubygems.rb #{rubinius_dir}/lib/ubygems.rb; true"
sh "diff #{diff_options} lib/rubygems.rb #{rubinius_dir}/lib/rubygems.rb; true"
sh "diff #{diff_options} lib/rubygems #{rubinius_dir}/lib/rubygems; true"
sh "diff #{diff_options} test #{rubinius_dir}/test/rubygems; true"
sh "diff #{diff_options} util/gem_prelude.rb #{rubinius_dir}/kernel/core/gem_prelude.rb; true"
end
|