rubyforge 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.cvsignore ADDED
@@ -0,0 +1,2 @@
1
+ doc
2
+ pkg
data/History.txt CHANGED
@@ -1,19 +1,31 @@
1
- == Version History
1
+ * 0.4.0 / 2007-01-09:
2
+ * config.yml split and moved to user-config.yml (up to the user to do).
3
+ * auto-config.yml now generated via config command.
4
+ * @config renamed to @userconfig.
5
+ * @config["rubyforge"] moved to @autoconfig.
6
+ * Added save_autoconfig.
7
+ * Pulled scrape_project from scrape_config.
8
+ * scrape_config no longer takes a user param. Use opts to specify.
9
+ * scrape_project, add_project, add/remove_release now save automatically.
2
10
 
3
11
  * 0.3.2 / 2006-11-29:
4
12
  * Fixed file uploads for windows.
5
13
  * Correctly scrape releases with funky characters.
14
+
6
15
  * 0.3.1 / 2006-10-24:
7
16
  * Added SSL login.
8
17
  * Added yet more debugging output if $DEBUG.
18
+
9
19
  * 0.3.0 / 2006-09-30:
10
20
  * Added more debugging output if $DEBUG
11
21
  * Added news posting.
12
22
  * Added multiple file release to add_release (uses add_file for extras).
13
23
  * add_release now returns release_id
14
24
  * Fixed config scraper to include '-' in names.
25
+
15
26
  * 0.2.1 / 2006-09-14:
16
27
  * Gemspec was too loose about packaging. Now using manifest.
28
+
17
29
  * 0.2.0 / 2006-09-13:
18
30
  * Split original script into script and library.
19
31
  * Added tests for library.
data/Manifest.txt CHANGED
@@ -1,9 +1,9 @@
1
+ .cvsignore
1
2
  History.txt
2
3
  Manifest.txt
3
- README
4
+ README.txt
4
5
  Rakefile
5
6
  bin/rubyforge
6
- install.rb
7
7
  lib/http-access2.rb
8
8
  lib/http-access2/cookie.rb
9
9
  lib/http-access2/http.rb
@@ -6,13 +6,12 @@
6
6
 
7
7
  A simplistic script which automates a limited set of rubyforge operations
8
8
 
9
- == Modes
10
-
11
- run 'rubyforge help' for complete usage
12
-
13
- == Notes
14
-
15
- * don't forget to login! logging in will store a cookie in your
9
+ * Run 'rubyforge help' for complete usage.
10
+ * Setup: For first time users AND upgrades to 0.4.0:
11
+ * rubyforge setup
12
+ * edit ~/.rubyforge/user-config.yml
13
+ * rubyforge config
14
+ * Don't forget to login! logging in will store a cookie in your
16
15
  .rubyforge directory which expires after a time. always run the
17
16
  login command before any operation that requires authentication,
18
17
  such as uploading a package.
data/Rakefile CHANGED
@@ -1,91 +1,28 @@
1
1
  # -*- ruby -*-
2
2
 
3
- require 'rake'
4
- require 'rake/testtask'
5
- require 'rake/rdoctask'
6
- require 'rake/gempackagetask'
7
- require 'rake/contrib/sshpublisher'
8
- require 'rbconfig'
9
-
10
- $: << 'lib'
11
- require './lib/rubyforge.rb'
12
-
13
- require 'rubygems'
14
-
15
- gem = Gem::Specification::new do |spec|
16
- spec.name = 'rubyforge'
17
- spec.version = RubyForge::VERSION
18
- spec.platform = Gem::Platform::RUBY
19
-
20
- spec.summary = File.read("README").split(/\n\n+/)[3]
21
- spec.description = spec.summary # TODO: improve
22
-
23
- spec.files = File.readlines("Manifest.txt").map { |l| l.chomp }
24
- spec.executables = spec.files.grep(/^bin/).map { |f| File::basename f }
25
-
26
- spec.has_rdoc = true
27
- spec.test_suite_file = "test/test_rubyforge.rb"
28
-
29
- spec.author = "Ara T. Howard"
30
- spec.email = "ara.t.howard@noaa.gov"
31
- spec.homepage = "http://codeforpeople.com/lib/ruby/rubyforge/"
32
-
33
- if $DEBUG then
34
- puts "#{spec.name} #{spec.version}"
35
- puts
36
- puts "bin = #{spec.executable.sort.inspect}"
37
- puts
38
- puts "** summary:"
39
- puts spec.summary
40
- puts
41
- puts "** description:"
42
- puts spec.description
43
- end
3
+ begin
4
+ require 'hoe'
5
+ rescue LoadError
6
+ abort "ERROR: This Rakefile is only useful with hoe installed.
7
+ If you're trying to install the rubyforge library,
8
+ please install it via rubygems."
44
9
  end
45
10
 
46
- desc 'Build Gem'
47
- Rake::GemPackageTask.new gem do |pkg|
48
- pkg.need_tar = true
49
- end
11
+ Object.send :remove_const, :RubyForge if defined? RubyForge
12
+ require './lib/rubyforge.rb'
50
13
 
