Differences between revisions 42 and 75 (spanning 33 versions)
Revision 42 as of 2009-10-14 21:41:00
Size: 10064
Editor: ?BastianVenthur
Comment:
Revision 75 as of 2021-02-25 00:18:04
Size: 12313
Editor: ColinWatson
Comment: update WSDL URL
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Debbugs' SOAP Interface Documentation = This page provides information on the [[WikiPedia:SOAP]] interface to the [[BTS]]
Line 9: Line 9:
== URL and Namespace == == URL and Namespace,WSDL ==
Line 17: Line 17:
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
Line 22: Line 26:
 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_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).
Line 33: Line 37:
||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||
||mergedwith||Integer when one Bugnumber, empty String when empty, should be a list of ?? if merged with more than one bug?||||
||severity||String||||
||owner||||||
||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||DateTime||Date of bug creation||
||log_modified||DateTime||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||
Line 45: Line 52:
||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||||||
||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||||
||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||
||||||<#FF0000>Don't use the ones below||
||keywords||List of Strings||Copy of 'tags'||
||--(fixed_date)--||DateTime||empty for now||
||--(found_date)--||DateTime||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)
Line 156: Line 162:
{{{#!wiki caution
There is no SOAPpy module for python3
}}}
Line 166: Line 175:
def get_status(*args):
    result = server.get_status(*args)
    return result

def get_bugs(*args):
    result = server.get_bugs(*args)
    return result

def get_usertag(email, *tags):
    result = server.get_usertag(email, *tags)
    return result

def get_bug_log(bugnumber):
    result = server.get_bug_log(bugnumber)
    return result

def newest_bugs(amount):
    result = server.newest_bugs(amount)
    return result
Line 194: Line 183:
    print get_bugs("package", "gtk-qt-engine")     print server.get_bugs("package", "gtk-qt-engine")
Line 197: Line 186:
    print get_bugs("maint", "debian-qa@lists.debian.org")     print server.get_bugs("maint", "debian-qa@lists.debian.org")
Line 200: Line 189:
    print get_status(409909, 419920, 421581, 417044, 397993)     print server.get_status(409909, 419920, 421581, 417044, 397993)
Line 203: Line 192:
    print get_status(get_bugs("package", "gtk-qt-engine"))     print server.get_status(server.get_bugs("package", "gtk-qt-engine"))
Line 206: Line 195:
    print get_bug_log(202526)

    # retrives the newest 20 bugs
    print newest_bugs(20)

    # All bugs of a maintainer
    print get_bugs("maint", "debian-qa@lists.debian.org")

    # returns the status of those bugs
    print get_status(409909, 419920, 421581, 417044, 397993)

    # get_status and get_bugs combined:
    print get_status(get_bugs("package", "gtk-qt-engine"))

    # returns the full log for the given bug number
    print get_bug_log(202526)

    # retrives the newest 20 bugs
    print newest_bugs(20)
    print server.get_bug_log(202526)

    # retrieves the newest 20 bugs
    print server.newest_bugs(20)
Line 227: Line 201:
    print get_usertag("debian-qa@lists.debian.org")     print server.get_usertag("debian-qa@lists.debian.org")
Line 230: Line 204:
    print get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708")     print server.get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708")
Line 252: Line 226:
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
}}}
Line 256: Line 250:

$bugnumber=702669;
Line 336: Line 333:
== FAQ ==

== See also ==
 * [[BTS]]
 * [[Teams/Debbugs]]
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);
?>
}}}


----

CategoryBugs

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

DateTime

Date of bug creation

log_modified

DateTime

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

DateTime

empty for now

found_date

DateTime

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);
?>


CategoryBugs