Debbugs' SOAP Interface Documentation
This documentation will likely always be slightly behind the extant documentation in the Debbugs::SOAP module. However, feel free to update it when they begin to differ.
Please help to keep this documentation up to date!
URL and Namespace,WSDL
http://bugs.debian.org/cgi-bin/soap.cgi is the official SOAP interface for Debian's BTS.
http://bugs.donarmstrong.com/cgi-bin/soap.cgi is the development version.
The namespace is Debbugs/SOAP
The WSDL for Debbugs (Debbugs.wsdl) is available from here.
http://git.savannah.gnu.org/cgit/emacs/elpa.git/plain/packages/debbugs/Debbugs.wsdl
Available methods for bugs.debian.org
http://bugs.debian.org/debbugs-source/mainline/Debbugs/SOAP.pm
- get_status(bugnumber [, bugnumber]*)
- returns the status of the given bugs (see attributes list bellow)
- get_bugs(key, value[, key, value]*)
- returns bugs that match the conditions given by key-value pair. Possible keys: package, submitter, maint, src, severity, status (which can be 'done', 'forwarded', 'open'), tag, owner, bugs, affects, archive (which can be 'both', or a Boolean value).
- get_usertag(email [, tag]*)
- returns bugs tagged by the email. All of them, or only those tagged with the selected tags, if tags are explicitly given.
- get_bug_log(bugnumber)
- returns the whole bug log, divided in headers and bodies.
- newest_bugs(amount)
- returns a list of the newest bugs.
- get_versions(package, dist, arch)
- Returns a list of the versions of package in the distributions and architectures listed. This routine only returns unique values.
get_status attributes returned
Bug attributes returned by get_status are :
Attribute |
Type |
Meaning |
bug_num |
Integer |
The bugnumber |
severity |
String |
Severity of the bugreport |
tags |
List of Strings |
Tags of the bugreport |
subject |
String |
Subject/Title of the bugreport |
originator |
String |
Submitter of the bugreport |
mergedwith |
List of Integers [*] |
The bugs this bug was merged with |
package |
String |
Package of the Bugreport |
source |
String |
Source package of the Bugreport |
date |
Date of bug creation |
|
log_modified |
Date of last update |
|
done |
String |
Maintainer who closed the bug, or empty string if it's not closed |
archived |
Boolean |
The bug is archived or not |
unarchived |
Boolean |
Has the bug been unarchived and can be archived again |
fixed_versions |
List of Strings |
Version Numbers, can be empty even if the bug is fixed |
found_versions |
List of Strings |
Version Numbers |
forwarded |
String |
some URL, sometimes an email address |
blocks |
List of Integers [*] |
Bugreports this bug blocks |
blockedby |
List of Integers [*] |
Bugreports this bug is blocked by |
pending |
String |
Either 'pending' or 'done' |
msgid |
String |
Message ID of the bugreport |
owner |
String |
default: empty, otherwise: who is responsible for fixing |
location |
String |
Always 'db-h' or 'archive' |
affects |
List of Strings |
Packagenames, see 'affects'-field in control-BTS manual |
summary |
String |
Arbitrary text |
Don't use the ones below |
||
keywords |
List of Strings |
Copy of 'tags' |
fixed_date |
empty for now |
|
found_date |
empty for now |
|
id |
Integer |
Will vanish in future versions, use bug_num |
found |
Dict |
Not fully implemented in debbugs, use found_versions for now |
fixed |
Dict |
Not fully implemented in debbugs, use fixed_versions for now |
[*]: The List of Integers as returned e.g. with mergedwith is not an array or arrayref or the like but a simple string. If more than one bug number is returned, they are simply delimited with space. Examples: '' (empty field), '640045' (one bug number), '499948 499949 499955 499958 499959 499961 499962' (multiple bug numbers)
Available methods for bugs.donarmstrong.com
http://bzr.donarmstrong.com/debbugs/source/Debbugs/SOAP.pm
Currently the same as the one in bugs.debian.org
Examples
Perl
use warnings;
use strict;
use Data::Dumper;
use SOAP::Lite;
my $soap = SOAP::Lite->uri('Debbugs/SOAP')->proxy('http://bugs.debian.org/cgi-bin/soap.cgi');
print Dumper($soap->get_bugs(package=>'debbugs')->result());
print Dumper($soap->get_status(400000)->result());
print Dumper($soap->get_status(400000)->result());
# et al.# get all the bugs tagged with a certain usertag for a package
use SOAP::Lite;
use Data::Dumper;
my $c = new SOAP::Lite->uri('/Debbugs/SOAP')->proxy('http://bugs.debian.org/cgi-bin/soap.cgi');
my $usertags = $c->get_usertag('debian-qa@lists.debian.org')->result();
my $bugs = $c->get_bugs(usertags=>$usertags,tag=>'qa-ftbfs-20070708',package=>'tilp')->result();
print Dumper($bugs);# get all bugs for a given usertag and then select the bug for a
# certain package. Same as above probably a bit faster at times.
# $inf will contain all information about the bug such as
# subject, tags, severity ...
use SOAP::Lite;
use Data::Dumper;
my $c = new SOAP::Lite->uri('/Debbugs/SOAP')->proxy('http://bugs.debian.org/cgi-bin/soap.cgi');
my $bugs = $c->get_usertag('debian-qa@lists.debian.org','qa-ftbfs-20070708')->result;
my $bug = $c->get_bugs('bugs', $bugs->{'qa-ftbfs-20070708'}, 'package', 'tilp')->result;
my $inf = $c->get_status($bug)->result;
print Dumper($inf);The following example was provided by DavidMorenoGarza:
# [...] snip [...]
my $soap = SOAP::Lite->uri('Debbugs/SOAP')->proxy('http://bugs.donarmstrong.com/cgi-bin/soap.cgi');
my $latest_bug = $soap->newest_bugs(1)->result();
print "Latest bug: $latest_bug->[0]\n";
if($cache > $latest_bug->[0]) {
print "No news.\n";
$_[KERNEL]->delay(soap_check => $delay);
return;
}
my $rc_bugs = $soap->get_bugs(
bugs => [$cache..$latest_bug->[0]],
severity => [qw(serious grave critical)]
)->result();
foreach my $bug(sort @$rc_bugs) {
my $text = "#$bug: ";
my $info = $soap->get_status($bug)->result->{$bug};
$text .= $info->{subject};
$text .= " - package: $info->{package}";
$text .= " - severity: $info->{severity}";
$text .= " - tags: $info->{tags}" if $info->{tags};
$text .= " - date: ".scalar(gmtime($info->{date}));
$text .= " - submitter: $info->{originator}";
$text .= " - http://bugs.debian.org/$bug";
$irc->yield(notice => $channel, $text);
}
Python
There is no SOAPpy module for python3
1 #!/usr/bin/python
2
3 import SOAPpy
4
5 url = 'http://bugs.debian.org/cgi-bin/soap.cgi'
6 namespace = 'Debbugs/SOAP'
7 server = SOAPpy.SOAPProxy(url, namespace)
8
9 if __name__ == "__main__":
10 # Demonstration
11
12 # some debug output
13 server.config.dumpSOAPOut = 1
14 server.config.dumpSOAPIn = 1
15
16 # All bugs from one package (returns a list of bugnumbers)
17 print server.get_bugs("package", "gtk-qt-engine")
18
19 # All bugs of a maintainer
20 print server.get_bugs("maint", "debian-qa@lists.debian.org")
21
22 # returns the status of those bugs
23 print server.get_status(409909, 419920, 421581, 417044, 397993)
24
25 # get_status and get_bugs combined:
26 print server.get_status(server.get_bugs("package", "gtk-qt-engine"))
27
28 # returns the full log for the given bug number
29 print server.get_bug_log(202526)
30
31 # retrieves the newest 20 bugs
32 print server.newest_bugs(20)
33
34 # returns bugs tagged by the given email
35 print server.get_usertag("debian-qa@lists.debian.org")
36
37 # returns bugs tagged by the given email, with the given tag
38 print server.get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708")
Ruby
require 'soap/rpc/driver'
host = "bugs.debian.org"
port = 80
server="http://#{host}:#{port}/cgi-bin/soap.cgi"
ns = 'Debbugs/SOAP/'
drv = SOAP::RPC::Driver.new(server, ns)
drv.wiredump_dev = STDOUT if $DEBUG
drv.add_method('get_status','bugnumber')
drv.add_method('get_bugs','keyparam')
p drv.get_status(drv.get_bugs(['package', 'pbuilder', 'severity', 'wishlist']))Here is an example which use 'savon'.
require "savon"
wsdl_url = "http://git.savannah.gnu.org/cgit/emacs/elpa.git/plain/packages/debbugs/Debbugs.wsdl"
client = Savon.client(wsdl: wsdl_url,
endpoint: "http://bugs.debian.org/cgi-bin/soap.cgi",
namespace: "Debbugs/SOAP")
response = client.call(:get_bugs) do
message(query: ['package', 'pbuilder', 'severity', 'wishlist'])
end
bug_numbers = response.body[:get_bugs_response][:array][:item]
bug_numbers.each do |bugnumber|
p bugnumber
end
PHP
<?php
$bugnumber=702669;
$client = new SoapClient(NULL,
array('location' => "http://bugs.debian.org/cgi-bin/soap.cgi",
'uri' => "Debbugs/SOAP",
'proxy_host' => "http://bugs.debian.org"));
$response = $client->__soapCall("get_status", array('bug'=>$bugnumber));
$obj = $response[$bugnumber];
?>
<table border=1>
<tr>
<td>Originator
</td>
<td><?php echo $obj->originator?></td>
</tr>
<tr>
<td>Found in</td>
<td><?php echo implode(" ",$obj->found_versions); ?></td>
</tr>
</table>Use var_dump to get the full list of variables available:
var_dump($obj);
To get details of all bugs with a specific usertag (in this case, crossbuilt):
<?php
$tag = 'crossbuilt';
$email='codehelp@debian.org';
$client = new SoapClient(NULL,
array('location' => "http://bugs.debian.org/cgi-bin/soap.cgi",
'uri' => "Debbugs/SOAP",
'proxy_host' => "http://bugs.debian.org"));
$response = $client->__soapCall("get_usertag", array('email'=>$email,'tag'=>$tag));
$obj_list = ($response->$tag);
while ($obj_list)
{
$bugnumber = array_pop($obj_list);
try
{
$bugresponse = $client->__soapCall("get_status", array('bug'=>$bugnumber));
}
catch (Exception $e)
{
print "Unable to get status for bug #";
print "<a href=\"http://bugs.debian.org/$bugnumber\">$bugnumber</a><br/>\n";
continue;
}
$bugobj = $bugresponse[$bugnumber];
echo "<pre>";
echo "Number: $bugnumber\n";
echo "Subject: $bugobj->subject\n";
echo "Package: $bugobj->package\n";
echo "Originator: $bugobj->originator\n";
$bugdate = date("c", $bugobj->date);
echo "Date: $bugdate\n";
$modified = date("c", $bugobj->log_modified);
echo "Modified: $modified\n";
if ($bugobj->done) { echo "Done: $bugobj->done\n"; }
if ($bugobj->fixed) { echo "Done: $bugobj->fixed\n"; }
$found = implode(" ",$bugobj->found_versions);
echo "Found in: $found\n";
if ($bugobj->fixed_versions)
{
$fixed_ver = implode (" ", $bugobj->fixed_versions);
echo "Fixed in: $fixed_ver\n";
}
if ($bugobj->mergedwith)
{
$merged = implode (" ", $bugobj->mergedwith);
echo "Merged with: $merged\n";
}
echo "</pre>";
}
?>To pass more than one parameter you have to use an array without keys. Example:
<?php
$client = new SoapClient(NULL,
array('location' => "http://bugs.debian.org/cgi-bin/soap.cgi",
'uri' => "Debbugs/SOAP",
'proxy_host' => "http://bugs.debian.org"));
$response = $client->__soapCall("get_versions", array('package','iceweasel','dist','stable','arch','amd64'));
var_dump($response);
$response = $client->__soapCall("get_versions", array('package','iceweasel','dist','unstable','arch','amd64'));
var_dump($response);
?>In the case of passing more than one parameter to get_status you have to wrap this array inside other. Example:
<?php
$bugnumber=702669;
$client = new SoapClient(NULL,
array('location' => "http://bugs.debian.org/cgi-bin/soap.cgi",
'uri' => "Debbugs/SOAP",
'proxy_host' => "http://bugs.debian.org"));
$response = $client->__soapCall("get_status", array(array('bug',$bugnumber,'dist','stable')));
$obj = $response[$bugnumber];
var_dump($obj);
?>
FAQ