51
- desc 'Run tests'
52
- task :default => :test
14
+ Hoe.new("rubyforge", RubyForge::VERSION) do |p|
15
+ p.rubyforge_name = "codeforpeople"
16
+ p.url = "http://rubyforge.org/projects/codeforpeople"
17
+ p.author = ['Ara T Howard', 'Ryan Davis', 'Eric Hodel']
18
+ p.need_tar = false
53
19
 
54
- desc 'Run tests'
55
- Rake::TestTask.new :test do |t|
56
- t.libs << 'test'
57
- t.warning = true
58
- end
20
+ changes = p.paragraphs_of("History.txt", 1).first
21
+ summary, *description = p.paragraphs_of("README.txt", 3, 3..4)
59
22
 
60
- desc 'Generate RDoc'
61
- Rake::RDocTask.new :rdoc do |rd|
62
- rd.rdoc_dir = 'doc'
63
- rd.rdoc_files.add 'README', 'History.txt', "lib/rubyforge.rb"
64
- rd.main = 'README'
65
- rd.options << "-t codeforpeople's rubyforge-#{RubyForge::VERSION} Documentation"
66
- end
67
-
68
- desc 'Upload RDoc to RubyForge'
69
- task :upload => :rdoc do
70
- user = "#{ENV['USER']}@rubyforge.org"
71
- project = '/var/www/gforge-projects/codeforpeople/rubyforge'
72
- local_dir = 'doc'
73
- pub = Rake::SshDirPublisher.new user, project, local_dir
74
- pub.upload
75
- end
76
-
77
- task :deploy => [:clean, :package] do |t|
78
- version = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
79
- puts "Releasing #{version}"
80
- rf = RubyForge.new
81
- rf.login
82
- rf.add_release 'codeforpeople', 'rubyforge', version, "pkg/rubyforge-#{version}.tgz", "pkg/rubyforge-#{version}.gem"
83
- end
84
-
85
- desc 'Clean up'
86
- task :clean => [ :clobber_rdoc, :clobber_package ] do
87
- rm_f Dir["**/*~"]
23
+ p.changes = changes
24
+ p.summary = summary
25
+ p.description = description.join("\n\n")
88
26
  end
89
27
 
90
28
  # vim:syntax=ruby
91
-
data/bin/rubyforge CHANGED
@@ -16,7 +16,7 @@ SYNOPSIS
16
16
 
17
17
  DESCRIPTION
18
18
 
19
- simplistic script which automates a limited set of rubyforge operations
19
+ simplistic script which automates a limited set of rubyforge operations
20
20
 
21
21
  MODES
22
22
 
@@ -27,12 +27,13 @@ MODES
27
27
  example :
28
28
  #{ PROGRAM } setup
29
29
 
30
- config()
31
- Helps you populate your config.yml file by scraping rubyforge and
30
+ config([project])
31
+ Helps you populate your auto-config.yml file by scraping rubyforge and
32
32
  getting your groups, projects, and releases.
33
33
 
34
34
  example :
35
35
  #{ PROGRAM } config
36
+ #{ PROGRAM } config myproject
36
37
 
37
38
  names()
38
39
  Prints out the names of your configured groups and projects.
@@ -63,8 +64,8 @@ MODES
63
64
  example :
64
65
  #{ PROGRAM } add_release codeforpeople.com traits 0.8.0 traits-0.8.0.gem
65
66
  #{ PROGRAM } add_release codeforpeople.com traits 0.8.0 traits-0.8.0.tgz
66
- #{ PROGRAM } add_release 1024 1242 0.8.0 traits-0.8.0.gem
67
- #{ PROGRAM } login && #{ PROGRAM } add_release 1024 1242 0.8.0 traits-0.8.0.gem
67
+ #{ 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
68
69
 
69
70
  add_file(group_id, package_id, release_id, userfile)
70
71
  add a file to an existing release under the specified group_id,
@@ -73,7 +74,7 @@ MODES
73
74
  example :
74
75
  #{ PROGRAM } add_file codeforpeople.com traits 0.8.0 traits-0.8.0.gem
75
76
  #{ PROGRAM } add_file codeforpeople.com traits 0.8.0 traits-0.8.0.tgz
76
- #{ PROGRAM } add_file 1024 1242 0.8.0 traits-0.8.0.gem
77
+ #{ PROGRAM } add_file 1024 1242 0.8.0 traits-0.8.0.gem
77
78
 
78
79
  delete_package(group_id, package_name)
79
80
  deletes a package and all its files.
@@ -135,17 +136,17 @@ EOL
135
136
  mode = ARGV.shift
136
137
 
