require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'rake/gempackagetask' require 'rake/contrib/rubyforgepublisher' require 'date' require 'rbconfig' PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : '' PKG_NAME = 'rails' PKG_VERSION = '0.9.5' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" PKG_DESTINATION = ENV["RAILS_PKG_DESTINATION"] || "../#{PKG_NAME}" BASE_DIRS = %w( app config/environments db doc log lib public script test vendor ) APP_DIRS = %w( models controllers helpers views views/layouts ) PUBLIC_DIRS = %w( images javascripts stylesheets _doc ) TEST_DIRS = %w( fixtures unit functional mocks mocks/development mocks/testing ) LOG_FILES = %w( apache.log development.log test.log production.log ) HTML_FILES = %w( 404.html 500.html index.html ) BIN_FILES = %w( generate destroy breakpointer console server update ) VENDOR_LIBS = %w( actionpack activerecord actionmailer activesupport railties ) desc "Default Task" task :default => [ :fresh_rails ] desc "Generates a fresh Rails package with documentation" task :fresh_rails => [ :clean, :make_dir_structure, :initialize_file_stubs, :copy_vendor_libraries, :copy_ties_content, :generate_documentation ] desc "Generates a fresh Rails package using GEMs with documentation" task :fresh_gem_rails => [ :clean, :make_dir_structure, :initialize_file_stubs, :copy_ties_content, :copy_gem_environment ] desc "Generates a fresh Rails package without documentation (faster)" task :fresh_rails_without_docs => [ :clean, :make_dir_structure, :initialize_file_stubs, :copy_vendor_libraries, :copy_ties_content ] desc "Generates a fresh Rails package without documentation (faster)" task :fresh_rails_without_docs_using_links => [ :clean, :make_dir_structure, :initialize_file_stubs, :link_vendor_libraries, :copy_ties_content ] desc "Packages the fresh Rails package with documentation" task :package => [ :clean, :fresh_rails ] do system %{cd ..; tar -czvf #{PKG_NAME}-#{PKG_VERSION}.tgz #{PKG_NAME}} system %{cd ..; zip -r #{PKG_NAME}-#{PKG_VERSION}.zip #{PKG_NAME}} end task :clean do rm_rf PKG_DESTINATION end # Make directory structure ---------------------------------------------------------------- def make_dest_dirs(dirs, path = nil) mkdir_p dirs.map { |dir| File.join(PKG_DESTINATION, path, dir) } end desc "Make the directory structure for the new Rails application" task :make_dir_structure => [ :make_base_dirs, :make_app_dirs, :make_public_dirs, :make_test_dirs ] task(:make_base_dirs) { make_dest_dirs BASE_DIRS } task(:make_app_dirs) { make_dest_dirs APP_DIRS, 'app' } task(:make_public_dirs) { make_dest_dirs PUBLIC_DIRS, 'public' } task(:make_test_dirs) { make_dest_dirs TEST_DIRS, 'test' } # Initialize file stubs ------------------------------------------------------------------- desc "Initialize empty file stubs (such as for logging)" task :initialize_file_stubs => [ :initialize_log_files ] task :initialize_log_files do log_dir = File.join(PKG_DESTINATION, 'log') chmod 0777, log_dir LOG_FILES.each do |log_file| log_path = File.join(log_dir, log_file) touch log_path chmod 0666, log_path end end # Copy Vendors ---------------------------------------------------------------------------- desc "Copy in all the Rails packages to vendor" task :copy_vendor_libraries do cp_r VENDOR_LIBS.map { |dir| File.join('..', dir) }, File.join(PKG_DESTINATION, 'vendor') end desc "Link in all the Rails packages to vendor" task :link_vendor_libraries do return_dir = File.dirname(File.expand_path(__FILE__)) cd File.join(PKG_DESTINATION, 'vendor') VENDOR_LIBS.each { |dir| ln_s File.dirname(__FILE__) + "/../../#{dir}", "." } cd return_dir end # Copy Ties Content ----------------------------------------------------------------------- # :link_apache_config desc "Make copies of all the default content of ties" task :copy_ties_content => [ :copy_rootfiles, :copy_dispatches, :copy_html_files, :copy_application, :copy_configs, :copy_binfiles, :copy_test_helpers, :copy_docs_in_public, :copy_app_doc_readme ] task :copy_dispatches do copy_with_rewritten_ruby_path("dispatches/dispatch.rb", "#{PKG_DESTINATION}/public/dispatch.rb") chmod 0755, "#{PKG_DESTINATION}/public/dispatch.rb" copy_with_rewritten_ruby_path("dispatches/dispatch.rb", "#{PKG_DESTINATION}/public/dispatch.cgi") chmod 0755, "#{PKG_DESTINATION}/public/dispatch.cgi" copy_with_rewritten_ruby_path("dispatches/dispatch.fcgi", "#{PKG_DESTINATION}/public/dispatch.fcgi") chmod 0755, "#{PKG_DESTINATION}/public/dispatch.fcgi" end task :copy_html_files do cp HTML_FILES.map { |dir| File.join('html', dir) }, File.join(PKG_DESTINATION, 'public') end task :copy_application do cp "helpers/application.rb", "#{PKG_DESTINATION}/app/controllers/application.rb" cp "helpers/application_helper.rb", "#{PKG_DESTINATION}/app/helpers/application_helper.rb" end task :copy_configs do cp "configs/database.yml", "#{PKG_DESTINATION}/config/database.yml" cp "configs/routes.rb", "#{PKG_DESTINATION}/config/routes.rb" cp "configs/apache.conf", "#{PKG_DESTINATION}/public/.htaccess" cp "environments/shared.rb", "#{PKG_DESTINATION}/config/environment.rb" cp "environments/production.rb", "#{PKG_DESTINATION}/config/environments/production.rb" cp "environments/development.rb", "#{PKG_DESTINATION}/config/environments/development.rb" cp "environments/test.rb", "#{PKG_DESTINATION}/config/environments/test.rb" end task :copy_binfiles do BIN_FILES.each do |file| dest_file = File.join(PKG_DESTINATION, 'script', file) copy_with_rewritten_ruby_path(File.join('bin', file), dest_file) chmod 0755, dest_file end end task :copy_rootfiles do cp "fresh_rakefile", "#{PKG_DESTINATION}/Rakefile" cp "README", "#{PKG_DESTINATION}/README" cp "CHANGELOG", "#{PKG_DESTINATION}/CHANGELOG" end task :copy_test_helpers do cp "helpers/test_helper.rb", "#{PKG_DESTINATION}/test/test_helper.rb" end task :copy_docs_in_public do cp "doc/index.html", "#{PKG_DESTINATION}/public/_doc/index.html" end task :copy_app_doc_readme do cp "doc/README_FOR_APP", "#{PKG_DESTINATION}/doc/README_FOR_APP" end task :link_apache_config do chdir(File.join(PKG_DESTINATION, 'config')) { ln_s "../public/.htaccess", "apache.conf" } end def copy_with_rewritten_ruby_path(src_file, dest_file) ruby = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) File.open(dest_file, 'w') do |df| File.open(src_file) do |sf| line = sf.gets if (line =~ /#!.+ruby\s*/) != nil df.puts("#!#{ruby}") else df.puts(line) end df.write(sf.read) end end end # Generate documentation ------------------------------------------------------------------ desc "Generate documentation for the framework and for the empty application" task :generate_documentation => [ :generate_app_doc, :generate_rails_framework_doc ] task :generate_rails_framework_doc do system %{cd #{PKG_DESTINATION}; rake apidoc} end task :generate_app_doc do File.cp "doc/README_FOR_APP", "#{PKG_DESTINATION}/doc/README_FOR_APP" system %{cd #{PKG_DESTINATION}; rake appdoc} end # Generate GEM ---------------------------------------------------------------------------- task :copy_gem_environment do cp "environments/shared_for_gem.rb", "#{PKG_DESTINATION}/config/environment.rb" dest_file = File.join(PKG_DESTINATION, 'script', 'breakpointer') copy_with_rewritten_ruby_path(File.join('bin', 'breakpointer_for_gem'), dest_file) chmod 0755, dest_file end PKG_FILES = FileList[ '[a-zA-Z]*', 'bin/**/*', 'configs/**/*', 'doc/**/*', 'dispatches/**/*', 'environments/**/*', 'helpers/**/*', 'generators/**/*', 'html/**/*', 'lib/**/*' ] spec = Gem::Specification.new do |s| s.name = 'rails' s.version = PKG_VERSION s.summary = "Web-application framework with template engine, control-flow layer, and ORM." s.description = <<-EOF Rails is a framework for building web-application using CGI, FCGI, mod_ruby, or WEBrick on top of either MySQL, PostgreSQL, or SQLite with eRuby-based templates. EOF s.add_dependency('rake', '>= 0.4.15') s.add_dependency('activerecord', '>= 1.6.0') s.add_dependency('actionpack', '>= 1.4.0') s.add_dependency('actionmailer', '>= 0.6.1') s.has_rdoc = false s.files = PKG_FILES.to_a.delete_if {|f| f.include?('.svn')} s.require_path = 'lib' s.bindir = "bin" # Use these for applications. s.executables = ["rails"] s.default_executable = "rails" s.author = "David Heinemeier Hansson" s.email = "david@loudthinking.com" s.homepage = "http://www.rubyonrails.org" s.rubyforge_project = "rails" end Rake::GemPackageTask.new(spec) do |pkg| end # Publish beta gem desc "Publish the API documentation" task :pgem => [:gem] do Rake::SshFilePublisher.new("davidhh@comox.textdrive.com", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload `ssh davidhh@comox.textdrive.com './gemupdate.sh'` end