Class: RubyBugzilla

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_bugzilla.rb,
lib/ruby_bugzilla/version.rb

Constant Summary collapse

CLONE_FIELDS =
[:assigned_to, :cc, :cf_devel_whiteboard, :cf_internal_whiteboard, :component,
:groups, :keywords, :op_sys, :platform, :priority, :product, :qa_contact, :severity,
:summary, :target_release, :url, :version, :whiteboard, :comments, :description,]
CMD =
`which bugzilla`.chomp
COOKIES_FILE =
File.expand_path('~/.bugzillacookies')
VERSION =
"0.5.2"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bugzilla_uri, username, password) ⇒ RubyBugzilla

Returns a new instance of RubyBugzilla.

Raises:

  • (ArgumentError)


27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/ruby_bugzilla.rb', line 27

def initialize(bugzilla_uri, username, password)
  raise "python-bugzilla not installed" unless installed?
  raise ArgumentError, "username and password must be set" if username.nil? || password.nil?

  self.bugzilla_uri = bugzilla_uri
  self.username     = username
  self.password     = password
  self.xmlrpc       = ::XMLRPC::Client.new(bugzilla_request_hostname, '/xmlrpc.cgi', 443, nil,
    nil, username, password, true, 60)

  
end

Instance Attribute Details

#bugzilla_request_hostnameObject (readonly)

Returns the value of attribute bugzilla_request_hostname.



19
20
21
# File 'lib/ruby_bugzilla.rb', line 19

def bugzilla_request_hostname
  @bugzilla_request_hostname
end

#bugzilla_request_uriObject (readonly)

Returns the value of attribute bugzilla_request_uri.



19
20
21
# File 'lib/ruby_bugzilla.rb', line 19

def bugzilla_request_uri
  @bugzilla_request_uri
end

#bugzilla_uriObject

Returns the value of attribute bugzilla_uri.



18
19
20
# File 'lib/ruby_bugzilla.rb', line 18

def bugzilla_uri
  @bugzilla_uri
end

#last_commandObject

Returns the value of attribute last_command.



18
19
20
# File 'lib/ruby_bugzilla.rb', line 18

def last_command
  @last_command
end

#passwordObject

Returns the value of attribute password.



18
19
20
# File 'lib/ruby_bugzilla.rb', line 18

def password
  @password
end

#usernameObject

Returns the value of attribute username.



18
19
20
# File 'lib/ruby_bugzilla.rb', line 18

def username
  @username
end

#xmlrpcObject

Returns the value of attribute xmlrpc.



18
19
20
# File 'lib/ruby_bugzilla.rb', line 18

def xmlrpc
  @xmlrpc
end

Class Method Details

.installed?Boolean

Returns:

  • (Boolean)


14
15
16
# File 'lib/ruby_bugzilla.rb', line 14

def self.installed?
  File.exists?(CMD)
end

Instance Method Details

#clear_login!Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ruby_bugzilla.rb', line 48

def clear_login!
  cookies_file_entry = "HttpOnly_.#{bugzilla_request_hostname}"

  if File.exists?(COOKIES_FILE)
    Tempfile.open('ruby_bugzilla') do |out_file|
      File.read(COOKIES_FILE).each_line do |line|
        out_file.puts(line) unless line.include?(cookies_file_entry)
      end
      out_file.close()
      FileUtils.mv(out_file.path, COOKIES_FILE)
    end
  end
end

#clone(bug_id, overrides = {}) ⇒ Fixnum

Clone of an existing bug

Example:

# Perform a clone of an existing bug, and return the new bug ID.
bz.clone(948970)

Parameters:

  • bug_id (String, Fixnum)

    A single bug id to process.

  • overrides (Hash) (defaults to: {})

    The properties to change from the source bug. Some properties include

    • :target_release - The target release for the new cloned bug.

    • :assigned_to - The person to assign the new cloned bug to.

Returns:

  • (Fixnum)

    The bug id to the new, cloned, bug.

Raises:

  • (ArgumentError)


145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/ruby_bugzilla.rb', line 145

