From fbb30d2c53cbbd71c80d58b30d2ec77f3c14d403 Mon Sep 17 00:00:00 2001 From: "mozilla%colinogilvie.co.uk" <> Date: Mon, 19 May 2008 23:38:23 +0000 Subject: Bug 415278: Make the WebService's plugin discovery method more extendable Patch by: Colin Ogilvie ; r=mkanat; a=LpSolit --- Bugzilla/Hook.pm | 11 +++++++---- Bugzilla/WebService/Bugzilla.pm | 25 +++++++++++++++---------- contrib/bz_webservice_demo.pl | 27 ++++++++++++++++++++++++++- extensions/example/info.pl | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 extensions/example/info.pl diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index 7c47b3f3f..0cf566db1 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -69,7 +69,7 @@ sub enabled_plugins { next if -e "$extension/disabled"; # Allow extensions to load their own libraries. local @INC = ("$extension/lib", @INC); - $enabled{$extname} = do("$extension/version.pl"); + $enabled{$extname} = do("$extension/info.pl"); ThrowCodeError('extension_invalid', { errstr => $@, name => 'version', extension => $extension }) if $@; @@ -125,9 +125,12 @@ hook to do anything, you have to modify these variables. =head2 Versioning Extensions -Every extension must have a file in its root called F. -This file should return a version number when called with C. -This represents the current version of this extension. +Every extension must have a file in its root called F. +This file must return a hash when called with C. +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 diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm index dde9cfd4b..7b58af254 100755 --- a/Bugzilla/WebService/Bugzilla.pm +++ b/Bugzilla/WebService/Bugzilla.pm @@ -36,12 +36,16 @@ sub version { return { version => type('string')->value(BUGZILLA_VERSION) }; } -sub plugins { - my $plugins = Bugzilla::Hook::enabled_plugins(); - foreach my $name (keys %$plugins) { - $plugins->{$name} = type('string')->value($plugins->{$name}); +sub extensions { + my $extensions = Bugzilla::Hook::enabled_plugins(); + foreach my $name (keys %$extensions) { + 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 { @@ -89,22 +93,23 @@ string. =back -=item C B +=item C B =over =item B -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. =item B (none) =item B -A hash with a single item, C. This points to a hash. I hash -contains the names of plugins as keys, and the versions of the plugin as -values. +A hash with a single item, C. This points to a hash. I hash +contains the names of extensions as keys, and information about the extension +as values. One of the values that must be returned is the 'version' of the +extension =back diff --git a/contrib/bz_webservice_demo.pl b/contrib/bz_webservice_demo.pl index a5e6af9f9..32c8561a0 100755 --- a/contrib/bz_webservice_demo.pl +++ b/contrib/bz_webservice_demo.pl @@ -54,6 +54,7 @@ my $legal_field_values; my $add_comment; my $private; my $work_time; +my $fetch_extension_info = 0; GetOptions('help|h|?' => \$help, 'uri=s' => \$Bugzilla_uri, @@ -66,7 +67,8 @@ GetOptions('help|h|?' => \$help, 'field:s' => \$legal_field_values, 'comment:s' => \$add_comment, 'private:i' => \$private, - 'worktime:f' => \$work_time + 'worktime:f' => \$work_time, + 'extension_info' => \$fetch_extension_info ) or pod2usage({'-verbose' => 0, '-exitval' => 1}); =head1 OPTIONS @@ -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>. +=item --extension_info + +If specified on the command line, the script returns the information about the +extensions that are installed. =back @@ -193,6 +199,25 @@ $soapresult = $proxy->call('Bugzilla.timezone'); _die_on_fault($soapresult); 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 =head3 Using Bugzilla's Environment Authentication diff --git a/extensions/example/info.pl b/extensions/example/info.pl new file mode 100644 index 000000000..b4620eed6 --- /dev/null +++ b/extensions/example/info.pl @@ -0,0 +1,41 @@ +# -*- 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 +# Colin Ogilvie + +# 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....', + +}; -- cgit v1.2.3-24-g4f1b