This page provides information on the SOAP interface to the BTS
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.
https://git.savannah.gnu.org/cgit/emacs/elpa.git/plain/Debbugs.wsdl?h=externals/debbugs
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
1 #!/usr/bin/python3
2
3 import debianbts
4
5 if __name__ == "__main__":
6 # Demonstration
7
8 # All bugs from one package (returns a list of bugnumbers)
9 print(debianbts.get_bugs(package="gtk-qt-engine"))
10
11 # All bugs of a maintainer
12 print(debianbts.get_bugs(maint="debian-qa@lists.debian.org"))
13
14 # returns the status of those bugs
15 print(debianbts.get_status([409909, 419920, 421581, 417044, 397993]))
16
17 # get_status and get_bugs combined:
18 print(debianbts.get_status(debianbts.get_bugs(package="gtk-qt-engine")))
19
20 # returns the full log for the given bug number
21 print(debianbts.get_bug_log(202526))
22
23 # retrieves the newest 20 bugs
24 print(debianbts.newest_bugs(20))
25
26 # returns bugs tagged by the given email
27 print(debianbts.get_usertag("debian-qa@lists.debian.org"))
28
29 # returns bugs tagged by the given email, with the given tag
30 print(debianbts.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); ?>