Bug 415278: Make the WebService's plugin discovery method more extendable

Patch by: Colin Ogilvie <colin.ogilvie@gmail.com>; r=mkanat; a=LpSolit
parent 6d44fe8e
...@@ -69,7 +69,7 @@ sub enabled_plugins { ...@@ -69,7 +69,7 @@ sub enabled_plugins {
next if -e "$extension/disabled"; next if -e "$extension/disabled";
# Allow extensions to load their own libraries. # Allow extensions to load their own libraries.
local @INC = ("$extension/lib", @INC); local @INC = ("$extension/lib", @INC);
$enabled{$extname} = do("$extension/version.pl"); $enabled{$extname} = do("$extension/info.pl");
ThrowCodeError('extension_invalid', ThrowCodeError('extension_invalid',
{ errstr => $@, name => 'version', { errstr => $@, name => 'version',
extension => $extension }) if $@; extension => $extension }) if $@;
...@@ -125,9 +125,12 @@ hook to do anything, you have to modify these variables. ...@@ -125,9 +125,12 @@ hook to do anything, you have to modify these variables.
=head2 Versioning Extensions =head2 Versioning Extensions
Every extension must have a file in its root called F<version.pl>. Every extension must have a file in its root called F<info.pl>.
This file should return a version number when called with C<do>. This file must return a hash when called with C<do>.
This represents the current version of this extension. The hash must contain a 'version' key with the current version of the
extension. Extension authors can also add any extra infomration to this hash if
required, by adding a new key beginning with x_ which will not be used the
core Bugzilla code.
=head1 SUBROUTINES =head1 SUBROUTINES
......
...@@ -36,12 +36,16 @@ sub version { ...@@ -36,12 +36,16 @@ sub version {
return { version => type('string')->value(BUGZILLA_VERSION) }; return { version => type('string')->value(BUGZILLA_VERSION) };
} }
sub plugins { sub extensions {
my $plugins = Bugzilla::Hook::enabled_plugins(); my $extensions = Bugzilla::Hook::enabled_plugins();
foreach my $name (keys %$plugins) { foreach my $name (keys %$extensions) {
$plugins->{$name} = type('string')->value($plugins->{$name}); my $info = $extensions->{$name};
foreach my $data (keys %$info)
{
$extensions->{$name}->{$data} = type('string')->value($info->{$data});
}
} }
return { plugins => $plugins }; return { extensions => $extensions };
} }
sub timezone { sub timezone {
...@@ -89,22 +93,23 @@ string. ...@@ -89,22 +93,23 @@ string.
=back =back
=item C<plugins> B<EXPERIMENTAL> =item C<extensions> B<EXPERIMENTAL>
=over =over
=item B<Description> =item B<Description>
Gets information about the plugins that are currently installed and enabled Gets information about the extensions that are currently installed and enabled
in this Bugzilla. in this Bugzilla.
=item B<Params> (none) =item B<Params> (none)
=item B<Returns> =item B<Returns>
A hash with a single item, C<plugins>. This points to a hash. I<That> hash A hash with a single item, C<extesions>. This points to a hash. I<That> hash
contains the names of plugins as keys, and the versions of the plugin as contains the names of extensions as keys, and information about the extension
values. as values. One of the values that must be returned is the 'version' of the
extension
=back =back
......
...@@ -54,6 +54,7 @@ my $legal_field_values; ...@@ -54,6 +54,7 @@ my $legal_field_values;
my $add_comment; my $add_comment;
my $private; my $private;
my $work_time; my $work_time;
my $fetch_extension_info = 0;
GetOptions('help|h|?' => \$help, GetOptions('help|h|?' => \$help,
'uri=s' => \$Bugzilla_uri, 'uri=s' => \$Bugzilla_uri,
...@@ -66,7 +67,8 @@ GetOptions('help|h|?' => \$help, ...@@ -66,7 +67,8 @@ GetOptions('help|h|?' => \$help,
'field:s' => \$legal_field_values, 'field:s' => \$legal_field_values,
'comment:s' => \$add_comment, 'comment:s' => \$add_comment,
'private:i' => \$private, 'private:i' => \$private,
'worktime:f' => \$work_time 'worktime:f' => \$work_time,
'extension_info' => \$fetch_extension_info
) or pod2usage({'-verbose' => 0, '-exitval' => 1}); ) or pod2usage({'-verbose' => 0, '-exitval' => 1});
=head1 OPTIONS =head1 OPTIONS
...@@ -133,6 +135,10 @@ An optional non-zero value to specify B<--comment> as private. ...@@ -133,6 +135,10 @@ An optional non-zero value to specify B<--comment> as private.
An optional double precision number specifying the work time for B<--comment>. An optional double precision number specifying the work time for B<--comment>.
=item --extension_info
If specified on the command line, the script returns the information about the
extensions that are installed.
=back =back
...@@ -193,6 +199,25 @@ $soapresult = $proxy->call('Bugzilla.timezone'); ...@@ -193,6 +199,25 @@ $soapresult = $proxy->call('Bugzilla.timezone');
_die_on_fault($soapresult); _die_on_fault($soapresult);
print 'Bugzilla\'s timezone is ' . $soapresult->result()->{timezone} . ".\n"; print 'Bugzilla\'s timezone is ' . $soapresult->result()->{timezone} . ".\n";
=head2 Getting Extension Information
Returns all the information any extensions have decided to provide to the webservice.
=cut
if ($fetch_extension_info) {
$soapresult = $proxy->call('Bugzilla.extensions');
_die_on_fault($soapresult);
my $extensions = $soapresult->result()->{extensions};
foreach my $extensionname (keys(%$extensions)) {
print "Extensionn '$extensionname' information\n";
my $extension = $extensions->{$extensionname};
foreach my $data (keys(%$extension)) {
print ' ' . $data . ' => ' . $extension->{$data} . "\n";
}
}
}
=head2 Logging In and Out =head2 Logging In and Out
=head3 Using Bugzilla's Environment Authentication =head3 Using Bugzilla's Environment Authentication
......
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Example WebService Plugin
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by Everything Solved, Inc. are Copyright (C) 2007
# Everything Solved, Inc. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
# Colin Ogilvie <colin.ogilvie@gmail.com>
# This script does some code to return a hash about the Extension.
# You are required to return a hash containing the Extension version
# You can optionaally add any other values to the hash too, as long as
# they begin with an x_
#
# Eg:
# {
# 'version' => '0.1', # required
# 'x_name' => 'Example Extension'
# }
use strict;
no warnings qw(void); # Avoid "useless use of a constant in void context"
use Bugzilla::Constants;
{
'version' => BUGZILLA_VERSION,
'x_blah' => 'Hello....',
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment