summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Hook.pm28
-rw-r--r--Bugzilla/Migrate.pm20
-rw-r--r--extensions/Example/Extension.pm6
-rw-r--r--extensions/Example/lib/Migrate/ImportBugs.pm102
4 files changed, 152 insertions, 4 deletions
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<create>.
=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<modules> - An hashref containing data to be returned to L<Bugzilla::Migrate>.
+This hashref contains the path and prefix for the modules to be used.
+
+=over
+
+=item C<path> - Path to where the modules are kept, on a typical extension this
+would be the lib folder of the extension.
+
+=item C<prefix> - 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<Bugzilla::Object/remove_from_db>, 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<Bugzilla::Migrate::Gnats>.
+
+=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;