rubyforge 1.0.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ === 2.0.0 / 2009-09-21
2
+
3
+ * Modified to use RubyForge REST API rather than scraping HTML.
4
+
1
5
  === 1.0.5 / 2009-09-15
2
6
 
3
7
  * Added experimental script to sync RF trackers with release names.
@@ -5,7 +5,5 @@ Rakefile
5
5
  bin/rubyforge
6
6
  lib/rubyforge.rb
7
7
  lib/rubyforge/client.rb
8
- lib/rubyforge/cookie_manager.rb
9
8
  test/test_rubyforge.rb
10
9
  test/test_rubyforge_client.rb
11
- test/test_rubyforge_cookie_manager.rb
data/README.txt CHANGED
@@ -13,10 +13,6 @@ A script which automates a limited set of rubyforge operations.
13
13
  * edit ~/.rubyforge/user-config.yml
14
14
  * rubyforge config
15
15
  * For all rubyforge upgrades, run 'rubyforge config' to ensure you have latest.
16
- * Don't forget to login! logging in will store a cookie in your
17
- .rubyforge directory which expires after a time. always run the
18
- login command before any operation that requires authentication,
19
- such as uploading a package.
20
16
 
21
17
  == Synopsis
22
18
 
@@ -25,6 +21,7 @@ A script which automates a limited set of rubyforge operations.
25
21
  == REQUIREMENTS
26
22
 
27
23
  * hoe
24
+ * json
28
25
  * rubygems
29
26
 
30
27
  == INSTALL
data/Rakefile CHANGED
@@ -2,14 +2,18 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
+ require 'json'
5
6
 
6
7
  abort "you _must_ install this gem to release it" if
7
8
  ENV['VERSION'] && ENV['VERSION'] != RubyForge::VERSION
8
9
 
10
+ Hoe.plugin :email
11
+
9
12
  Hoe.spec "rubyforge" do
10
13
  developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
11
14
  developer 'Eric Hodel', 'drbrain@segment7.net'
12
15
  developer 'Ara T Howard', 'ara.t.howard@gmail.com'
16
+ developer 'Tom Copeland', 'tom@infoether.com'
13
17
 
14
18
  multiruby_skip << "rubinius"
15
19
 
@@ -17,6 +21,8 @@ Hoe.spec "rubyforge" do
17
21
  self.need_tar = false
18
22
  end
19
23
 
24
+ task :postrelease => :announce
25
+
20
26
  task :backup do
21
27
  Dir.chdir File.expand_path("~/.rubyforge") do
22
28
  cp "user-config.yml", "user-config.yml.bak"
@@ -41,21 +41,12 @@ MODES
41
41
  example :
42
42
  #{ PROGRAM } names
43
43
 
44
- login()
45
- sends username and password from config.yml (or --username/--password
46
- options) and stores login cookie in cookie.dat. this is required for
47
- subsquent operations work.
48
-
49
- example :
50
- #{ PROGRAM } login
51
- #{ PROGRAM } login --username zaphod --password 42
52
-
53
44
  create_package(group_id, package_name)
54
45
  creates the named package under the specified group.
55
46
 
56
47
  example :
57
48
  #{ PROGRAM } create_package 1024 traits
58
- #{ PROGRAM } login && #{ PROGRAM } create_package codeforpeople.com traits
49
+ #{ PROGRAM } create_package codeforpeople.com traits
59
50
 
60
51
  add_release(group_id, package_id, release_name, userfile)
61
52
  release a file as release_name under the specified group_id and
@@ -65,7 +56,7 @@ MODES
65
56
  #{ PROGRAM } add_release codeforpeople.com traits 0.8.0 traits-0.8.0.gem
66
57
  #{ PROGRAM } add_release codeforpeople.com traits 0.8.0 traits-0.8.0.tgz
67
58
  #{ PROGRAM } add_release 1024 1242 0.8.0 traits-0.8.0.gem
68
- #{ PROGRAM } login && #{ PROGRAM } add_release 1024 1242 0.8.0 traits-0.8.0.gem
59
+ #{ PROGRAM } add_release 1024 1242 0.8.0 traits-0.8.0.gem
69
60
 
70
61
  add_file(group_id, package_id, release_id, userfile)
71
62
  add a file to an existing release under the specified group_id,
@@ -83,6 +74,12 @@ MODES
83
74
  #{ PROGRAM } delete_package codeforpeople.com traits
84
75
  #{ PROGRAM } delete_package 1024 traits
85
76
 
77
+ post_news(group_id, summary, details)
78
+ posts a news item to the specified group
79
+
80
+ example :
81
+ #{ PROGRAM } post_news codeforpeople.com "new release" "this release is great!"
82
+ #{ PROGRAM } post_news 1024 traits "new release" "this release is great!"
86
83
  NOTES
87
84
 
88
85
  - In order to use group_id, package_id, or release_id by name,
@@ -90,16 +87,10 @@ NOTES
90
87
  rubyforge[package_ids] translation tables in your config.yml. See
91
88
  the config command for more information and help.
92
89
 
93
- - don\'t forget to login! logging in will store a cookie in your
94
- .rubyforge directory which expires after a time. always run the login
95
- command before any operation that requires authentication, such as
96
- uploading a package.
97
-
98
90
  TODO
99
91
 
100
- - add error checking. this requires screen scraping to see of an operation
101
- succeeded since 200 is returned from rubyforge even for failed operations
102
- and only the html text reveals the status.
92
+ - add error checking. this may require mods to the REST API as
93
+ well to ensure that it returns useful error codes.
103
94
 
104
95
  OPTIONS
105
96
 
@@ -112,8 +103,6 @@ OPTIONS
112
103
  specify username, taken from config otherwise
113
104
  --password , -p
114
105
  specify password, taken from config otherwise
