diff options
author | mkanat%bugzilla.org <> | 2007-10-19 15:07:28 +0200 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2007-10-19 15:07:28 +0200 |
commit | dc4fc18fa7c860932fc8a30b52c828028369562e (patch) | |
tree | 4111a549cb69e4db8ebbed06342417256d75e3b9 | |
parent | f567c6d3e3d99e9ba5087a6abc663fe61e9d5985 (diff) | |
download | bugzilla-dc4fc18fa7c860932fc8a30b52c828028369562e.tar.gz bugzilla-dc4fc18fa7c860932fc8a30b52c828028369562e.tar.xz |
Bug 396245: Allow the WebService to list the installed plugins and their versions
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=ghendricks, a=mkanat
-rw-r--r-- | Bugzilla/Hook.pm | 35 | ||||
-rwxr-xr-x | Bugzilla/WebService/Bugzilla.pm | 28 | ||||
-rw-r--r-- | extensions/example/version.pl | 31 |
3 files changed, 93 insertions, 1 deletions
diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index 9d65fbe69..7c47b3f3f 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -41,6 +41,8 @@ sub process { # If there's malicious data here, we have much bigger issues to # worry about, so we can safely detaint them: trick_taint($extension); + # Skip CVS directories and any hidden files/dirs. + next if $extension =~ m{/CVS$} || $extension =~ m{/\.[^/]+$}; next if -e "$extension/disabled"; if (-e $extension.'/code/'.$name.'.pl') { Bugzilla->hook_args($args); @@ -53,7 +55,28 @@ sub process { Bugzilla->hook_args({}); } } - +} + +sub enabled_plugins { + my $extdir = bz_locations()->{'extensionsdir'}; + my @extensions = glob("$extdir/*"); + my %enabled; + foreach my $extension (@extensions) { + trick_taint($extension); + my $extname = $extension; + $extname =~ s{^\Q$extdir\E/}{}; + next if $extname eq 'CVS' || $extname =~ /^\./; + next if -e "$extension/disabled"; + # Allow extensions to load their own libraries. + local @INC = ("$extension/lib", @INC); + $enabled{$extname} = do("$extension/version.pl"); + ThrowCodeError('extension_invalid', + { errstr => $@, name => 'version', + extension => $extension }) if $@; + + } + + return \%enabled; } 1; @@ -78,6 +101,10 @@ hooks. When a piece of standard Bugzilla code wants to allow an extension to perform additional functions, it uses Bugzilla::Hook's L</process> subroutine to invoke any extension code if installed. +There is a sample extension in F<extensions/example/> that demonstrates +most of the things described in this document, as well as many of the +hooks available. + =head2 How Hooks Work When a hook named C<HOOK_NAME> is run, Bugzilla will attempt to invoke any @@ -96,6 +123,12 @@ These params are accessible through L<Bugzilla/hook_args>. That returns a hashref. Very frequently, if you want your hook to do anything, you have to modify these variables. +=head2 Versioning Extensions + +Every extension must have a file in its root called F<version.pl>. +This file should return a version number when called with C<do>. +This represents the current version of this extension. + =head1 SUBROUTINES =over diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm index 1eeeebddc..c6b0218cf 100755 --- a/Bugzilla/WebService/Bugzilla.pm +++ b/Bugzilla/WebService/Bugzilla.pm @@ -21,6 +21,7 @@ package Bugzilla::WebService::Bugzilla; use strict; use base qw(Bugzilla::WebService); use Bugzilla::Constants; +use Bugzilla::Hook; import SOAP::Data qw(type); use Time::Zone; @@ -29,6 +30,14 @@ 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}); + } + return { plugins => $plugins }; +} + sub timezone { my $offset = tz_offset(); $offset = (($offset / 60) / 60) * 100; @@ -74,6 +83,25 @@ string. =back +=item C<plugins> B<EXPERIMENTAL> + +=over + +=item B<Description> + +Gets information about the plugins that are currently installed and enabled +in this Bugzilla. + +=item B<Params> (none) + +=item B<Returns> + +A hash with a single item, C<plugins>. This points to a hash. I<That> hash +contains the names of plugins as keys, and the versions of the plugin as +values. + +=back + =item C<timezone> B<EXPERIMENTAL> =over diff --git a/extensions/example/version.pl b/extensions/example/version.pl new file mode 100644 index 000000000..c1305f92f --- /dev/null +++ b/extensions/example/version.pl @@ -0,0 +1,31 @@ +# -*- 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> + +# This script does some code to return a version number. However, +# most plugins will probably just want to return a raw string. +# To do that, the only contents of the file should be the string +# on a single line, like: +# +# '1.2.3'; + +use strict; +no warnings qw(void); # Avoid "useless use of a constant in void context" +use Bugzilla::Constants; +BUGZILLA_VERSION; |