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 (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.
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

originator

String

Who sent the bugreport

date

DateTime

subject

String

msgid

String

package

String

tags

Whitespace seperated List of Strings

done

Boolean

forwarded

String

some URL, sometimes an email address

mergedwith

Integer when one Bugnumber, empty String when empty, should be a list of ?? if merged with more than one bug?

severity

String

owner

found_versions

List of Strings

Version Numbers

found_date

found

Dict

Not fully implemented in debbugs, use found_versions for now

fixed_versions

List of Strings

Version Numbers

fixed_date

fixed

Dict

Not fully implemented in debbugs, use fixed_versions for now

blocks

Sometimes an int sometimes a string

blockedby

unarchived

Boolean

summary

String

Seems to be empty all the times

affects

log_modified

location

archived

Boolean

bug_num

Integer

The Bugnumber

id

Integer

Superflouus, use bug_num, id will vanish in future versions according to Don

source

String

keywords

pending

String

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/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

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>";
}
?>

FAQ

See also