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
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
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
- 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, tag, owner, bugs.
- 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.
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
#!/usr/bin/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.
#!/usr/bin/env perl
# 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 = 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);
#!/usr/bin/env perl
# 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
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 def get_status(*args):
10 result = server.get_status(*args)
11 return result
12
13 def get_bugs(*args):
14 result = server.get_bugs(*args)
15 return result
16
17 def get_usertag(email, *tags):
18 result = server.get_usertag(email, *tags)
19 return result
20
21 def get_bug_log(bugnumber):
22 result = server.get_bug_log(bugnumber)
23 return result
24
25 def newest_bugs(amount):
26 result = server.newest_bugs(amount)
27 return result
28
29 if __name__ == "__main__":
30 # Demonstration
31
32 # some debug output
33 server.config.dumpSOAPOut = 1
34 server.config.dumpSOAPIn = 1
35
36 # All bugs from one package (returns a list of bugnumbers)
37 print get_bugs("package", "gtk-qt-engine")
38
39 # All bugs of a maintainer
40 print get_bugs("maint", "debian-qa@lists.debian.org")
41
42 # returns the status of those bugs
43 print get_status(409909, 419920, 421581, 417044, 397993)
44
45 # get_status and get_bugs combined:
46 print get_status(get_bugs("package", "gtk-qt-engine"))
47
48 # returns the full log for the given bug number
49 print get_bug_log(202526)
50
51 # retrives the newest 20 bugs
52 print newest_bugs(20)
53
54 # All bugs of a maintainer
55 print get_bugs("maint", "debian-qa@lists.debian.org")
56
57 # returns the status of those bugs
58 print get_status(409909, 419920, 421581, 417044, 397993)
59
60 # get_status and get_bugs combined:
61 print get_status(get_bugs("package", "gtk-qt-engine"))
62
63 # returns the full log for the given bug number
64 print get_bug_log(202526)
65
66 # retrives the newest 20 bugs
67 print newest_bugs(20)
68
69 # returns bugs tagged by the given email
70 print get_usertag("debian-qa@lists.debian.org")
71
72 # returns bugs tagged by the given email, with the given tag
73 print get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708")
Ruby
#!/usr/bin/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']))
PHP
<?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_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>";
}
?>