Commit c62ddd06 authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 530252: Create a script that sets up the framework of an extension

Patch by Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=mkanat
parent 74060782
...@@ -130,6 +130,7 @@ sub FILESYSTEM { ...@@ -130,6 +130,7 @@ sub FILESYSTEM {
"$datadir/bugzilla-update.xml" => { perms => $ws_writeable }, "$datadir/bugzilla-update.xml" => { perms => $ws_writeable },
"$datadir/params" => { perms => $ws_writeable }, "$datadir/params" => { perms => $ws_writeable },
"$datadir/mailer.testfile" => { perms => $ws_writeable }, "$datadir/mailer.testfile" => { perms => $ws_writeable },
"$extensionsdir/create.pl" => { perms => $owner_executable },
); );
# Directories that we want to set the perms on, but not # Directories that we want to set the perms on, but not
......
#!/usr/bin/perl -w
#
# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
use strict;
use lib qw(. lib);
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Util qw(get_text);
use File::Path qw(mkpath);
use DateTime;
my $base_dir = bz_locations()->{'extensionsdir'};
my $name = $ARGV[0] or ThrowUserError('extension_create_no_name');
if ($name !~ /^[A-Z]/) {
ThrowUserError('extension_first_letter_caps', { name => $name });
}
my $extension_dir = "$base_dir/$name";
mkpath($extension_dir)
|| die "$extension_dir already exists or cannot be created.\n";
my $lcname = lc($name);
foreach my $path (qw(lib template/en/default/hook),
"template/en/default/$lcname")
{
mkpath("$extension_dir/$path") || die "$extension_dir/$path: $!";
}
my $year = DateTime->now()->year;
my $template = Bugzilla->template;
my $vars = { year => $year, name => $name, path => $extension_dir };
my %create_files = (
'config.pm.tmpl' => 'Config.pm',
'extension.pm.tmpl' => 'Extension.pm',
'util.pm.tmpl' => 'lib/Util.pm',
'hook-readme.txt.tmpl' => 'template/en/default/hook/README',
'name-readme.txt.tmpl' => "template/en/default/$lcname/README",
);
foreach my $template_file (keys %create_files) {
my $target = $create_files{$template_file};
my $output;
$template->process("extensions/$template_file", $vars, \$output)
or ThrowTemplateError($template->error());
open(my $fh, '>', "$extension_dir/$target");
print $fh $output;
close($fh);
}
print get_text('extension_created', $vars), "\n";
__END__
=head1 NAME
extensions/create.pl - Create a framework for a new Bugzilla Extension.
=head1 SYNOPSIS
extensions/create.pl NAME
Creates a framework for an extension called NAME in the F<extensions/>
directory.
...@@ -96,7 +96,7 @@ foreach my $path (@Support::Templates::include_paths) { ...@@ -96,7 +96,7 @@ foreach my $path (@Support::Templates::include_paths) {
foreach my $file (@testitems) { foreach my $file (@testitems) {
# There are some files we don't check, because there is no need to # There are some files we don't check, because there is no need to
# filter their contents due to their content-type. # filter their contents due to their content-type.
if ($file =~ /\.(txt|png)\.tmpl$/) { if ($file =~ /\.(pm|txt|png)\.tmpl$/) {
ok(1, "($lang/$flavor) $file is filter-safe"); ok(1, "($lang/$flavor) $file is filter-safe");
next; next;
} }
......
...@@ -29,6 +29,7 @@ use File::Find; ...@@ -29,6 +29,7 @@ use File::Find;
@files = glob('*'); @files = glob('*');
find(sub { push(@files, $File::Find::name) if $_ =~ /\.pm$/;}, 'Bugzilla'); find(sub { push(@files, $File::Find::name) if $_ =~ /\.pm$/;}, 'Bugzilla');
push(@files, 'extensions/create.pl');
sub isTestingFile { sub isTestingFile {
my ($file) = @_; my ($file) = @_;
......
[%# -*- mode: perl -*- %]
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[%# INTERFACE:
# name: string; The name of the extension.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS extensions/license.txt.tmpl %]
package B[% %]ugzilla::Extension::[% name %];
use strict;
use constant NAME => '[% name %]';
use constant REQUIRED_MODULES => [
];
use constant OPTIONAL_MODULES => [
];
__PACKAGE__->NAME;
[%# -*- mode: perl -*- %]
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[%# INTERFACE:
# name: string; The name of the extension.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS extensions/license.txt.tmpl %]
package B[% %]ugzilla::Extension::[% name %];
use strict;
use base qw(B[% %]ugzilla::Extension);
# This code for this is in [% path %]/lib/Util.pm
use B[% %]ugzilla::Extension::[% name %]::Util;
our $VERSION = '0.01';
# See the documentation of B[% %]ugzilla::Hook ("perldoc B[% %]ugzilla::Hook"
# in the bugzilla directory) for a list of all available hooks.
sub install_update_db {
my ($self, $args) = @_;
}
__PACKAGE__->NAME;
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% PROCESS global/variables.none.tmpl %]
Template hooks go in this directory. Template hooks are called in normal
[%+ terms.Bugzilla %] templates like [[% '%' %] Hook.process('some-hook') %].
More information about them can be found in the documentation of
B[% %]ugzilla::Extension. (Do "perldoc B[% %]ugzilla::Extension" from the main
[%+ terms.Bugzilla %] directory to see that documentation.)
[%# -*- mode: perl -*- %]
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[%# INTERFACE:
# name: string; The name of the extension.
#%]
[% PROCESS global/variables.none.tmpl %]
# -*- 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 [% name %] [%+ terms.Bugzilla %] Extension.
#
# The Initial Developer of the Original Code is YOUR NAME
# Portions created by the Initial Developer are Copyright (C) [% year %] the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# YOUR NAME <YOUR EMAIL ADDRESS>
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% PROCESS global/variables.none.tmpl %]
Normal templates go in this directory. You can load them in your
code like this:
use B[% %]ugzilla::Error;
my $template = B[% %]ugzilla->template;
$template->process('[% name FILTER lower %]/some-template.html.tmpl')
or ThrowTemplateError($template->error());
That would be how to load a file called some-template.html.tmpl that
was in this directory.
Note that you have to be careful that the full path of your template
never conflicts with a template that exists in [% terms.Bugzilla %] or in
another extension, or your template might override that template. That's why
we created this directory called '[% name FILTER lower %]' for you, so you
can put your templates in here to help avoid conflicts.
[%# -*- mode: perl -*- %]
[%# 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 Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2009 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[%# INTERFACE:
# name: string; The name of the extension.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS extensions/license.txt.tmpl %]
package B[% %]ugzilla::Extension::[% name %];
use strict;
use base qw(Exporter);
our @EXPORT = qw(
);
# This file can be loaded by your extension via
# "use B[% %]ugzilla::Extension::[% name %]::Util". You can put functions
# used by your extension in here. (Make sure you also list them in
# @EXPORT.)
1;
...@@ -279,7 +279,12 @@ ...@@ -279,7 +279,12 @@
The request to change the email address for the The request to change the email address for the
account [%+ old_email FILTER html %] to account [%+ old_email FILTER html %] to
[%+ new_email FILTER html %] has been canceled. [%+ new_email FILTER html %] has been canceled.
Your old account settings have been reinstated. Your old account settings have been reinstated.
[% ELSIF message_tag == "extension_created" %]
An extension named [% name FILTER html %] has been created
in [% path FILTER html %]. Make sure you change "YOUR NAME" and
"YOUR EMAIL ADDRESS" in the code to your name and your email address.
[% ELSIF message_tag == "field_value_created" %] [% ELSIF message_tag == "field_value_created" %]
[% title = "New Field Value Created" %] [% title = "New Field Value Created" %]
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
# #
# Contributor(s): Gervase Markham <gerv@gerv.net> # Contributor(s): Gervase Markham <gerv@gerv.net>
# Frédéric Buclin <LpSolit@gmail.com> # Frédéric Buclin <LpSolit@gmail.com>
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%] #%]
[%# INTERFACE: [%# INTERFACE:
...@@ -32,10 +33,10 @@ ...@@ -32,10 +33,10 @@
# in this file; if you do not wish to change it, use the "none" filter. # in this file; if you do not wish to change it, use the "none" filter.
# #
# Extension- or custom-specific error handling can be easily added # Extension- or custom-specific error handling can be easily added
# via hooks: just place your <extension>-errors.html.tmpl into # via hooks: just place additional code into
# template/en/extension/hook/global/user-error.html.tmpl/errors/ # template/en/hook/global/user-error-errors.html.tmpl
# Note: be aware of uniqueness of error string parameter value, since # Note: be aware of uniqueness of error string parameter value, since
# nobody can guarantee the hook files processing order in the future # nobody can guarantee the hook files processing order in the future.
#%] #%]
[% PROCESS global/variables.none.tmpl %] [% PROCESS global/variables.none.tmpl %]
...@@ -428,6 +429,13 @@ ...@@ -428,6 +429,13 @@
does not exist or you aren't authorized to does not exist or you aren't authorized to
enter [% terms.abug %] into it. enter [% terms.abug %] into it.
[% ELSIF error == "extension_create_no_name" %]
You must specify a name for your extension, as an argument to this script.
[% ELSIF error == "extension_first_letter_caps" %]
The first letter of your extension's name must be a capital letter.
(You specified '[% name FILTER html %]'.)
[% ELSIF error == "field_already_exists" %] [% ELSIF error == "field_already_exists" %]
[% title = "Field Already Exists" %] [% title = "Field Already Exists" %]
The field '[% field.name FILTER html %]' The field '[% field.name FILTER html %]'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment