Class: Reap::Rubyforge
- Inherits:
-
Object
- Object
- Reap::Rubyforge
- Includes:
- FileUtils
- Defined in:
- lib/reap/systems/rubyforge.rb
Overview
Interface with the RubyForge hosting service. Currently supports functions:
* release - Upload release packages.
* publish - Upload website files.
* announce - Post news announcement.
* touch - Test connection.
Constant Summary collapse
- COOKIEJAR =
File::join(Dir.tmpdir, 'reap', 'cookie.dat')
- REPORT =
/<h\d><span style="color:red">(.*?)<\/span><\/h\d>/
Instance Attribute Summary collapse
-
#group_id ⇒ Object
Project’s group id number.
-
#project ⇒ Object
Project name.
-
#uri ⇒ Object
readonly
URI = http:// + domain name TODO Deal with https, and possible other protocols too.
-
#username ⇒ Object
Username to use for project account.
Instance Method Summary collapse
-
#commands ⇒ Object
What commands does this host support.
-
#domain ⇒ Object
Domain name of host.
- #dryrun? ⇒ Boolean
-
#initialize(options) ⇒ Rubyforge
constructor
New RubyForge tasks.
-
#login ⇒ Object
Login to website.
-
#logout ⇒ Object
Logout of website.
-
#post(options) ⇒ Object
Submit a news item.
-
#release(options) ⇒ Object
Upload release packages to hosting service.
-
#siteroot ⇒ Object
Website location on server.
-
#touch(options = {}) ⇒ Object
Touch base with server – login and logout.
- #trace? ⇒ Boolean
Constructor Details
#initialize(options) ⇒ Rubyforge
New RubyForge tasks.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/reap/systems/rubyforge.rb', line 54 def initialize() = .dup.rekey @dryrun = [:dryrun] @trace = [:trace] #@domain = options[:domain] || default_domain @uri = URI.parse("http://" + domain) @username = [:username] || ENV['RUBYFORGE_USERNAME'] @password = [:password] mkdir_p(File.dirname(COOKIEJAR)) @cookie_jar = COOKIEJAR @project = [:project] @group_id = [:group_id] || [:groupid] @package_ids = {} @release_ids = {} @file_ids = {} load_project end |
Instance Attribute Details
#group_id ⇒ Object
Project’s group id number.
109 110 111 |
# File 'lib/reap/systems/rubyforge.rb', line 109 def group_id @group_id end |
#project ⇒ Object
Project name.
106 107 108 |
# File 'lib/reap/systems/rubyforge.rb', line 106 def project @project end |
#uri ⇒ Object (readonly)
URI = http:// + domain name TODO Deal with https, and possible other protocols too.
41 42 43 |
# File 'lib/reap/systems/rubyforge.rb', line 41 def uri @uri end |
#username ⇒ Object
Username to use for project account.
45 46 47 |
# File 'lib/reap/systems/rubyforge.rb', line 45 def username @username end |
Instance Method Details
#commands ⇒ Object
What commands does this host support.
101 102 103 |
# File 'lib/reap/systems/rubyforge.rb', line 101 def commands %w{ touch release publish post } end |
#domain ⇒ Object
Domain name of host. Must be overriden by adapter.
49 50 51 |
# File 'lib/reap/systems/rubyforge.rb', line 49 def domain raise "Missing Domain" end |
#dryrun? ⇒ Boolean
79 80 81 |
# File 'lib/reap/systems/rubyforge.rb', line 79 def dryrun? @dryrun end |
#login ⇒ Object
Login to website.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/reap/systems/rubyforge.rb', line 116 def login # :yield: page = @uri + "/account/login.php" page.scheme = 'https' page = URI.parse(page.to_s) # set SSL port correctly form = { "return_to" => "", "form_loginname" => username, "form_pw" => password, "login" => "Login with SSL" } html = http_post(page, form) unless html[/Personal Page/] puts "Login failed." re1 = Regexp.escape(%{<h2 style="color:red">}) re2 = Regexp.escape(%{</h2>}) html[/#{re1}(.*?)#{re2}/] raise $1 end if block_given? begin yield ensure logout end end end |
#logout ⇒ Object
Logout of website.
148 149 150 151 152 |
# File 'lib/reap/systems/rubyforge.rb', line 148 def logout page = "/account/logout.php" form = {} http_post(page, form) end |
#post(options) ⇒ Object
Submit a news item.
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
# File 'lib/reap/systems/rubyforge.rb', line 316 def post() = .rekey if file = [:file] text = File.read(file).strip i = text.index("\n") subject = text[0...i].strip = text[i..-1].strip else subject = [:subject] = [:message] || [:body] end if dryrun? puts "\nSUBJECT: #{subject}" puts "\n#{}\n\n" else post_news(subject, ) puts "News item posted!" end end |
#release(options) ⇒ Object
Upload release packages to hosting service.
This task releases files to RubyForge –it should work with other GForge instaces or SourceForge clones too.
While defaults are nice, you may want a little more control. You can specify additional attributes:
files package files to release.
exclude Package formats to exclude from files.
(from those created by pack)
project Project name on host.
package Package to which this release belongs (defaults to project)
release Release name (default is version number)
version Version of release
date Date of release (defaults to Time.now)
processor Processor/Architecture (any, i386, PPC, etc.)
is_public Public release? (defualts to true)
changelog Change log file
notelog Release notes file
The release option can be a template by using %s in the string. The version number of your project will be sub’d in for the %s. This saves you from having to update the release name before every release.
– What about releasing a pacman PKGBUILD? ++
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
# File 'lib/reap/systems/rubyforge.rb', line 193 def release() = .rekey version = [:version] changelog = [:changelog] notelog = [:notelog] project = [:project] || @project package = [:package] || project release = [:release] || version name = [:name] || package files = [:file] || [] date = [:date] || Time::now.strftime('%Y-%m-%d %H:%M') processor = [:processor] || 'Any' store = [:store] || 'pkg' is_public = [:is_public].nil? ? true : [:is_public] raise ArgumentError, "missing group_id" unless group_id raise ArgumentError, "missing project" unless project raise ArgumentError, "missing package" unless package raise ArgumentError, "missing release" unless release if files.empty? files = Dir[File.join(store, '*')].select do |file| /#{version}[.]/ =~ file end #files = Dir.glob(File.join(store,"#{name}-#{version}*")) end files = files.select{ |f| File.file?(f) } abort "No package files." if files.empty? files.each do |file| abort "Not a file -- #{file}" unless File.exist?(file) puts "Release file: #{file}" end # which package types #rtypes = [ 'tgz', 'tbz', 'tar.gz', 'tar.bz2', 'deb', 'gem', 'ebuild', 'zip' ] #rtypes -= exclude #rtypes = rtypes.collect{ |rt| Regexp.escape( rt ) } #re_rtypes = Regexp.new('[.](' << rtypes.join('|') << ')$') puts "Releasing #{package} #{release}..." #unless options['quiet'] login do unless package_id = package?(package) #unless options['force'] q = "Package '#{package}' does not exist. Create?" a = ask(q, 'yN') abort "Task canceled." unless ['y', 'yes', 'okay'].include?(a.downcase) #end puts "Creating package #{package}..." abort "Cannot continue in dry-run mode." if dryrun? create_package(package, is_public) unless package_id = package?(package) raise "Package creation failed." end end if release_id = release?(release, package_id) #unless options[:force] q = "Release #{release} already exists. Re-release?" a = ask(q, 'yN') abort "Task canceled." unless ['y', 'yes', 'okay'].include?(a.downcase) #puts "Use -f option to force re-release." #return #end files.each do |file| fname = File.basename(file) if file_id = file?(fname, package) puts "Removing file #{fname}..." remove_file(file_id, release_id, package_id) unless dryrun? end puts "Adding file #{fname}..." add_file(file, release_id, package_id, processor) unless dryrun? end else puts "Adding release #{release}..." unless dryrun? add_release(release, package_id, files, :processor => processor, :release_date => date, :release_changes => changelog, :release_notes => notelog, :preformatted => '1' ) unless release_id = release?(release, package_id) raise "Release creation failed." end end #files.each do |file| # puts "Added file #{File.basename(file)}." #end end end puts "Release complete!" end |
#siteroot ⇒ Object
Website location on server.
95 96 97 |
# File 'lib/reap/systems/rubyforge.rb', line 95 def siteroot "/var/www/gforge-projects" end |
#touch(options = {}) ⇒ Object
Touch base with server – login and logout.
156 157 158 159 160 161 |
# File 'lib/reap/systems/rubyforge.rb', line 156 def touch(={}) login puts "Group ID: #{group_id}" puts "Login/Logout successful." logout end |
#trace? ⇒ Boolean
83 84 85 |
# File 'lib/reap/systems/rubyforge.rb', line 83 def trace? @trace end |