From 933fe72425f6e657c152950246735370f0f06dcf Mon Sep 17 00:00:00 2001 From: rojanu Date: Fri, 15 Jan 2016 14:40:10 +0000 Subject: Bug 922549: Bugzilla::Migrate.pm should provide hook in load function. r=gerv. --- Bugzilla/Hook.pm | 28 ++++++++ Bugzilla/Migrate.pm | 20 ++++-- extensions/Example/Extension.pm | 6 ++ extensions/Example/lib/Migrate/ImportBugs.pm | 102 +++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 extensions/Example/lib/Migrate/ImportBugs.pm diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index f711907d1..6f85885c3 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -1083,6 +1083,34 @@ A hashref. The set of named parameters passed to C. =back +=head2 migrate_modules + +This hook allows you to add modules to Migrate to support additional systems +to be imported into Bugzilla + +Params: + +=over + +=item C - An hashref containing data to be returned to L. +This hashref contains the path and prefix for the modules to be used. + +=over + +=item C - Path to where the modules are kept, on a typical extension this +would be the lib folder of the extension. + +=item C - Package prefix of the module to be loaded + +=back + +The definition is structured as: + $modules = { path => $path, prefix => $prefix }; + + +=back + + =head2 object_before_delete This happens in L, after we've confirmed diff --git a/Bugzilla/Migrate.pm b/Bugzilla/Migrate.pm index 0731d4fed..6ecdb5c0d 100644 --- a/Bugzilla/Migrate.pm +++ b/Bugzilla/Migrate.pm @@ -199,12 +199,24 @@ sub load { my @migration_modules = glob("$libdir/Bugzilla/Migrate/*"); my ($module) = grep { basename($_) =~ /^\Q$from\E\.pm$/i } @migration_modules; - if (!$module) { + if ($module) { + require $module; + my $canonical_name = _canonical_name($module); + return "Bugzilla::Migrate::$canonical_name"->new; + } + else { + my $migrate_module = {}; + Bugzilla::Hook::process('migrate_modules', $migrate_module); + @migration_modules = glob($migrate_module->{path}."/*"); + ($module) = grep { basename($_) =~ /^\Q$from\E\.pm$/i } + @migration_modules; + if (!$module) { ThrowUserError('migrate_from_invalid', { from => $from }); + } + require $module; + my $canonical_name = _canonical_name($module); + return "$migrate_module->{prefix}::$canonical_name"->new; } - require $module; - my $canonical_name = _canonical_name($module); - return "Bugzilla::Migrate::$canonical_name"->new; } ############# diff --git a/extensions/Example/Extension.pm b/extensions/Example/Extension.pm index 1649957fd..ad96066f7 100644 --- a/extensions/Example/Extension.pm +++ b/extensions/Example/Extension.pm @@ -635,6 +635,12 @@ sub mailer_before_send { $email->header_set('X-Bugzilla-Example-Header', 'Example'); } +sub migrate_modules { + my ($self, $args) = @_; + $args->{path} = bz_locations->{'extensionsdir'} . "/Example/lib/Migrate"; + $args->{prefix} = "Bugzilla::Extension::Example:Migrate"; +} + sub object_before_create { my ($self, $args) = @_; diff --git a/extensions/Example/lib/Migrate/ImportBugs.pm b/extensions/Example/lib/Migrate/ImportBugs.pm new file mode 100644 index 000000000..42a393c73 --- /dev/null +++ b/extensions/Example/lib/Migrate/ImportBugs.pm @@ -0,0 +1,102 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. + + +=head1 NAME + +Bugzilla::Extension::Example::Migrate::ImportBugs - Bugzilla example bug importer + +=head1 DESCRIPTION + +This is not a complete implementation of a Import module. For a working +implementation see L. + +=cut + +package Bugzilla::Extension::Example::Migrate::ImportBugs; +use strict; +use base qw(Bugzilla::Migrate); + +use Bugzilla::Constants; +use Bugzilla::Install::Util qw(indicate_progress); +use Bugzilla::Util qw(format_time trim generate_random_password); + +use constant REQUIRED_MODULES => [ + { + package => 'Email-Simple-FromHandle', + module => 'Email::Simple::FromHandle', + version => 0.050, + }, +]; + +use constant FIELD_MAP => { + 'Number' => 'bug_id', + 'Category' => 'product', +}; + +use constant VALUE_MAP => { + bug_severity => { + 'serious' => 'major', + 'non-critical' => 'normal', + }, + bug_status => { + 'feedback' => 'RESOLVED', + 'released' => 'VERIFIED', + }, +}; + +use constant IMPORTBUGS_CONFIG_VARS => ( + { + name => 'default_email_domain', + default => 'example.com', + desc => <<'END', +# Some users do not have full email addresses, but Bugzilla requires +# every user to have an email address. What domain should be appended to +# usernames that don't have emails, to make them into email addresses? +# (For example, if you leave this at the default, "unknown" would become +# "unknown@example.com".) +END + }, +); + +######### +# Hooks # +######### + +sub before_insert { + my $self = shift; +} + +######### +# Users # +######### + +sub _read_users { + my $self = shift; +} + +############ +# Products # +############ + +sub _read_products { + my $self = shift; +} + +################ +# Reading Bugs # +################ + +sub _read_bugs { + my $self = shift; +} + +sub _parse_project { + my ($self, $directory) = @_; +} + +1; -- cgit v1.2.3-24-g4f1b