Class: XForge::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/xforge/session.rb

Overview

A Session object allows authenticated interaction with a Project, such as releasing files.

A Session object can be obtained via Project.login

Defined Under Namespace

Classes: Processor

Constant Summary collapse

BOUNDARY =
"rubyqMY6QN9bp6e4kS21H4y0zxcvoor"

Instance Method Summary collapse

Constructor Details

#initialize(host, project, cookie) ⇒ Session

:nodoc:



27
28
29
30
31
# File 'lib/xforge/session.rb', line 27

def initialize(host, project, cookie) # :nodoc:
  @host = host
  @project = project
  @headers = { "Cookie" => cookie }
end

Instance Method Details

#package_idObject

The package_id of our project



34
35
36
37
38
39
40
41
42
# File 'lib/xforge/session.rb', line 34

def package_id
  unless(@package_id)
    release_uri = "http://#{@host.name}/frs/admin/?group_id=#{@project.group_id}"
    release_data = open(release_uri, @headers) { |data| data.read }
    @package_id = release_data[/[?&]package_id=(\d+)/, 1]
    raise "Couldn't get package_id" unless @package_id
  end
  @package_id
end

#publish_news(subject, details) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/xforge/session.rb', line 123

def publish_news(subject, details)
  puts "About to publish news"
  puts "Subject: '#{subject}'"
  puts "Details:"
  puts details
  puts ""
  
  release_response = Net::HTTP.start(@host.name, 80) do |http|
    query_hash = {
      "group_id" => @project.group_id,
      "package_id" => package_id,
      "post_changes" => "y",
      "summary" => subject,
      "details" => details
    }
  
    target = "/news/submit.php"
    headers = @headers.merge(
      "Content-Type" => "multipart/form-data"
    )
    http.post(target + query(query_hash), "", headers)

  end
  puts "Done!"
end

#release(release_name, filenames, release_notes = "", release_changes = "", preformatted = true, processor = Processor::ANY) ⇒ Object

Creates a new release containing the files specified by filenames (Array) and named release_name. Optional parameters are processor (which should be one of the Processor constants), release_notes, release_changes and preformatted which will appear on the releas page of the associated project.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/xforge/session.rb', line 48

def release(release_name, filenames, release_notes="", release_changes="", preformatted=true, processor=Processor::ANY)
  release_date = Time.now.strftime("%Y-%m-%d %H:%M")
  release_id = nil

  puts "About to release '#{release_name}'"
  puts "Files:"
  puts "  " + filenames.join("\n  ")
  puts "\nRelease Notes:\n"
  puts release_notes
  puts "\nRelease Changes:\n"
  puts release_changes
  puts "\nRelease Settings:\n"
  puts "Preformatted: #{preformatted}"
  puts "Processor: #{processor}"
  puts "\nStarting release..."

  xfiles = filenames.collect{|filename| XFile.new(filename)}      
  xfiles.each_with_index do |xfile, i|
    first_file = i==0
    puts "Releasing #{xfile.basename}..."

    release_response = Net::HTTP.start(@host.name, 80) do |http|
      query_hash = if first_file then
        {
          "group_id" => @project.group_id,
          "package_id" => package_id,
          "type_id" => xfile.bin_type_id,
          "processor_id" => processor,

          "release_name" => release_name,
          "release_date" => release_date,
          "release_notes" => release_notes,
          "release_changes" => release_changes,
          "preformatted" => preformatted ? "1" : "0",
          "submit" => "1"
        }
      else
        {
          "group_id" => @project.group_id,
          "package_id" => package_id,
          "type_id" => xfile.bin_type_id,
          "processor_id" => processor,

          "step2" => "1",
          "release_id" => release_id,
          "submit" => "Add This File"
        }
      end

      query = query(query_hash)

      data = [
        "--" + BOUNDARY,
        "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{xfile.basename}\"",
        "Content-Type: application/octet-stream",
        "Content-Transfer-Encoding: binary",
        "", xfile.data, ""
        ].join("\x0D\x0A")

      headers = @headers.merge(
        "Content-Type" => "multipart/form-data; boundary=#{BOUNDARY}"
      )

      target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
      http.post(target + query, data, headers)
    end

    if first_file then
      release_id = release_response.body[/release_id=(\d+)/, 1]
      raise("Couldn't get release id") unless release_id
    end
  end
  puts "Done!"
end