From 065cb2a08d6b0fe7683f98b69af1cee2ce3e69cd Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 27 Mar 2005 13:33:54 +0000 Subject: [PATCH] Made ready for better release automation git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1021 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionmailer/Rakefile | 141 ++++++++++++++++++++++++++------- actionpack/Rakefile | 138 ++++++++++++++++++++++++++++----- actionwebservice/Rakefile | 120 ++++++++++++++++++++++++++++ activerecord/Rakefile | 159 +++++++++++++++++++++++++++++++------- activesupport/Rakefile | 122 ++++++++++++++++++++++++++++- railties/README | 49 ++++++------ railties/Rakefile | 125 +++++++++++++++++++++++++++++- railties/fresh_rakefile | 4 +- 8 files changed, 754 insertions(+), 104 deletions(-) diff --git a/actionmailer/Rakefile b/actionmailer/Rakefile index c5e79c2de3c..ee04062f3c9 100755 --- a/actionmailer/Rakefile +++ b/actionmailer/Rakefile @@ -11,11 +11,15 @@ PKG_NAME = 'actionmailer' PKG_VERSION = '0.8.0' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "actionmailer" +RUBY_FORGE_USER = "webster132" + desc "Default Task" task :default => [ :test ] # Run the unit tests - Rake::TestTask.new { |t| t.libs << "test" t.pattern = 'test/*_test.rb' @@ -24,7 +28,6 @@ Rake::TestTask.new { |t| # Genereate the RDoc documentation - Rake::RDocTask.new { |rdoc| rdoc.rdoc_dir = 'doc' rdoc.title = "Action Mailer -- Easy email delivery and testing" @@ -36,8 +39,6 @@ Rake::RDocTask.new { |rdoc| # Create compressed packages - - spec = Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = PKG_NAME @@ -69,39 +70,127 @@ Rake::GemPackageTask.new(spec) do |p| end -# Publish beta gem desc "Publish the API documentation" task :pgem => [:package] do Rake::SshFilePublisher.new("davidhh@comox.textdrive.com", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload end -# Publish documentation desc "Publish the API documentation" task :pdoc => [:rdoc] do Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "public_html/am", "doc").upload end -desc "Publish to RubyForge" -task :rubyforge do - Rake::RubyForgePublisher.new('actionmailer', 'webster132').upload -end +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' -desc "Count lines in the main rake file" -task :lines do - lines = 0 - codelines = 0 - Dir.foreach("lib/action_mailer") { |file_name| - next unless file_name =~ /.*rb/ - - f = File.open("lib/action_mailer/" + file_name) + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id - while line = f.gets - lines += 1 - next if line =~ /^\s*$/ - next if line =~ /^\s*#/ - codelines += 1 + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp end - } - puts "Lines #{lines}, LOC #{codelines}" -end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end +end \ No newline at end of file diff --git a/actionpack/Rakefile b/actionpack/Rakefile index e5de66a0b7c..f8fc1d5681a 100755 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -11,6 +11,11 @@ PKG_NAME = 'actionpack' PKG_VERSION = '1.6.0' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "actionpack" +RUBY_FORGE_USER = "webster132" + desc "Default Task" task :default => [ :test ] @@ -38,8 +43,6 @@ Rake::RDocTask.new { |rdoc| # Create compressed packages - - dist_dirs = [ "lib", "test", "examples" ] spec = Gem::Specification.new do |s| @@ -77,35 +80,130 @@ Rake::GemPackageTask.new(spec) do |p| end -# Publish beta gem +# Publishing ------------------------------------------------------ + desc "Publish the API documentation" task :pgem => [:package] 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 -# Publish documentation desc "Publish the API documentation" task :pdoc => [:rdoc] do Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "public_html/ap", "doc").upload end +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } -desc "Count lines in the main rake file" -task :lines do - lines = 0 - codelines = 0 - Dir.foreach("lib/action_controller") { |file_name| - next unless file_name =~ /.*rb/ - - f = File.open("lib/action_controller/" + file_name) + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' - while line = f.gets - lines += 1 - next if line =~ /^\s*$/ - next if line =~ /^\s*#/ - codelines += 1 + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id + + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp end - } - puts "Lines #{lines}, LOC #{codelines}" -end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end +end \ No newline at end of file diff --git a/actionwebservice/Rakefile b/actionwebservice/Rakefile index a3e45490d9b..d676d2e81f9 100644 --- a/actionwebservice/Rakefile +++ b/actionwebservice/Rakefile @@ -13,6 +13,11 @@ PKG_VERSION = '0.6.1' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" PKG_DESTINATION = ENV["RAILS_PKG_DESTINATION"] || "../#{PKG_NAME}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "aws" +RUBY_FORGE_USER = "webster132" + desc "Default Task" task :default => [ :test ] @@ -144,3 +149,118 @@ task :lines do puts "Total:" puts " Lines #{total_lines}, LOC #{total_loc}" end + +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } + + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' + + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id + + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp + end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end +end \ No newline at end of file diff --git a/activerecord/Rakefile b/activerecord/Rakefile index d2dc65c7a56..dd91c58730b 100755 --- a/activerecord/Rakefile +++ b/activerecord/Rakefile @@ -11,6 +11,11 @@ PKG_NAME = 'activerecord' PKG_VERSION = '1.9.0' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "activerecord" +RUBY_FORGE_USER = "webster132" + PKG_FILES = FileList[ "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "[A-Z]*", "install.rb", "rakefile" ].exclude(/\bCVS\b|~$/) @@ -88,20 +93,6 @@ Rake::RDocTask.new { |rdoc| } -# Publish beta gem -desc "Publish the beta gem" -task :pgem => [:package] 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 - -# Publish documentation -desc "Publish the API documentation" -task :pdoc => [:rdoc] do - Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "public_html/ar", "doc").upload -end - - # Create compressed packages dist_dirs = [ "lib", "test", "examples", "dev-utils" ] @@ -143,20 +134,130 @@ Rake::GemPackageTask.new(spec) do |p| end -task :lines do - lines = 0 - codelines = 0 - Dir.foreach("lib/active_record") { |file_name| - next unless file_name =~ /.*rb/ - - f = File.open("lib/active_record/" + file_name) +# Publishing ------------------------------------------------------ - while line = f.gets - lines += 1 - next if line =~ /^\s*$/ - next if line =~ /^\s*#/ - codelines += 1 - end - } - puts "Lines #{lines}, LOC #{codelines}" +desc "Publish the beta gem" +task :pgem => [:package] 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 + +desc "Publish the API documentation" +task :pdoc => [:rdoc] do + Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "public_html/ar", "doc").upload +end + +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } + + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' + + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id + + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp + end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end +end \ No newline at end of file diff --git a/activesupport/Rakefile b/activesupport/Rakefile index 617a4dbcb7b..86137a2074b 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -8,6 +8,11 @@ PKG_NAME = 'activesupport' PKG_VERSION = '1.0.2' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "activesupport" +RUBY_FORGE_USER = "webster132" + task :default => :test Rake::TestTask.new { |t| t.pattern = 'test/**/*_test.rb' @@ -50,15 +55,128 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end -# Publish beta gem desc "Publish the beta gem" task :pgem => [:package] 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 -# Publish documentation desc "Publish the API documentation" task :pdoc => [:rdoc] do Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "public_html/as", "doc").upload end + +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } + + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' + + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id + + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp + end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end +end \ No newline at end of file diff --git a/railties/README b/railties/README index ca5f3737fd9..4f8bee3c0eb 100644 --- a/railties/README +++ b/railties/README @@ -67,30 +67,30 @@ goes through FCGI (or mod_ruby) that requires restart to show changes. == Example for lighttpd conf (with FastCGI) -server.port = 8080 -server.bind = "127.0.0.1" -# server.event-handler = "freebsd-kqueue" # needed on OS X - -server.modules = ( "mod_rewrite", "mod_fastcgi" ) - -url.rewrite = ( "^/$" => "index.html", "^([^.]+)$" => "$1.html" ) -server.error-handler-404 = "/dispatch.fcgi" - -server.document-root = "/path/application/public" -server.errorlog = "/path/application/log/server.log" - -fastcgi.server = ( ".fcgi" => - ( "localhost" => - ( - "min-procs" => 1, - "max-procs" => 5, - "socket" => "/tmp/application.fcgi.socket", - "bin-path" => "/path/application/public/dispatch.fcgi", - "bin-environment" => ( "RAILS_ENV" => "development" ) - ) + server.port = 8080 + server.bind = "127.0.0.1" + # server.event-handler = "freebsd-kqueue" # needed on OS X + + server.modules = ( "mod_rewrite", "mod_fastcgi" ) + + url.rewrite = ( "^/$" => "index.html", "^([^.]+)$" => "$1.html" ) + server.error-handler-404 = "/dispatch.fcgi" + + server.document-root = "/path/application/public" + server.errorlog = "/path/application/log/server.log" + + fastcgi.server = ( ".fcgi" => + ( "localhost" => + ( + "min-procs" => 1, + "max-procs" => 5, + "socket" => "/tmp/application.fcgi.socket", + "bin-path" => "/path/application/public/dispatch.fcgi", + "bin-environment" => ( "RAILS_ENV" => "development" ) + ) + ) ) -) - + == Debugging Rails @@ -139,7 +139,8 @@ Finally, when you're ready to resume execution, you press CTRL-D You can interact with the domain model by starting the console through script/console. Here you'll have all parts of the application configured, just like it is when the application is running. You can inspect domain models, change values, and save to the -database. Start the script without arguments to see the options. +database. Start the script without arguments will launch it in the development environment. +Passing an argument will specify a different environment, like console production. == Description of contents diff --git a/railties/Rakefile b/railties/Rakefile index 5e7c94f1a06..c9d435d5c46 100644 --- a/railties/Rakefile +++ b/railties/Rakefile @@ -13,6 +13,11 @@ PKG_VERSION = '0.11.0' + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" PKG_DESTINATION = ENV["RAILS_PKG_DESTINATION"] || "../#{PKG_NAME}" +RELEASE_NAME = "REL #{PKG_VERSION}" + +RUBY_FORGE_PROJECT = "rails" +RUBY_FORGE_USER = "webster132" + BASE_DIRS = %w( app config/environments components db doc log lib public script test vendor ) APP_DIRS = %w( apis models controllers helpers views views/layouts ) @@ -233,7 +238,7 @@ spec = Gem::Specification.new do |s| on top of either MySQL, PostgreSQL, or SQLite with eRuby-based templates. EOF - s.add_dependency('rake', '>= 0.4.15') + s.add_dependency('rake', '>= 0.5.0') s.add_dependency('activesupport', '= 1.0.2' + PKG_BUILD) s.add_dependency('activerecord', '= 1.9.0' + PKG_BUILD) s.add_dependency('actionpack', '= 1.6.0' + PKG_BUILD) @@ -259,9 +264,125 @@ end Rake::GemPackageTask.new(spec) do |pkg| end -# Publish beta gem + +# Publishing ------------------------------------------------------- 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 + +desc "Publish the release files to RubyForge." +task :release => [:package] do + files = ["gem"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } + + if RUBY_FORGE_PROJECT then + require 'net/http' + require 'open-uri' + + project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" + project_data = open(project_uri) { |data| data.read } + group_id = project_data[/[?&]group_id=(\d+)/, 1] + raise "Couldn't get group id" unless group_id + + # This echos password to shell which is a bit sucky + if ENV["RUBY_FORGE_PASSWORD"] + password = ENV["RUBY_FORGE_PASSWORD"] + else + print "#{RUBY_FORGE_USER}@rubyforge.org's password: " + password = STDIN.gets.chomp + end + + login_response = Net::HTTP.start("rubyforge.org", 80) do |http| + data = [ + "login=1", + "form_loginname=#{RUBY_FORGE_USER}", + "form_pw=#{password}" + ].join("&") + http.post("/account/login.php", data) + end + + cookie = login_response["set-cookie"] + raise "Login failed" unless cookie + headers = { "Cookie" => cookie } + + release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" + release_data = open(release_uri, headers) { |data| data.read } + package_id = release_data[/[?&]package_id=(\d+)/, 1] + raise "Couldn't get package id" unless package_id + + first_file = true + release_id = "" + + files.each do |filename| + basename = File.basename(filename) + file_ext = File.extname(filename) + file_data = File.open(filename, "rb") { |file| file.read } + + puts "Releasing #{basename}..." + + release_response = Net::HTTP.start("rubyforge.org", 80) do |http| + release_date = Time.now.strftime("%Y-%m-%d %H:%M") + type_map = { + ".zip" => "3000", + ".tgz" => "3110", + ".gz" => "3110", + ".gem" => "1400" + }; type_map.default = "9999" + type = type_map[file_ext] + boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" + + query_hash = if first_file then + { + "group_id" => group_id, + "package_id" => package_id, + "release_name" => RELEASE_NAME, + "release_date" => release_date, + "type_id" => type, + "processor_id" => "8000", # Any + "release_notes" => "", + "release_changes" => "", + "preformatted" => "1", + "submit" => "1" + } + else + { + "group_id" => group_id, + "release_id" => release_id, + "package_id" => package_id, + "step2" => "1", + "type_id" => type, + "processor_id" => "8000", # Any + "submit" => "Add This File" + } + end + + query = "?" + query_hash.map do |(name, value)| + [name, URI.encode(value)].join("=") + end.join("&") + + data = [ + "--" + boundary, + "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", + "Content-Type: application/octet-stream", + "Content-Transfer-Encoding: binary", + "", file_data, "" + ].join("\x0D\x0A") + + release_headers = headers.merge( + "Content-Type" => "multipart/form-data; boundary=#{boundary}" + ) + + target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" + http.post(target + query, data, release_headers) + end + + if first_file then + release_id = release_response.body[/release_id=(\d+)/, 1] + raise("Couldn't get release id") unless release_id + end + + first_file = false + end + end end \ No newline at end of file diff --git a/railties/fresh_rakefile b/railties/fresh_rakefile index fb9971315f3..cdeb0788e11 100755 --- a/railties/fresh_rakefile +++ b/railties/fresh_rakefile @@ -71,6 +71,7 @@ Rake::RDocTask.new("appdoc") { |rdoc| desc "Generate documentation for the Rails framework" Rake::RDocTask.new("apidoc") { |rdoc| rdoc.rdoc_dir = 'doc/api' + rdoc.template = 'jamis.rb' if ENV['template'] == 'jamis' rdoc.title = "Rails Framework Documentation" rdoc.options << '--line-numbers --inline-source' rdoc.rdoc_files.include('README') @@ -89,7 +90,7 @@ Rake::RDocTask.new("apidoc") { |rdoc| rdoc.rdoc_files.include('vendor/rails/actionmailer/CHANGELOG') rdoc.rdoc_files.include('vendor/rails/actionmailer/lib/action_mailer/base.rb') rdoc.rdoc_files.include('vendor/rails/actionwebservice/README') - rdoc.rdoc_files.include('vendor/rails/actionwebservice/ChangeLog') + rdoc.rdoc_files.include('vendor/rails/actionwebservice/CHANGELOG') rdoc.rdoc_files.include('vendor/rails/actionwebservice/lib/action_web_service.rb') rdoc.rdoc_files.include('vendor/rails/actionwebservice/lib/action_web_service/*.rb') rdoc.rdoc_files.include('vendor/rails/actionwebservice/lib/action_web_service/api/*.rb') @@ -99,6 +100,7 @@ Rake::RDocTask.new("apidoc") { |rdoc| rdoc.rdoc_files.include('vendor/rails/actionwebservice/lib/action_web_service/protocol/*.rb') rdoc.rdoc_files.include('vendor/rails/actionwebservice/lib/action_web_service/support/*.rb') rdoc.rdoc_files.include('vendor/rails/activesupport/README') + rdoc.rdoc_files.include('vendor/rails/activesupport/CHANGELOG') rdoc.rdoc_files.include('vendor/rails/activesupport/lib/active_support/**/*.rb') }