137
138
  opts = GetoptLong::new(
138
- [ "--help" , "-h" , GetoptLong::REQUIRED_ARGUMENT ] ,
139
- [ "--config" , "-c" , GetoptLong::REQUIRED_ARGUMENT ] ,
140
- [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
141
- [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
142
- [ "--cookie_jar" , "-C" , GetoptLong::REQUIRED_ARGUMENT ] ,
139
+ [ "--help" , "-h" , GetoptLong::REQUIRED_ARGUMENT ] ,
140
+ [ "--config" , "-c" , GetoptLong::REQUIRED_ARGUMENT ] ,
141
+ [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
142
+ [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
143
+ [ "--cookie_jar" , "-C" , GetoptLong::REQUIRED_ARGUMENT ] ,
143
144
  [ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ],
144
- [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
145
- [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
146
- [ "--processor_id" , "-o" , GetoptLong::REQUIRED_ARGUMENT ] ,
147
- [ "--release_notes" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
148
- [ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ] ,
145
+ [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
146
+ [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
147
+ [ "--processor_id" , "-o" , GetoptLong::REQUIRED_ARGUMENT ] ,
148
+ [ "--release_notes" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
149
+ [ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ] ,
149
150
  [ "--preformatted" , "-f" , GetoptLong::NO_ARGUMENT ]
150
151
  ).enum_for.inject({}){|h,kv| h.update kv.first.delete('-') => kv.last}
151
152
 
@@ -159,18 +160,20 @@ when %r/help/
159
160
  when %r/setup/
160
161
  rubyforge.setup
161
162
  when %r/config/
162
- puts "Add the following to #{RubyForge::CONFIG_F}"
163
- puts
164
- username = ARGV.shift || rubyforge.config['username']
165
- y "rubyforge" => rubyforge.scrape_config(username)
163
+ project = ARGV.shift
164
+ if project then
165
+ rubyforge.scrape_project(project)
166
+ else
167
+ rubyforge.scrape_config
168
+ end
166
169
  when %r/names/
167
- rf = rubyforge.config["rubyforge"]
170
+ rf = rubyforge.autoconfig
168
171
  puts "groups : #{rf["group_ids"].keys.sort.join(", ")}"
169
172
  puts "packages: #{rf["package_ids"].keys.sort.join(", ")}"
170
173
  when %r/login/
171
174
  rubyforge.login
172
175
  when %r/create_package/
173
- page, msg = "/frs/admin/index.php", "post_content"
176
+ page, msg = "/frs/admin/index.php", "post_content"
174
177
 
175
178
  group_id, package_name = ARGV
176
179
 
data/lib/rubyforge.rb CHANGED
@@ -4,6 +4,7 @@ require 'enumerator'
4
4
  require 'fileutils'
5
5
  require 'http-access2'
6
6
  require 'yaml'
7
+ require 'open-uri'
7
8
 
8
9
  $TESTING = false unless defined? $TESTING
9
10
 
@@ -25,10 +26,10 @@ end
25
26
  class RubyForge
26
27
 
27
28
  # :stopdoc:
28
- VERSION = "0.3.2"
29
+ VERSION = "0.4.0"
29
30
  HOME = ENV["HOME"] || ENV["HOMEPATH"] || File::expand_path("~")
30
31
  RUBYFORGE_D = File::join HOME, ".rubyforge"
31
- CONFIG_F = File::join RUBYFORGE_D, "config.yml"
32
+ CONFIG_F = File::join RUBYFORGE_D, "user-config.yml"
32
33
  COOKIE_F = File::join RUBYFORGE_D, "cookie.dat"
33
34
 
34
35
  # We must use __FILE__ instead of DATA because this is now a library
@@ -38,85 +39,116 @@ class RubyForge
38
39
  attr_reader :client if $TESTING
39
40
  # :startdoc:
40
41
 
41
- attr_reader :config
42
+ attr_reader :userconfig, :autoconfig
42
43
 
43
- def initialize(config=CONFIG_F, opts={})
44
- @config = test(?e, config) ? IO::read(config) : CONFIG
45
- @config = YAML.load(@config).merge(opts)
44
+ def initialize(userconfig=CONFIG_F, opts={})
45
+ @userconfig = test(?e, userconfig) ? IO::read(userconfig) : CONFIG
46
+ @userconfig = YAML.load(@userconfig).merge(opts)
47
+ dir, file = File.split(userconfig)
48
+ @autoconfig_path = File.join(dir, file.sub(/^user/, 'auto'))
49
+ @autoconfig = test(?e, @autoconfig_path) ? YAML.load_file(@autoconfig_path) : YAML.load(CONFIG)["rubyforge"]
46
50
 
47
- @uri = URI.parse @config['uri']
51
+ @uri = URI.parse @userconfig['uri']
48
52
 
49
- raise "no <username>" unless @config["username"]
50
- raise "no <password>" unless @config["password"]
51
- raise "no <cookie_jar>" unless @config["cookie_jar"]
53
+ raise "no <username>" unless @userconfig["username"]
54
+ raise "no <password>" unless @userconfig["password"]
55
+ raise "no <cookie_jar>" unless @userconfig["cookie_jar"]
52
56
  end
53
57
 
54
58
  def setup
55
59
  FileUtils::mkdir_p RUBYFORGE_D unless test ?d, RUBYFORGE_D
56
- test ?e, CONFIG_F and FileUtils::mv CONFIG_F, "#{ CONFIG_F }.bak"
57
- open(CONFIG_F, "w") { |f| f.write CONFIG }
60
+ test ?e, CONFIG_F and FileUtils::mv CONFIG_F, "#{ CONFIG_F }.bak"
61
+ config = CONFIG[/\A.*(?=^\# AUTOCONFIG)/m]
62
+ open(CONFIG_F, "w") { |f| f.write config }
58
63
  FileUtils::touch COOKIE_F
59
64
  edit = (ENV["EDITOR"] || ENV["EDIT"] || "vi") + " #{ CONFIG_F }"
60
65
  system edit or puts "edit #{ CONFIG_F }"
61
66
  end
62
67
 
63
- def login
64
- page = @uri + "/account/login.php"
65
- page.scheme = 'https'
66
- page = URI.parse page.to_s # set SSL port correctly
68
+ def save_autoconfig
69
+ File.open(@autoconfig_path, "w") do |file|
70
+ YAML.dump @autoconfig, file
71
+ end
72
+ end
67
73
 
68
- username = @config["username"]
69
- password = @config["password"]
74
+ def scrape_config
75
+ username = @userconfig['username']
70
76
 
71
- form = {
72
- "return_to" => "",
73
- "form_loginname" => username,
74
- "form_pw" => password,
75
- "login" => "Login"
76
- }
77
+ %w(group package release).each do |type|
78
+ @autoconfig["#{type}_ids"].clear
79
+ end
77
80
 
78
- run page, form
81
+ puts "Getting #{username}"
82
+ html = URI.parse("http://rubyforge.org/users/#{username}/index.html").read
83
+ projects = html.scan(%r%/projects/([^/]+)/%).flatten
84
+ puts "Fetching #{projects.size} projects"
85
+ projects.each do |project|
86
+ next if project == "support"
87
+ scrape_project(project)
88
+ end
79
89
  end
80
90
 
81
- def scrape_config(username)
82
- require 'open-uri'
83
-
91
+ def scrape_project(project)
84
92
  data = {
85
93
  "group_ids" => {},
86
94
  "package_ids" => {},
87
95
  "release_ids" => Hash.new { |h,k| h[k] = {} },
88
96
  }
89
97
 
90
- html = URI.parse("http://rubyforge.org/users/#{username}/index.html").read
91
- html.scan(%r%/projects/([^/]+)/%).flatten.each do |project|
92
- next if project == "support"
93
- html = URI.parse("http://rubyforge.org/projects/#{project}/index.html").read
98
+ puts "Updating #{project}"
94
99
 
100
+ unless data["group_ids"].has_key? project then
101
+ html = URI.parse("http://rubyforge.org/projects/#{project}/index.html").read
95
102
  group_id = html[/(frs|tracker)\/\?group_id=\d+/][/\d+/].to_i
96
103
  data["group_ids"][project] = group_id
104
+ end
105
+
106
+ group_id = data["group_ids"][project]
97
107
 
98
- html = URI.parse("http://rubyforge.org/frs/?group_id=#{group_id}").read
99
-
100
- package = nil
101
- html.scan(/<h3>[^<]+|release_id=\d+">[^>]+|filemodule_id=\d+/).each do |s|
102
- case s
103
- when /<h3>([^<]+)/ then
104
- package = $1.strip
105
- when /release_id=(\d+)">([^<]+)/ then
106
- data["release_ids"][package][$2] = $1.to_i
107
- when /filemodule_id=(\d+)/ then
108
- data["package_ids"][package] = $1.to_i
109
- end
108
+ html = URI.parse("http://rubyforge.org/frs/?group_id=#{group_id}").read
109
+
110
+ package = nil
111
+ html.scan(/<h3>[^<]+|release_id=\d+">[^>]+|filemodule_id=\d+/).each do |s|
112
+ case s
113
+ when /<h3>([^<]+)/ then
114
+ package = $1.strip
115
+ when /release_id=(\d+)">([^<]+)/ then
116
+ data["release_ids"][package][$2] = $1.to_i
117
+ when /filemodule_id=(\d+)/ then
118
+ data["package_ids"][package] = $1.to_i
110
119
  end
111
120
  end
112
- data
121
+
122
+ data.each do |key, val|
123
+ @autoconfig[key].merge! val
124
+ end
125
+
126
+ save_autoconfig
127
+ end
128
+
129
+ def login
130
+ page = @uri + "/account/login.php"
131
+ page.scheme = 'https'
132
+ page = URI.parse page.to_s # set SSL port correctly
133
+
134
+ username = @userconfig["username"]
135
+ password = @userconfig["password"]
136
+
137
+ form = {
138
+ "return_to" => "",
139
+ "form_loginname" => username,
140
+ "form_pw" => password,
141
+ "login" => "Login"
142
+ }
143
+
144
+ run page, form
113
145
  end
114
146
 
115
147
  def create_package(group_id, package_name)
116
148
  page = "/frs/admin/index.php"
117
149
 
118
150
  group_id = lookup "group", group_id
119
- is_private = @config["is_private"]
151
+ is_private = @userconfig["is_private"]
120
152
  is_public = is_private ? 0 : 1
121
153
 
122
154
  form = {
@@ -128,6 +160,9 @@ class RubyForge
128
160
  }
129
161
 
130
162
  run page, form
163
+
164
+ group_name = @autoconfig["group_ids"].invert[group_id]
165
+ scrape_project(group_name)
131
166
  end
132
167
 
133
168
  ##
@@ -163,6 +198,11 @@ class RubyForge
163
198
  "submit" => "Delete",
164
199
  }
165
200
 
201
+ package_name = @autoconfig["package_ids"].invert[package_id]
202
+ @autoconfig["package_ids"].delete package_name
203
+ @autoconfig["release_ids"].delete package_name
204
+ save_autoconfig
205
+
166
206
  run page, form
167
207
  end
168
208
 
@@ -170,15 +210,15 @@ class RubyForge
170
210
  userfile = files.shift
171
211
  page = "/frs/admin/qrs.php"
172
212
 
173
- group_id = lookup "group", group_id
174
- package_id = lookup "package", package_id
175
- userfile = open userfile, 'rb'
176
- release_date = @config["release_date"]
177
- type_id = @config["type_id"]
178
- processor_id = @config["processor_id"]
179
- release_notes = @config["release_notes"]
180
- release_changes = @config["release_changes"]
181
- preformatted = @config["preformatted"]
213
+ group_id = lookup "group", group_id
214
+ package_id = lookup "package", package_id
215
+ userfile = open userfile, 'rb'
216
+ release_date = @userconfig["release_date"]
217
+ type_id = @userconfig["type_id"]
218
+ processor_id = @userconfig["processor_id"]
219
+ release_notes = @userconfig["release_notes"]
220
+ release_changes = @userconfig["release_changes"]
221
+ preformatted = @userconfig["preformatted"]
182
222
 
183
223
  release_date ||= Time::now.strftime("%Y-%m-%d %H:%M")
184
224
 
@@ -219,6 +259,11 @@ class RubyForge
219
259
  add_file(group_id, package_id, release_id, file)
220
260
  end
221
261
 
262
+ package_name = @autoconfig["package_ids"].invert[package_id]
263
+ raise "unknown package name for #{package_id}" if package_name.nil?
264
+ @autoconfig["release_ids"][package_name][release_name] = release_id
265
+ save_autoconfig
266
+
222
267
  release_id
223
268
  end
224
269
 
@@ -232,12 +277,12 @@ class RubyForge
232
277
  # add_file(1024, 1242, "0.8.0", "traits-0.8.0.gem")
233
278
 
234
279
  def add_file(group_name, package_name, release_name, userfile)
235
- page = '/frs/admin/editrelease.php'
236
- type_id = @config["type_id"]
237
- group_id = lookup "group", group_name
238
- package_id = lookup "package", package_name
239
- release_id = (Integer === release_name) ? release_name : lookup("release", package_name)[release_name]
240
- processor_id = @config["processor_id"]
280
+ page = '/frs/admin/editrelease.php'
281
+ type_id = @userconfig["type_id"]
282
+ group_id = lookup "group", group_name
283
+ package_id = lookup "package", package_name
284
+ release_id = (Integer === release_name) ? release_name : lookup("release", package_name)[release_name]
285
+ processor_id = @userconfig["processor_id"]
241
286
 
242
287
  page = "/frs/admin/editrelease.php?group_id=#{group_id}&release_id=#{release_id}&package_id=#{package_id}"
243
288
 
@@ -255,7 +300,7 @@ class RubyForge
255
300
  "processor_id" => processor_id,
256
301
  "userfile" => userfile,
257
302
  "submit" => "Add This File"
258
- }
303
+ }
259
304
 
260
305
  boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
261
306
  boundary = "multipart/form-data; boundary=___#{ boundary }___"
@@ -266,11 +311,11 @@ class RubyForge
266
311
  def run(page, form, extheader={}) # :nodoc:
267
312
  client = HTTPAccess2::Client::new ENV["HTTP_PROXY"]
268
313
  client.debug_dev = STDERR if ENV["RUBYFORGE_DEBUG"] || ENV["DEBUG"] || $DEBUG
269
- client.set_cookie_store @config["cookie_jar"]
314
+ client.set_cookie_store @userconfig["cookie_jar"]
270
315
  client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
271
316
 
272
317
  # HACK to fix http-access2 redirect bug/feature
273
- client.redirect_uri_callback = lambda do |res|
318
+ client.redirect_uri_callback = lambda do |res|
274
319
  page = res.header['location'].first
275
320
  page =~ %r/http/ ? page : @uri + page
276
321
  end
@@ -280,7 +325,7 @@ class RubyForge
280
325
  puts "client.post_content #{uri.inspect}, #{form.inspect}, #{extheader.inspect}"
281
326
  end
282
327
 
283
- response = client.post_content uri, form, extheader
328
+ response = client.post_content uri, form, extheader
284
329
 
285
330
  @client = client if $TESTING
286
331
 
@@ -299,8 +344,8 @@ class RubyForge
299
344
  def lookup(type, val) # :nodoc:
300
345
  unless Fixnum === val then
301
346
  key = val.to_s
302
- val = @config["rubyforge"]["#{type}_ids"][key]
303
- raise "no <#{type}_id> configured for <#{ key }>" unless val
347
+ val = @autoconfig["#{type}_ids"][key]
348
+ raise "no <#{type}_id> configured for <#{ key }>" unless val
304
349
  end
305
350
  val
306
351
  end
@@ -314,19 +359,17 @@ __END__
314
359
  #
315
360
  # this must be your username
316
361
  #
317
- username : username
362
+ username : username
318
363
  #
319
364
  # this must be your password
320
365
  #
321
- password : password
366
+ password : password
322
367
  #
323
- # defaults for some values
368
+ # defaults for some values
324
369
  #
325
- cookie_jar : #{ COOKIE_F }
370
+ cookie_jar : #{ COOKIE_F }
326
371
  is_private : false
327
- #
328
- # server side rubyforge configuration
329
- #
372
+ # AUTOCONFIG:
330
373
  rubyforge :
331
374
  #
332
375
  # map your group names to their rubyforge ids
@@ -6,13 +6,18 @@ require 'rubyforge'
6
6
  class FakeRubyForge < RubyForge
7
7
  HTML = "blah blah <form action=\"/frs/admin/editrelease.php?group_id=440&release_id=6948&package_id=491\" method=\"post\"> blah blah"
8
8
 
9
- attr_accessor :page, :form, :extheader, :requests
9
+ attr_accessor :page, :form, :extheader, :requests, :scrape
10
10
  def run(page, form, extheader={})
11
11
  @page, @form, @extheader = page, form, extheader
12
12
  @requests ||= []
13
13
  @requests << { :url => page, :form => form, :headers => extheader }
14
14
  HTML
15
15
  end
16
+
17
+ def scrape_project(proj)
18
+ @scrape ||= []
19
+ @scrape << proj
20
+ end
16
21
  end
17
22
 
18
23
  class HTTPAccess2::Client
@@ -31,6 +36,11 @@ class TestRubyForge < Test::Unit::TestCase
31
36
  util_new FakeRubyForge
32
37
  end
33
38
 
39
+ def teardown
40
+ @rubyforge.autoconfig.replace @old_autoconfig
41
+ @rubyforge.save_autoconfig
42
+ end
43
+
34
44
  def test_initialize_bad
35
45
  assert_raise RuntimeError do
36
46
  RubyForge.new(RubyForge::CONFIG_F, "username" => nil)
@@ -49,8 +59,8 @@ class TestRubyForge < Test::Unit::TestCase
49
59
 
50
60
  def test_login
51
61
  u, p = 'fooby', 's3kr3t'
52
- @rubyforge.config['username'] = u
53
- @rubyforge.config['password'] = p
62
+ @rubyforge.userconfig['username'] = u
63
+ @rubyforge.userconfig['password'] = p
54
64
  @rubyforge.login
55
65
 
56
66
  util_run('https://rubyforge.org/account/login.php',
@@ -77,7 +87,6 @@ class TestRubyForge < Test::Unit::TestCase
77
87
  end
78
88
 
79
89
  def test_delete_package_package_name
80
- @rubyforge.config["rubyforge"]["package_ids"]["woot_pkg"] = 666
81
90
  @rubyforge.delete_package(42, "woot_pkg")
82
91
  util_delete_package
83
92
  end
@@ -89,7 +98,6 @@ class TestRubyForge < Test::Unit::TestCase
89
98
  end
90
99
 
91
100
  def test_delete_package_group_name
92
- @rubyforge.config["rubyforge"]["group_ids"]["seattlerb"] = 42
93
101
  @rubyforge.delete_package("seattlerb", 666)
94
102
  util_delete_package
95
103
  end
@@ -101,14 +109,13 @@ class TestRubyForge < Test::Unit::TestCase
101
109
  end
102
110
 
103
111
  def test_add_file
104
- @rubyforge.config["rubyforge"]["group_ids"]["seattlerb"] = 666
105
- @rubyforge.config["rubyforge"]["package_ids"]["ringy_dingy"] = 42
106
- @rubyforge.config["rubyforge"]["release_ids"]["ringy_dingy"] ||= {}
107
- @rubyforge.config["rubyforge"]["release_ids"]["ringy_dingy"]["1.2.3"] = 43
112
+ @rubyforge.autoconfig["package_ids"]["ringy_dingy"] = 314
113
+ @rubyforge.autoconfig["release_ids"]["ringy_dingy"] ||= {}
114
+ @rubyforge.autoconfig["release_ids"]["ringy_dingy"]["1.2.3"] = 43
108
115
 
109
116
  @rubyforge.add_file('seattlerb', 'ringy_dingy', '1.2.3', __FILE__)
110
117
 
111
- util_run('/frs/admin/editrelease.php?group_id=666&release_id=43&package_id=42',
118
+ util_run('/frs/admin/editrelease.php?group_id=42&release_id=43&package_id=314',
112
119
  { "step2" => 1,
113
120
  "type_id" => 9999,
114
121
  "processor_id" => 8000,
@@ -142,7 +149,7 @@ class TestRubyForge < Test::Unit::TestCase
142
149
  "submit" => "Add This File"},
143
150
  :headers => {"content-type"=> "multipart/form-data; boundary=___23__06__24__24__12__01__38__39___"}})
144
151
  expected = [add_release, add_file]
145
-
152
+
146
153
  result = @rubyforge.requests
147
154
  result.each do |r|
148
155
  r[:form].delete "userfile"
@@ -155,7 +162,7 @@ class TestRubyForge < Test::Unit::TestCase
155
162
  @rubyforge.post_news("seattlerb", "my summary", "my news")
156
163
 
157
164
  util_run("/news/submit.php",
158
- "group_id" => 1513,
165
+ "group_id" => 42,
159
166
  "post_changes" => "y",
160
167
  "details" => "my news",
161
168
  "summary" => "my summary",
@@ -163,7 +170,6 @@ class TestRubyForge < Test::Unit::TestCase
163
170
  end
164
171
 
165
172
  def test_add_release_package_name
166
- @rubyforge.config["rubyforge"]["package_ids"]["woot_pkg"] = 666
167
173
  @rubyforge.add_release(42, "woot_pkg", '1.2.3', __FILE__)
168
174
  util_add_release
169
175
  end
@@ -175,7 +181,6 @@ class TestRubyForge < Test::Unit::TestCase
175
181
  end
176
182
 
177
183
  def test_add_release_group_name
178
- @rubyforge.config["rubyforge"]["group_ids"]["seattlerb"] = 42
179
184
  @rubyforge.add_release("seattlerb", 666, '1.2.3', __FILE__)
180
185
  util_add_release
181
186
  end
@@ -197,8 +202,8 @@ class TestRubyForge < Test::Unit::TestCase
197
202
  end
198
203
 
199
204
  def test_lookup_name
200
- @rubyforge.config["rubyforge"]["package_ids"]["ringy_dingy"] = 42
201
- assert_equal 42, @rubyforge.lookup("package", "ringy_dingy")
205
+ @rubyforge.autoconfig["package_ids"]["ringy_dingy"] = 314
206
+ assert_equal 314, @rubyforge.lookup("package", "ringy_dingy")
202
207
  end
203
208
 
204
209
  def test_lookup_undefined
@@ -237,8 +242,22 @@ class TestRubyForge < Test::Unit::TestCase
237
242
 
238
243
  def util_new(klass)
239
244
  @rubyforge = klass.new
240
- @rubyforge.config["release_date"] = "today"
241
- @rubyforge.config["rubyforge"]["type_ids"][".rb"] = 9999
245
+ @old_autoconfig = @rubyforge.autoconfig.dup
246
+
247
+ data = { # REFACTOR
248
+ "group_ids" => {},
249
+ "package_ids" => {},
250
+ "release_ids" => Hash.new { |h,k| h[k] = {} },
251
+ "type_ids" => {},
252
+ "processor_ids" => {"Any"=>8000},
253
+ }
254
+
255
+ @rubyforge.autoconfig.replace data
256
+
257
+ @rubyforge.userconfig["release_date"] = "today"
258
+ @rubyforge.autoconfig["type_ids"][".rb"] = 9999
259
+ @rubyforge.autoconfig["group_ids"]["seattlerb"] = 42
260
+ @rubyforge.autoconfig["package_ids"]["woot_pkg"] = 666
242
261
  end
243
262
 
244
263
  def util_run(page, form={}, extheader={})
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0.7
2
+ rubygems_version: 0.9.0.9
3
3
  specification_version: 1
4
4
  name: rubyforge
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.2
7
- date: 2006-11-29 00:00:00 -08:00
6
+ version: 0.4.0
7
+ date: 2007-01-10 00:00:00 -05:00
8
8
  summary: A simplistic script which automates a limited set of rubyforge operations
9
9
  require_paths:
10
10
  - lib
11
- email: ara.t.howard@noaa.gov
12
- homepage: http://codeforpeople.com/lib/ruby/rubyforge/
13
- rubyforge_project:
14
- description: A simplistic script which automates a limited set of rubyforge operations
11
+ email: ryand-ruby@zenspider.com
12
+ homepage: http://rubyforge.org/projects/codeforpeople
13
+ rubyforge_project: codeforpeople
14
+ description: "A simplistic script which automates a limited set of rubyforge operations * Run 'rubyforge help' for complete usage. * Setup: For first time users AND upgrades to 0.4.0: * rubyforge setup * edit ~/.rubyforge/user-config.yml * rubyforge config * Don't forget to login! logging in will store a cookie in your .rubyforge directory which expires after a time. always run the login command before any operation that requires authentication, such as uploading a package."
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -27,14 +27,16 @@ signing_key:
27
27
  cert_chain:
28
28
  post_install_message:
29
29
  authors:
30
- - Ara T. Howard
30
+ - Ara T Howard
31
+ - Ryan Davis
32
+ - Eric Hodel
31
33
  files:
34
+ - .cvsignore
32
35
  - History.txt
33
36
  - Manifest.txt
34
- - README
37
+ - README.txt
35
38
  - Rakefile
36
39
  - bin/rubyforge
37
- - install.rb
38
40
  - lib/http-access2.rb
39
41
  - lib/http-access2/cookie.rb
40
42
  - lib/http-access2/http.rb
data/install.rb DELETED
@@ -1,174 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'rbconfig'
3
- require 'find'
4
- require 'ftools'
5
- require 'tempfile'
6
- include Config
7
-
8
- LIBDIR = "lib"
9
- LIBDIR_MODE = 0644
10
-
11
- BINDIR = "bin"
12
- BINDIR_MODE = 0755
13
-
14
-
15
- $srcdir = CONFIG["srcdir"]
16
- $version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
17
- $libdir = File.join(CONFIG["libdir"], "ruby", $version)
18
- $archdir = File.join($libdir, CONFIG["arch"])
19
- $site_libdir = $:.find {|x| x =~ /site_ruby$/}
20
- $bindir = CONFIG["bindir"] || CONFIG['BINDIR']
21
- $ruby_install_name = CONFIG['ruby_install_name'] || CONFIG['RUBY_INSTALL_NAME'] || 'ruby'
22
- $ruby_ext = CONFIG['EXEEXT'] || ''
23
- $ruby = File.join($bindir, ($ruby_install_name + $ruby_ext))
24
-
25
- if !$site_libdir
26
- $site_libdir = File.join($libdir, "site_ruby")
27
- elsif $site_libdir !~ %r/#{Regexp.quote($version)}/
28
- $site_libdir = File.join($site_libdir, $version)
29
- end
30
-
31
- def install_rb(srcdir=nil, destdir=nil, mode=nil, bin=nil)
32
- #{{{
33
- path = []
34
- dir = []
35
- Find.find(srcdir) do |f|
36
- next unless FileTest.file?(f)
37
- next if (f = f[srcdir.length+1..-1]) == nil
38
- next if (/CVS$/ =~ File.dirname(f))
39
- path.push f
40
- dir |= [File.dirname(f)]
41
- end
42
- for f in dir
43
- next if f == "."
44
- next if f == "CVS"
45
- File::makedirs(File.join(destdir, f))
46
- end
47
- for f in path
48
- next if (/\~$/ =~ f)
49
- next if (/^\./ =~ File.basename(f))
50
- unless bin
51
- File::install(File.join(srcdir, f), File.join(destdir, f), mode, true)
52
- else
53
- from = File.join(srcdir, f)
54
- to = File.join(destdir, f)
55
- shebangify(from) do |sf|
56
- $deferr.print from, " -> ", File::catname(from, to), "\n"
57
- $deferr.printf "chmod %04o %s\n", mode, to
58
- File::install(sf, to, mode, false)
59
- end
60
- end
61
- end
62
- #}}}
63
- end
64
- def shebangify f
65
- #{{{
66
- open(f) do |fd|
67
- buf = fd.read 42
68
- if buf =~ %r/^\s*#\s*!.*ruby/o
69
- ftmp = Tempfile::new("#{ $$ }_#{ File::basename(f) }")
70
- begin
71
- fd.rewind
72
- ftmp.puts "#!#{ $ruby }"
73
- while((buf = fd.read(8192)))
74
- ftmp.write buf
75
- end
76
- ftmp.close
77
- yield ftmp.path
78
- ensure
79
- ftmp.close!
80
- end
81
- else
82
- yield f
83
- end
84
- end
85
- #}}}
86
- end
87
- def ARGV.switch
88
- #{{{
89
- return nil if self.empty?
90
- arg = self.shift
91
- return nil if arg == '--'
92
- if arg =~ /^-(.)(.*)/
93
- return arg if $1 == '-'
94
- raise 'unknown switch "-"' if $2.index('-')
95
- self.unshift "-#{$2}" if $2.size > 0
96
- "-#{$1}"
97
- else
98
- self.unshift arg
99
- nil
100
- end
101
- #}}}
102
- end
103
- def ARGV.req_arg
104
- #{{{
105
- self.shift || raise('missing argument')
106
- #}}}
107
- end
108
- def linkify d
109
- #--{{{
110
- if test ?d, d
111
- versioned = Dir[ File::join(d, "*-[0-9].[0-9].[0-9].rb") ]
112
- versioned.each{|v| File::copy v, v.gsub(%r/\-[\d\.]+\.rb$/,'.rb')}
113
- end
114
- #--}}}
115
- end
116
-
117
-
118
- #
119
- # main program
120
- #
121
-
122
- libdir = $site_libdir
123
- bindir = $bindir
124
- no_linkify = false
125
- help = false
126
-
127
- usage = <<-usage
128
- #{ File::basename $0 }
129
- -d, --destdir <destdir>
130
- -l, --libdir <libdir>
131
- -b, --bindir <bindir>
132
- -r, --ruby <ruby>
133
- -n, --no_linkify
134
- -h, --help
135
- usage
136
-
137
- begin
138
- while switch = ARGV.switch
139
- case switch
140
- when '-d', '--destdir'
141
- libdir = ARGV.req_arg
142
- when '-l', '--libdir'
143
- libdir = ARGV.req_arg
144
- when '-b', '--bindir'
145
- bindir = ARGV.req_arg
146
- when '-r', '--ruby'
147
- $ruby = ARGV.req_arg
148
- when '-n', '--no_linkify'
149
- no_linkify = true
150
- when '-h', '--help'
151
- help = true
152
- else
153
- raise "unknown switch #{switch.dump}"
154
- end
155
- end
156
- rescue
157
- STDERR.puts $!.to_s
158
- STDERR.puts usage
159
- exit 1
160
- end
161
-
162
- if help
163
- STDOUT.puts usage
164
- exit
165
- end
166
-
167
- unless no_linkify
168
- linkify('lib')
169
- linkify('bin')
170
- end
171
-
172
- install_rb(LIBDIR, libdir, LIBDIR_MODE)
173
- install_rb(BINDIR, bindir, BINDIR_MODE, bin=true)
174
-