def clone(bug_id, overrides={})
  raise ArgumentError, "bug_id must be numeric" unless bug_id.to_s =~ /^\d+$/ 

  existing_bz = xmlrpc_bug_query(bug_id)

  clone_description, clone_comment_is_private = assemble_clone_description(existing_bz)

  params = {}
  CLONE_FIELDS.each do |field|
    next if field == :comments 
    params[field] = existing_bz[field.to_s]
  end

  # Apply overrides
  overrides.each do |param, value|
    params[param] = value
  end

  # Apply base clone fields
  params[:cf_clone_of]        = bug_id
  params[:description]        = clone_description
  params[:comment_is_private] = clone_comment_is_private

  execute_xmlrpc('create', params)[:id.to_s]
end

#inspectObject



40
41
42
# File 'lib/ruby_bugzilla.rb', line 40

def inspect
  super.gsub(/@password=\".+?\", /, "")
end

#installed?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/ruby_bugzilla.rb', line 44

def installed?
  self.class.installed?
end

#loginObject



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/ruby_bugzilla.rb', line 62

def 
  params = {}
  params["--debug"] = nil
  params["login"]   = [username, password]

  begin
    execute_shell(params)
  rescue
    clear_login! # A failed login attempt could result in a corrupt COOKIES_FILE
    raise
  end
end

#modify(bug_ids, options) ⇒ String

Modify an existing bug or set of bugs

Examples:

# Set the status of multiple bugs to RELEASE_PENDING
bz.modify([948970, 948971], :status => "RELEASE_PENDING")

# Add a comment
bz.modify("948972", :comment => "whatevs")

# Set the status to POST and add a comment
bz.modify(948970, :status => "POST", :comment => "Fixed in shabla")

Parameters:

  • bug_ids (String, Integer, Array<String>, Array<Integer>)

    The bug id or ids to process.

  • options (Hash)

    The properties to change. Some properties include

    • :status - The bug status, such as NEW, ASSIGNED, etc.

    • :comment - Add a comment

Returns:

  • (String)

    The command output

Raises:

  • (ArgumentError)


122
123
124
125
126
127
128
129
130
131
132
# File 'lib/ruby_bugzilla.rb', line 122

def modify(bug_ids, options)
  bug_ids = Array(bug_ids)
  raise ArgumentError, "bug_ids and options must be specified" if bug_ids.empty? || options.empty?
  raise ArgumentError, "bug_ids must be numeric" unless bug_ids.all? {|id| id.to_s =~ /^\d+$/ }

  params = {}
  params["modify"] = bug_ids
  set_params_options(params, options)

  execute_shell(params)
end

#query(options) ⇒ String

Query for existing bugs

Example:

# Query for all NEW bugs, and return the output in a specific format.
puts bz.query(
  :bug_status   => "NEW",
  :outputformat => "BZ_ID: %{id} STATUS: %{bug_status} SUMMARY: %{summary}"
)
# BZ_ID: 1234 STATUS: NEW SUMMARY: Something went wrong.
# BZ_ID: 1235 STATUS: NEW SUMMARY: Another thing went wrong.

Parameters:

  • options (Hash)

    Query options. Some possible values are:

    • :product - A specific product to limit the query against

    • :flag - Comma separated list of flags

    • :bug_status - Comma separated list of bug statuses, such as NEW, ASSIGNED, etc.

    • :outputformat - A string that will be used to format each line of output, with %{} as the interpolater.

Returns:

  • (String)

    The command output

Raises:

  • (ArgumentError)


94
95
96
97
98
99
100
101
102
# File 'lib/ruby_bugzilla.rb', line 94

def query(options)
  raise ArgumentError, "options must be specified" if options.empty?

  params = {}
  params["query"] = nil
  set_params_options(params, options)

  execute_shell(params)
end

#xmlrpc_bug_query(bug_id) ⇒ Fixnum

XMLRPC Bug Query of an existing bug

Example:

# Perform an xmlrpc query for a single bug.
bz.xmlrpc_bug_query(948970)

Parameters:

  • bug_id (String, Fixnum)

    A single bug id to process.

Returns:

  • (Fixnum)

    The bug id to the new, cloned, bug.

Raises:

  • (ArgumentError)


179
180
181
182
183
184
185
186
187
188
189
# File 'lib/ruby_bugzilla.rb', line 179

def xmlrpc_bug_query(bug_id)
  raise ArgumentError, "bug_id must be numeric" unless bug_id.to_s =~ /^\d+$/ 

  params = {}
  params[:Bugzilla_login]    = username
  params[:Bugzilla_password] = password
  params[:ids]               = bug_id
  params[:include_fields]    = CLONE_FIELDS

  execute_xmlrpc('get', params)['bugs'].last
end