<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -84,116 +84,12 @@ task :pdoc =&gt; [:rdoc] do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:package] do
-  files = [&quot;gem&quot;, &quot;tgz&quot;, &quot;zip&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
-
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
-
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
+task :release =&gt; [ :package ] do
+  `rubyforge login`
+
+  for ext in %w( gem tgz zip )
+    release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}&quot;
+    puts release_command
+    system(release_command)
   end
-end
+end
\ No newline at end of file</diff>
      <filename>actionmailer/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -136,116 +136,12 @@ task :pdoc =&gt; [:rdoc] do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:package] do
-  files = [&quot;gem&quot;, &quot;tgz&quot;, &quot;zip&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
-
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
+task :release =&gt; [ :package ] do
+  `rubyforge login`
 
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
+  for ext in %w( gem tgz zip )
+    release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}&quot;
+    puts release_command
+    system(release_command)
   end
-end
+end
\ No newline at end of file</diff>
      <filename>actionpack/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -160,116 +160,12 @@ task :lines do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:package] do
-  files = [&quot;gem&quot;, &quot;tgz&quot;, &quot;zip&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
+task :release =&gt; [ :package ] do
+  `rubyforge login`
 
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
-
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
+  for ext in %w( gem tgz zip )
+    release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}&quot;
+    puts release_command
+    system(release_command)
   end
-end
+end
\ No newline at end of file</diff>
      <filename>actionwebservice/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -170,116 +170,12 @@ task :pdoc =&gt; [:rdoc] do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:package] do
-  files = [&quot;gem&quot;, &quot;tgz&quot;, &quot;zip&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
-
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
+task :release =&gt; [ :package ] do
+  `rubyforge login`
 
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
+  for ext in %w( gem tgz zip )
+    release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}&quot;
+    puts release_command
+    system(release_command)
   end
-end
+end
\ No newline at end of file</diff>
      <filename>activerecord/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -71,116 +71,12 @@ task :pdoc =&gt; [:rdoc] do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:package] do
-  files = [&quot;gem&quot;, &quot;tgz&quot;, &quot;zip&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
+task :release =&gt; [ :package ] do
+  `rubyforge login`
 
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
-
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
+  for ext in %w( gem tgz zip )
+    release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}&quot;
+    puts release_command
+    system(release_command)
   end
-end
+end
\ No newline at end of file</diff>
      <filename>activesupport/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -312,116 +312,9 @@ task :pgem =&gt; [:gem] do
 end
 
 desc &quot;Publish the release files to RubyForge.&quot;