115
- --cookie_jar , -C
116
- specify cookie storage file (default #{ RubyForge::COOKIE_F })
117
106
 
118
107
  add_release :
119
108
  --is_private , -P
@@ -140,7 +129,6 @@ opts = GetoptLong::new(
140
129
  [ "--force" , "-F" , GetoptLong::NO_ARGUMENT ],
141
130
  [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ],
142
131
  [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ],
143
- [ "--cookie_jar" , "-C" , GetoptLong::REQUIRED_ARGUMENT ],
144
132
  [ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ],
145
133
  [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ],
146
134
  [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ],
@@ -171,10 +159,6 @@ when %r/names/
171
159
  rf = rubyforge.autoconfig
172
160
  puts "groups : #{rf["group_ids"].keys.sort.join(", ")}"
173
161
  puts "packages: #{rf["package_ids"].keys.sort.join(", ")}"
174
- when %r/login/
175
- rubyforge.login
176
- when %r/logout/
177
- rubyforge.logout
178
162
  when %r/create_package/
179
163
  page, msg = "/frs/admin/index.php", "post_content"
180
164
 
@@ -185,9 +169,15 @@ when %r/create_package/
185
169
 
186
170
  group_id = Integer(group_id) rescue group_id
187
171
 
188
- rubyforge.login
189
-
190
172
  rubyforge.create_package group_id, package_name
173
+ when %r/post_news/
174
+ group_id, summary, details = ARGV
175
+
176
+ abort "no <group_id>" unless group_id
177
+
178
+ group_id = Integer(group_id) rescue group_id
179
+
180
+ rubyforge.post_news group_id, summary, details
191
181
  when %r/delete_package/
192
182
  group_id, package_id = ARGV
193
183
 
@@ -197,8 +187,6 @@ when %r/delete_package/
197
187
  group_id = Integer(group_id) rescue group_id
198
188
  package_id = Integer(package_id) rescue package_id
199
189
 
200
- rubyforge.login
201
-
202
190
  rubyforge.delete_package group_id, package_id
203
191
  when %r/add_release/
204
192
  group_id, package_id, release_name, userfile = ARGV
@@ -211,8 +199,6 @@ when %r/add_release/
211
199
  group_id = Integer(group_id) rescue group_id
212
200
  package_id = Integer(package_id) rescue package_id
213
201
 
214
- rubyforge.login
215
-
216
202
  rubyforge.add_release group_id, package_id, release_name, userfile
217
203
  when %r/add_file/
218
204
  group_id, package_id, release_id, userfile = ARGV
@@ -226,8 +212,6 @@ when %r/add_file/
226
212
  package_id = Integer(package_id) rescue package_id
227
213
  release_id = Integer(release_id) rescue release_id
228
214
 
229
- rubyforge.login
230
-
231
215
  rubyforge.add_file group_id, package_id, release_id, userfile
232
216
  else
233
217
  abort USAGE
@@ -1,5 +1,6 @@
1
1
  #! /usr/bin/env ruby -w
2
2
 
3
+ require 'json'
3
4
  require 'enumerator'
4
5
  require 'fileutils'
5
6
  require 'yaml'
@@ -8,14 +9,15 @@ require 'rubyforge/client'
8
9
 
9
10
  $TESTING = false unless defined? $TESTING
10
11
 
12
+ $DEBUG=false
13
+
11
14
  class RubyForge
12
15
 
13
16
  # :stopdoc:
14
- VERSION = '1.0.5'
17
+ VERSION = '2.0.0'
15
18
  HOME = ENV["HOME"] || ENV["HOMEPATH"] || File::expand_path("~")
16
19
  RUBYFORGE_D = File::join HOME, ".rubyforge"
17
20
  CONFIG_F = File::join RUBYFORGE_D, "user-config.yml"
18
- COOKIE_F = File::join RUBYFORGE_D, "cookie.dat"
19
21
 
20
22
  # We must use __FILE__ instead of DATA because this is now a library
21
23
  # and DATA is relative to $0, not __FILE__.
@@ -36,6 +38,10 @@ class RubyForge
36
38
  @client = nil
37
39
  @uri = nil
38
40
  end
41
+
42
+ # These are no-ops now, but we'll keep them here for backwards compatibility
43
+ def login ; end
44
+ def logout ; end
39
45
 
40
46
  def configure opts = {}
41
47
  user_path = CONFIG_F
@@ -56,7 +62,6 @@ class RubyForge
56
62
 
57
63
  raise "no <username>" unless @userconfig["username"]
58
64
  raise "no <password>" unless @userconfig["password"]
59
- raise "no <cookie_jar>" unless @userconfig["cookie_jar"]
60
65
 
61
66
  self
62
67
  end
@@ -65,10 +70,6 @@ class RubyForge
65
70
  @userconfig['force']
66
71
  end
67
72
 
68
- def cookie_store
69
- client.cookie_store
70
- end
71
-
72
73
  def uri
73
74
  @uri ||= URI.parse @userconfig['uri']
74
75
  end
@@ -82,7 +83,6 @@ class RubyForge
82
83
  open(CONFIG_F, "w") { |f|
83
84
  f.write YAML.dump(config)
84
85
  }
85
- FileUtils::touch COOKIE_F
86
86
  edit = (ENV["EDITOR"] || ENV["EDIT"] || "vi") + " '#{CONFIG_F}'"
87
87
  system edit or puts "edit '#{CONFIG_F}'"
88
88
  end
@@ -99,18 +99,21 @@ class RubyForge
99
99
  %w(group package processor release).each do |type|
100
100
  @autoconfig["#{type}_ids"].clear if @autoconfig["#{type}_ids"]
101
101
  end
102
+
103
+ json = get_via_rest_api "/users/#{username}/groups.js"
102
104
 
103
- puts "Getting #{username}"
104
- html = URI.parse("http://rubyforge.org/users/#{username}/index.html").read
105
-
106
- projects = html.scan(%r%/projects/([^/]+)/%).flatten
107
-
105
+ projects = json.collect {|group| group['group']['unix_group_name'] }
108
106
  puts "Fetching #{projects.size} projects"
109
107
  projects.each do |project|
110
- next if project == "support"
111
108
  scrape_project(project)
112
109
  end
113
110
  end
111
+
112
+ def get_via_rest_api(path)
113
+ url = "#{@userconfig['uri']}#{path}"
114
+ puts "Hitting REST API: #{url}" if $DEBUG
115
+ JSON.parse(client.get_content(url, {}, {}, @userconfig))
116
+ end
114
117
 
115
118
  def scrape_project(project)
116
119
  data = {
@@ -120,47 +123,30 @@ class RubyForge
120
123
  "release_ids" => Hash.new { |h,k| h[k] = {} },
121
124
  }
122
125
 
123
- puts "Updating #{project}"
124
-
125
126
  unless data["group_ids"].has_key? project then
126
- html = URI.parse("http://rubyforge.org/projects/#{project}/index.html").read
127
- group_id = html[%r/(memberlist.php|frs|tracker|mail)\/?\?group_id=\d+/][%r/\d+/].to_i
128
-
127
+ json = get_via_rest_api "/groups/#{project}.js"
128
+ group_id = json["group"]["group_id"].to_i
129
129
  data["group_ids"][project] = group_id
130
130
  end
131
131
 
132
- group_id = data["group_ids"][project]
133
-
134
- html = URI.parse("http://rubyforge.org/frs/?group_id=#{group_id}").read
135
-
136
- package = nil
137
- html.scan(/<h3>[^<]+|release_id=\d+">[^>]+|filemodule_id=\d+/).each do |s|
138
- case s
139
- when /<h3>Gem namespace ownership/ then
140
- break
141
- when /<h3>([^<]+)/ then
142
- package = $1.strip
143
- when /release_id=(\d+)">([^<]+)/ then
144
- data["release_ids"][package][$2] = $1.to_i
145
- when /filemodule_id=(\d+)/ then
146
- data["package_ids"][package] = $1.to_i
132
+ # Get project's packages
133
+ json = get_via_rest_api "/groups/#{project}/packages.js"
134
+ json.each do |package|
135
+ data["package_ids"][package["package"]["name"]] = package["package"]["package_id"]
136
+ # Get releases for this package
137
+ json = get_via_rest_api "/packages/#{package["package"]["package_id"]}/releases.js"
138
+ json.each do |release|
139
+ data["release_ids"][package["package"]["name"]][release["name"]] = release["release_id"]
147
140
  end
148
141
  end
149
142
 
150
- if not data['release_ids'][package].empty? and
151
- (@autoconfig['processor_ids'].nil? or
152
- @autoconfig['processor_ids'].empty?) then
153
- puts "Fetching processor ids"
154
-
155
- login
156
-
157
- html = client.get_content "http://rubyforge.org/frs/admin/qrs.php?package=&group_id=#{group_id}"
158
-
159
- html =~ /<select name="processor_id">(.*?)<\/select>/m
160
- processors = $1
161
- processors.scan(/<option value="(\d{4})">([^<]+)/) do
162
- data["processor_ids"][$2] = $1.to_i
163
- end if processors
143
+ # Get processor ids
144
+ if @autoconfig['processor_ids'].nil? || @autoconfig['processor_ids'].empty?
145
+ puts "Fetching processor ids" if $DEBUG
146
+ json = get_via_rest_api "/processors.js"
147
+ json.each do |processor|
148
+ data["processor_ids"][processor["processor"]["name"]] = processor["processor"]["processor_id"]
149
+ end
164
150
  end
165
151
 
166
152
  data.each do |key, val|
@@ -171,51 +157,16 @@ class RubyForge
171
157
  save_autoconfig
172
158
  end
173
159
 
174
- def logout
175
- cookie_store.clear "rubyforge.org"
176
- end
177
-
178
- def login
179
- return if(!force and cookie_store['rubyforge.org']['session_ser']) rescue false
180
-
181
- page = self.uri + "/account/login.php"
182
- page.scheme = 'https'
183
- page = URI.parse page.to_s # set SSL port correctly
184
-
185
- username = @userconfig["username"]
186
- password = @userconfig["password"]
187
-
188
- form = {
189
- "return_to" => "",
190
- "form_loginname" => username,
191
- "form_pw" => password,
192
- "login" => "Login"
193
- }
194
-
195
- response = run page, form
196
-
197
- re = %r/personal\s+page/iom
198
- unless response =~ re
199
- warn("%s:%d: warning: potentially failed login using %s" %
200
- [__FILE__, __LINE__, username]) unless $TESTING
201
- end
202
-
203
- response
204
- end
205
-
206
160
  def create_package(group_id, package_name)
207
- page = "/frs/admin/index.php"
161
+ page = "/groups/#{group_id}/packages"
208
162
 
209
163
  group_id = lookup "group", group_id
210
164
  is_private = @userconfig["is_private"]
211
165
  is_public = is_private ? 0 : 1
212
166
 
213
167
  form = {
214
- "func" => "add_package",
215
- "group_id" => group_id,
216
- "package_name" => package_name,
217
- "is_public" => is_public,
218
- "submit" => "Create This Package",
168
+ "package[name]" => package_name,
169
+ "package[is_public]" => is_public
219
170
  }
220
171
 
221
172
  run page, form
@@ -228,102 +179,61 @@ class RubyForge
228
179
  # Posts news item to +group_id+ (can be name) with +subject+ and +body+
229
180
 
230
181
  def post_news(group_id, subject, body)
231
- page = "/news/submit.php"
232
- group_id = lookup "group", group_id
233
-
182
+ # TODO - what was the post_changes parameter for?
234
183
  form = {
235
- "group_id" => group_id,
236
- "post_changes" => "y",
237
- "summary" => subject,
238
- "details" => body,
239
- "submit" => "Submit",
184
+ "news_byte[summary]" => subject,
185
+ "news_byte[details]" => body
240
186
  }
241
-
242
- run page, form
187
+ group_id = lookup "group", group_id
188
+ url = "/groups/#{group_id}/news_bytes"
189
+ run url, form
243
190
  end
244
191
 
245
192
  def delete_package(group_id, package_id)
246
- page = "/frs/admin/index.php"
247
-
248
193
  group_id = lookup "group", group_id
249
194
  package_id = lookup "package", package_id
250
-
251
- form = {
252
- "func" => "delete_package",
253
- "group_id" => group_id,
254
- "package_id" => package_id,
255
- "sure" => "1",
256
- "really_sure" => "1",
257
- "submit" => "Delete",
258
- }
259
-
260
195
  package_name = @autoconfig["package_ids"].invert[package_id]
261
196
  @autoconfig["package_ids"].delete package_name
262
197
  @autoconfig["release_ids"].delete package_name
263
198
  save_autoconfig
264
-
265
- run page, form
199
+ url = "/packages/#{package_id}"
200
+ run url, {"_method" => "delete"}
266
201
  end
267
202
 
268
203
  def add_release(group_id, package_id, release_name, *files)
269
- userfile = files.shift
270
- page = "/frs/admin/qrs.php"
271
-
272
204
  group_id = lookup "group", group_id
273
205
  package_id = lookup "package", package_id
274
- userfile = open userfile, 'rb'
275
206
  release_date = @userconfig["release_date"]
276
- type_id = @userconfig["type_id"]
277
- processor_id = @userconfig["processor_id"]
278
207
  release_notes = @userconfig["release_notes"]
279
208
  release_changes = @userconfig["release_changes"]
280
209
  preformatted = @userconfig["preformatted"]
281
-
282
210
  release_date ||= Time.now.strftime("%Y-%m-%d %H:%M")
283
-
284
- type_id ||= userfile.path[%r|\.[^\./]+$|]
285
- type_id = (lookup "type", type_id rescue lookup "type", ".oth")
286
-
287
- processor_id ||= "Any"
288
- processor_id = lookup "processor", processor_id
289
-
290
211
  release_notes = IO::read(release_notes) if
291
212
  test(?e, release_notes) if release_notes
292
-
293
213
  release_changes = IO::read(release_changes) if
294
214
  test(?e, release_changes) if release_changes
295
-
296
215
  preformatted = preformatted ? 1 : 0
297
216
 
298
217
  form = {
299
- "group_id" => group_id,
300
- "package_id" => package_id,
301
- "release_name" => release_name,
302
- "release_date" => release_date,
303
- "type_id" => type_id,
304
- "processor_id" => processor_id,
305
- "release_notes" => release_notes,
306
- "release_changes" => release_changes,
307
- "preformatted" => preformatted,
308
- "userfile" => userfile,
309
- "submit" => "Release File"
218
+ "release[name]" => release_name,
219
+ "release[release_date]" => release_date,
220
+ "release[notes]" => release_notes,
221
+ "release[changes]" => release_changes,
222
+ "release[preformatted]" => preformatted,
310
223
  }
311
224
 
312
- boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
313
- boundary = "multipart/form-data; boundary=___#{ boundary }___"
314
-
315
- html = run(page, form, 'content-type' => boundary)
316
- raise "Invalid package_id #{package_id}" if html[/Invalid package_id/]
317
- raise "You have already released this version." if html[/That filename already exists in this project/]
318
-
319
- release_id = html[/release_id=\d+/][/\d+/].to_i rescue nil
320
-
225
+ url = "/packages/#{package_id}/releases"
226
+ json = run url, form
227
+
228
+ release_id = JSON.parse(json)["release_id"].to_i rescue nil
321
229
  unless release_id then
322
- puts html if $DEBUG
323
- raise "Couldn't get release_id, upload failed\?"
230
+ puts json if $DEBUG
231
+ raise "Couldn't get release_id, upload failed?"
324
232
  end
325
233
 
326
- puts "RELEASE ID = #{release_id}" if $DEBUG
234
+ # FIXME
235
+ #raise "Invalid package_id #{package_id}" if html[/Invalid package_id/]
236
+ #raise "You have already released this version." if html[/That filename already exists in this project/]
327
237
 
328
238
  files.each do |file|
329
239
  add_file(group_id, package_id, release_id, file)
@@ -348,35 +258,29 @@ class RubyForge
348
258
  # add_file(1024, 1242, "0.8.0", "traits-0.8.0.gem")
349
259
 
350
260
  def add_file(group_name, package_name, release_name, userfile)
351
- page = '/frs/admin/editrelease.php'
352
261
  type_id = @userconfig["type_id"]
353
262
  group_id = lookup "group", group_name
354
263
  package_id = lookup "package", package_name
355
264
  release_id = (Integer === release_name) ? release_name : lookup("release", package_name)[release_name]
356
- processor_id = @userconfig["processor_id"]
357
-
358
- page = "/frs/admin/editrelease.php?group_id=#{group_id}&release_id=#{release_id}&package_id=#{package_id}"
265
+ url = "/releases/#{release_id}/files.js"
359
266
 
360
267
  userfile = open userfile, 'rb'
361
268
 
362
269
  type_id ||= userfile.path[%r|\.[^\./]+$|]
363
270
  type_id = (lookup "type", type_id rescue lookup "type", ".oth")
364
271
 
272
+ processor_id = @userconfig["processor_id"]
365
273
  processor_id ||= "Any"
366
274
  processor_id = lookup "processor", processor_id
367
275
 
368
276
  form = {
369
- "step2" => 1,
370
- "type_id" => type_id,
371
- "processor_id" => processor_id,
372
- "userfile" => userfile,
373
- "submit" => "Add This File"
374
- }
375
-
376
- boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
377
- boundary = "multipart/form-data; boundary=___#{ boundary }___"
277
+ "file[filename]" => File.basename(userfile.path),
278
+ "file[processor_id]" => processor_id,
279
+ "file[type_id]" => type_id,
280
+ "contents" => userfile.read
281
+ }
378
282
 
379
- run page, form, 'content-type' => boundary
283
+ run url, form
380
284
  end
381
285
 
382
286
  def client
@@ -384,29 +288,16 @@ class RubyForge
384
288
 
385
289
  @client = RubyForge::Client::new ENV["HTTP_PROXY"]
386
290
  @client.debug_dev = STDERR if ENV["RUBYFORGE_DEBUG"] || ENV["DEBUG"] || $DEBUG
387
- @client.cookie_store = @userconfig["cookie_jar"]
388
291
 
389
292
  @client
390
293
  end
391
294
 
392
295
  def run(page, form, extheader={}) # :nodoc:
393
296
  uri = self.uri + page
394
- if $DEBUG then
395
- puts "client.post_content #{uri.inspect}, #{form.inspect}, #{extheader.inspect}"
396
- end
397
-
398
- response = client.post_content uri, form, extheader
399
-
400
- client.save_cookie_store
401
-
402
- if $DEBUG then
403
- response.sub!(/\A.*end tabGenerator -->/m, '')
404
- response.gsub!(/\t/, ' ')
405
- response.gsub!(/\n{3,}/, "\n\n")
406
- puts response
407
- end
408
-
409
- return response
297
+ puts "client.post_content #{uri.inspect}, #{form.inspect}, #{extheader.inspect}" if $DEBUG
298
+ response = client.post_content uri, form, extheader, @userconfig
299
+ puts response if $DEBUG
300
+ response
410
301
  end
411
302
 
412
303
  def lookup(type, val) # :nodoc:
@@ -423,11 +314,11 @@ __END__
423
314
  #
424
315
  # base rubyforge uri - store in #{ CONFIG_F }
425
316
  #
426
- uri : http://rubyforge.org
317
+ uri : http://api.rubyforge.org
427
318
  #
428
319
  # this must be your username
429
320
  #
430
- username : username
321
+ username : tom
431
322
  #
432
323
  # this must be your password
433
324
  #
@@ -435,7 +326,6 @@ __END__
435
326
  #
436
327
  # defaults for some values
437
328
  #
438
- cookie_jar : #{ COOKIE_F }
439
329
  is_private : false
440
330
  # AUTOCONFIG:
441
331
  rubyforge :
@@ -444,6 +334,7 @@ __END__
444
334
  #
445
335
  group_ids :
446
336
  codeforpeople : 1024
337
+ support : 5
447
338
  #
448
339
  # map your package names to their rubyforge ids
449
340
  #