View | Details | Raw Unified | Return to bug 34978
Collapse All | Expand All

(-)a/Koha/Plugins.pm (-1 / +29 lines)
Lines 276-287 sub InstallPlugins { Link Here
276
    my $verbose = $params->{verbose} // $self->_verbose;
276
    my $verbose = $params->{verbose} // $self->_verbose;
277
277
278
    my @plugin_classes = $self->plugins();
278
    my @plugin_classes = $self->plugins();
279
    my @plugins;
279
    my (@plugins, @classes_filters);
280
281
    my $has_filters = defined($params->{include}) || defined($params->{exclude});
282
283
    # Warn user if the specified classes doesn't exist and return nothing
284
    if ($has_filters) {
285
        @classes_filters = defined($params->{include}) ? @{$params->{include}} : @{$params->{exclude}};
286
287
        foreach my $classes_filter (@classes_filters) {
288
            my $is_found = 0;
289
290
            foreach my $plugin_class (@plugin_classes) {
291
                $is_found = 1 if $plugin_class =~ ":$classes_filter\$|^$classes_filter\$" || ($classes_filter =~ "^::" && $plugin_class =~ "$classes_filter\$");
292
            }
293
            unless ($is_found) {
294
                warn "$classes_filter have not been found, try a different name";
295
                return;
296
            }
297
        }
298
    }
280
299
281
    foreach my $plugin_class (@plugin_classes) {
300
    foreach my $plugin_class (@plugin_classes) {
282
        if ( can_load( modules => { $plugin_class => undef }, verbose => $verbose, nocache => 1 ) ) {
301
        if ( can_load( modules => { $plugin_class => undef }, verbose => $verbose, nocache => 1 ) ) {
283
            next unless $plugin_class->isa('Koha::Plugins::Base');
302
            next unless $plugin_class->isa('Koha::Plugins::Base');
284
303
304
            # Apply the filters
305
            if ($has_filters) {
306
                my $is_found = 0;
307
                foreach my $classes_filter (@classes_filters) {
308
                    $is_found = 1 if $plugin_class =~ ":$classes_filter\$|^$classes_filter\$" || ($classes_filter =~ "^::" && $plugin_class =~ "$classes_filter\$");
309
                }
310
                next if (defined($params->{include}) && !$is_found) || (defined($params->{exclude}) && $is_found);
311
            }
312
285
            my $plugin;
313
            my $plugin;
286
            my $failed_instantiation;
314
            my $failed_instantiation;
287
315
(-)a/misc/devel/install_plugins.pl (-3 / +25 lines)
Lines 26-36 use Koha::Script; Link Here
26
use C4::Context;
26
use C4::Context;
27
use Koha::Plugins;
27
use Koha::Plugins;
28
28
29
my ($help);
29
my ($help, @include, @exclude);
30
GetOptions( 'help|?' => \$help );
30
31
GetOptions(
32
    'help|?' => \$help,
33
    'include=s' => \@include,
34
    'exclude=s' => \@exclude,
35
) or die "Installation aborted\n";
31
36
32
pod2usage(1) if $help;
37
pod2usage(1) if $help;
33
38
39
die "Installation aborted : --include and --exclude can't be used simultaneously\n" if @include && @exclude;
40
34
unless ( C4::Context->config("enable_plugins") ) {
41
unless ( C4::Context->config("enable_plugins") ) {
35
    print
42
    print
36
"The plugin system must be enabled for one to be able to install plugins\n";
43
"The plugin system must be enabled for one to be able to install plugins\n";
Lines 46-52 for my $existing_plugin (@existing_plugins) { Link Here
46
    $existing_plugins->{ $existing_plugin->{metadata}->{name} } = $existing_plugin->{metadata}->{version};
53
    $existing_plugins->{ $existing_plugin->{metadata}->{name} } = $existing_plugin->{metadata}->{version};
47
}
54
}
48
55
49
my @installed_plugins = Koha::Plugins->new()->InstallPlugins( { verbose => 0 } );
56
my $params = {};
57
$params->{'include'} = \@include if @include;
58
$params->{'exclude'} = \@exclude if @exclude;
59
60
my @installed_plugins = Koha::Plugins->new()->InstallPlugins($params);
61
50
unless (@installed_plugins) {
62
unless (@installed_plugins) {
51
    my $plugins_dir = C4::Context->config("pluginsdir");
63
    my $plugins_dir = C4::Context->config("pluginsdir");
52
    if ( ref($plugins_dir) eq 'ARRAY' ) {
64
    if ( ref($plugins_dir) eq 'ARRAY' ) {
Lines 91-96 install_plugins.pl - install all plugins found in plugins_dir Link Here
91
103
92
Options:
104
Options:
93
  -?|--help        brief help message
105
  -?|--help        brief help message
106
  --include        install only the plugins of the specified classes
107
  --exclude        install all the plugins except the specified ones
94
108
95
=head1 OPTIONS
109
=head1 OPTIONS
96
110
Lines 100-105 Options: Link Here
100
114
101
Print a brief help message and exits
115
Print a brief help message and exits
102
116
117
=item B<--include>
118
119
Retrieve the list of plugin classes and install only those. It's possible to specify the package of a class to install a specific plugin (e.g. --include <package::pluginClass> --include <anotherPluginClass>).
120
121
=item B<--exclude>
122
123
Retrieve the list of plugin classes and install all plugins except those. It's possible to specify the package of a class to install a specific plugin (e.g. --exclude <package::pluginClass> --exclude <anotherPluginClass>).
124
103
=back
125
=back
104
126
105
=head1 DESCRIPTION
127
=head1 DESCRIPTION
(-)a/t/db_dependent/Koha/Plugins/Plugins.t (-2 / +55 lines)
Lines 24-30 use File::Temp qw( tempdir tempfile ); Link Here
24
use FindBin qw($Bin);
24
use FindBin qw($Bin);
25
use Module::Load::Conditional qw(can_load);
25
use Module::Load::Conditional qw(can_load);
26
use Test::MockModule;
26
use Test::MockModule;
27
use Test::More tests => 18;
27
use Test::More tests => 30;
28
use Test::Warn;
28
use Test::Warn;
29
29
30
use C4::Context;
30
use C4::Context;
Lines 185-190 subtest 'GetPlugins() tests' => sub { Link Here
185
    $schema->storage->txn_rollback;
185
    $schema->storage->txn_rollback;
186
};
186
};
187
187
188
subtest 'InstallPlugins() tests' => sub {
189
190
    plan tests => 4;
191
192
    $schema->storage->txn_begin;
193
194
    # Temporarily remove any installed plugins data
195
    Koha::Plugins::Methods->delete;
196
    $schema->resultset('PluginData')->delete;
197
198
    # Tests for the exclude paramater
199
    # Test the returned plugins of the InstallPlugins subroutine
200
    my $plugins = Koha::Plugins->new({ enable_plugins => 1 });
201
    my @installed_plugins = $plugins->InstallPlugins({ exclude => ["Test", "Koha::Plugin::MarcFieldValues"] });
202
    my $plugin_classes = join(" ", map{$_->{class}} @installed_plugins);
203
204
    my $result = grep { $plugin_classes !~ $_ } [":Test |:Test\$", ":MarcFieldValues |:MarcFieldValues\$"]
205
        && $plugin_classes =~ ":TestItemBarcodeTransform |:TestItemBarcodeTransform\$";
206
    ok($result, "Excluded plugins are not returned");
207
208
    # Test the plugins in the database
209
    my @plugins = $plugins->GetPlugins({ all => 1, error => 1 });
210
    $plugin_classes = join(" ", map{$_->{class}} @plugins);
211
212
    $result = grep { $plugin_classes !~ $_ } [":Test |:Test\$", ":MarcFieldValues |:MarcFieldValues\$"]
213
        && $plugin_classes =~ ":TestItemBarcodeTransform |:TestItemBarcodeTransform\$";
214
    ok($result, "Excluded plugins are not installed");
215
216
    # Remove installed plugins data
217
    Koha::Plugins::Methods->delete;
218
    $schema->resultset('PluginData')->delete;
219
220
    # Tests for the include parameter
221
    # Test the returned plugins of the InstallPlugins subroutine
222
    @installed_plugins = $plugins->InstallPlugins({ include => ["Test", "Koha::Plugin::MarcFieldValues"]});
223
224
    $result = 1;
225
    foreach my $plugin_class ( map{ $_->{class} } @installed_plugins ) {
226
        $result = 0 unless("$plugin_class" =~ ":Test\$" || "$plugin_class" =~ ":MarcFieldValues\$");
227
    }
228
    ok($result, "Only included plugins are returned");
229
230
    # Test the plugins in the database
231
    @plugins = $plugins->GetPlugins({ all => 1, error => 1});
232
233
    $result = 1;
234
    foreach my $plugin_class ( map{ $_->{class} } @plugins ) {
235
        $result = 0 unless("$plugin_class" =~ ":Test\$" || "$plugin_class" =~ ":MarcFieldValues\$");
236
    }
237
    ok($result, "Only included plugins are installed");
238
239
    $schema->storage->txn_rollback;
240
};
241
188
subtest 'Version upgrade tests' => sub {
242
subtest 'Version upgrade tests' => sub {
189
243
190
    plan tests => 1;
244
    plan tests => 1;
191
- 

Return to bug 34978