-task :release =&gt; [:gem] do
-  files = [&quot;gem&quot;].map { |ext| &quot;pkg/#{PKG_FILE_NAME}.#{ext}&quot; }
-
-  if RUBY_FORGE_PROJECT then
-    require 'net/http'
-    require 'open-uri'
-
-    project_uri = &quot;http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/&quot;
-    project_data = open(project_uri) { |data| data.read }
-    group_id = project_data[/[?&amp;]group_id=(\d+)/, 1]
-    raise &quot;Couldn't get group id&quot; unless group_id
-
-    # This echos password to shell which is a bit sucky
-    if ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-      password = ENV[&quot;RUBY_FORGE_PASSWORD&quot;]
-    else
-      print &quot;#{RUBY_FORGE_USER}@rubyforge.org's password: &quot;
-      password = STDIN.gets.chomp
-    end
-
-    login_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-      data = [
-        &quot;login=1&quot;,
-        &quot;form_loginname=#{RUBY_FORGE_USER}&quot;,
-        &quot;form_pw=#{password}&quot;
-      ].join(&quot;&amp;&quot;)
-      http.post(&quot;/account/login.php&quot;, data)
-    end
-
-    cookie = login_response[&quot;set-cookie&quot;]
-    raise &quot;Login failed&quot; unless cookie
-    headers = { &quot;Cookie&quot; =&gt; cookie }
-
-    release_uri = &quot;http://rubyforge.org/frs/admin/?group_id=#{group_id}&quot;
-    release_data = open(release_uri, headers) { |data| data.read }
-    package_id = release_data[/[?&amp;]package_id=(\d+)/, 1]
-    raise &quot;Couldn't get package id&quot; unless package_id
-
-    first_file = true
-    release_id = &quot;&quot;
-
-    files.each do |filename|
-      basename  = File.basename(filename)
-      file_ext  = File.extname(filename)
-      file_data = File.open(filename, &quot;rb&quot;) { |file| file.read }
-
-      puts &quot;Releasing #{basename}...&quot;
-
-      release_response = Net::HTTP.start(&quot;rubyforge.org&quot;, 80) do |http|
-        release_date = Time.now.strftime(&quot;%Y-%m-%d %H:%M&quot;)
-        type_map = {
-          &quot;.zip&quot;    =&gt; &quot;3000&quot;,
-          &quot;.tgz&quot;    =&gt; &quot;3110&quot;,
-          &quot;.gz&quot;     =&gt; &quot;3110&quot;,
-          &quot;.gem&quot;    =&gt; &quot;1400&quot;
-        }; type_map.default = &quot;9999&quot;
-        type = type_map[file_ext]
-        boundary = &quot;rubyqMY6QN9bp6e4kS21H4y0zxcvoor&quot;
-
-        query_hash = if first_file then
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;release_name&quot; =&gt; RELEASE_NAME,
-            &quot;release_date&quot; =&gt; release_date,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;release_notes&quot; =&gt; &quot;&quot;,
-            &quot;release_changes&quot; =&gt; &quot;&quot;,
-            &quot;preformatted&quot; =&gt; &quot;1&quot;,
-            &quot;submit&quot; =&gt; &quot;1&quot;
-          }
-        else
-          {
-            &quot;group_id&quot; =&gt; group_id,
-            &quot;release_id&quot; =&gt; release_id,
-            &quot;package_id&quot; =&gt; package_id,
-            &quot;step2&quot; =&gt; &quot;1&quot;,
-            &quot;type_id&quot; =&gt; type,
-            &quot;processor_id&quot; =&gt; &quot;8000&quot;, # Any
-            &quot;submit&quot; =&gt; &quot;Add This File&quot;
-          }
-        end
-
-        query = &quot;?&quot; + query_hash.map do |(name, value)|
-          [name, URI.encode(value)].join(&quot;=&quot;)
-        end.join(&quot;&amp;&quot;)
-
-        data = [
-          &quot;--&quot; + boundary,
-          &quot;Content-Disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;#{basename}\&quot;&quot;,
-          &quot;Content-Type: application/octet-stream&quot;,
-          &quot;Content-Transfer-Encoding: binary&quot;,
-          &quot;&quot;, file_data, &quot;&quot;
-          ].join(&quot;\x0D\x0A&quot;)
-
-        release_headers = headers.merge(
-          &quot;Content-Type&quot; =&gt; &quot;multipart/form-data; boundary=#{boundary}&quot;
-        )
-
-        target = first_file ? &quot;/frs/admin/qrs.php&quot; : &quot;/frs/admin/editrelease.php&quot;
-        http.post(target + query, data, release_headers)
-      end
-
-      if first_file then
-        release_id = release_response.body[/release_id=(\d+)/, 1]
-        raise(&quot;Couldn't get release id&quot;) unless release_id
-      end
-
-      first_file = false
-    end
-  end
-end
+task :release =&gt; [ :gem ] do
+  `rubyforge login`
+  release_command = &quot;rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.gem&quot;
+  puts release_command
+  system(release_command)
+end
\ No newline at end of file</diff>
      <filename>railties/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,8 @@
 #!/usr/local/bin/ruby
 
+VERSION  = ARGV.first
 PACKAGES = %w( activesupport activerecord actionpack actionmailer actionwebservice )
 
-unless ruby_forge_password = ARGV.first
-  print &quot;rubyforge.org's password: &quot;
-  ruby_forge_password = STDIN.gets.chomp
-end
-
 # Checkout source
 `rm -rf release &amp;&amp; svn export http://dev.rubyonrails.org/svn/rails/trunk release`
 
@@ -14,16 +10,16 @@ end
 `cd release/railties &amp;&amp; rake template=jamis package`
 
 # Upload documentation
-`cd release/rails/doc/api &amp;&amp; scp -r * davidhh@wrath.rubyonrails.com:public_html/rails`
-PACKAGES.each do |p| 
-  `cd release/#{p} &amp;&amp; echo &quot;Publishing documentation for #{p}&quot; &amp;&amp; rake template=jamis pdoc`
-end
+`cd release/rails/doc/api &amp;&amp; scp -r * davidhh@wrath.rubyonrails.com:public_html/api`
 
 # Upload packages
 (PACKAGES + %w(railties)).each do |p| 
-  `cd release/#{p} &amp;&amp; echo &quot;Releasing #{p}&quot; &amp;&amp; RUBY_FORGE_PASSWORD=#{ruby_forge_password} rake release`
+  `cd release/#{p} &amp;&amp; echo &quot;Releasing #{p}&quot; &amp;&amp; rake release`
 end
 
 # Upload rails tgz/zip
+`rubyforge add_release rails rails 'REL #{VERSION}' rails-#{VERSION}.tgz`
+`rubyforge add_release rails rails 'REL #{VERSION}' rails-#{VERSION}.zip`
 
 # Create SVN tag
+puts &quot;Remeber to create SVN tag&quot;
\ No newline at end of file</diff>
      <filename>release.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2ebad525e0e62bb8f0d7ebe38e4c9b1760a38216</id>
    </parent>
  </parents>
  <author>
    <name>David Heinemeier Hansson</name>
    <email>david@loudthinking.com</email>
  </author>
  <url>http://github.com/chriseppstein/rails/commit/4363bd02391cf43bfd48faaebff5486209b7f93b</url>
  <id>4363bd02391cf43bfd48faaebff5486209b7f93b</id>
  <committed-date>2006-04-09T15:14:08-07:00</committed-date>
  <authored-date>2006-04-09T15:14:08-07:00</authored-date>
  <message>Use Aras RubyForge uploader

git-svn-id: http://svn-commit.rubyonrails.org/rails/branches/stable@4204 5ecf4fe2-1ee6-0310-87b1-e25e094e27de</message>
  <tree>1706ddd7961c1002181c26f5c1482f9b16b13bc9</tree>
  <committer>
    <name>David Heinemeier Hansson</name>
    <email>david@loudthinking.com</email>
  </committer>
</commit>
