]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 530252: Create a script that sets up the framework of an extension
authormkanat%bugzilla.org <>
Wed, 25 Nov 2009 05:02:55 +0000 (05:02 +0000)
committermkanat%bugzilla.org <>
Wed, 25 Nov 2009 05:02:55 +0000 (05:02 +0000)
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=mkanat

12 files changed:
Bugzilla/Install/Filesystem.pm
extensions/create.pl [new file with mode: 0644]
t/008filter.t
t/Support/Files.pm
template/en/default/extensions/config.pm.tmpl [new file with mode: 0644]
template/en/default/extensions/extension.pm.tmpl [new file with mode: 0644]
template/en/default/extensions/hook-readme.txt.tmpl [new file with mode: 0644]
template/en/default/extensions/license.txt.tmpl [new file with mode: 0644]
template/en/default/extensions/name-readme.txt.tmpl [new file with mode: 0644]
template/en/default/extensions/util.pm.tmpl [new file with mode: 0644]
template/en/default/global/messages.html.tmpl
template/en/default/global/user-error.html.tmpl

index 6c18d02134e9c985e9e6a13aa872b709d935a21f..819da24dd6ecf865fadc51af95ccdd41124a42d4 100644 (file)
@@ -130,6 +130,7 @@ sub FILESYSTEM {
         "$datadir/bugzilla-update.xml" => { perms => $ws_writeable },
         "$datadir/params" => { 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
diff --git a/extensions/create.pl b/extensions/create.pl
new file mode 100644 (file)
index 0000000..c4d911c
--- /dev/null
@@ -0,0 +1,85 @@
+#!/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.
index 5a9e48bac14e86fe0dd101807fc0992f1ed8808e..e6ae4c13af8be1a443db50a5e3246421f8fbf4cb 100644 (file)
@@ -96,7 +96,7 @@ foreach my $path (@Support::Templates::include_paths) {
     foreach my $file (@testitems) {
         # There are some files we don't check, because there is no need to
         # 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");
             next;
         }
index d24cc22644c6827a701f60b5747de802ce8b5512..6c6e0ee57db049f973e37a5f6f63d4105dbaf97a 100644 (file)
@@ -29,6 +29,7 @@ use File::Find;
 
 @files = glob('*');
 find(sub { push(@files, $File::Find::name) if $_ =~ /\.pm$/;}, 'Bugzilla');
+push(@files, 'extensions/create.pl');
 
 sub isTestingFile {
     my ($file) = @_;
diff --git a/template/en/default/extensions/config.pm.tmpl b/template/en/default/extensions/config.pm.tmpl
new file mode 100644 (file)
index 0000000..6997ec1
--- /dev/null
@@ -0,0 +1,41 @@
+[%# -*- 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;
diff --git a/template/en/default/extensions/extension.pm.tmpl b/template/en/default/extensions/extension.pm.tmpl
new file mode 100644 (file)
index 0000000..2492271
--- /dev/null
@@ -0,0 +1,46 @@
+[%# -*- 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;
diff --git a/template/en/default/extensions/hook-readme.txt.tmpl b/template/en/default/extensions/hook-readme.txt.tmpl
new file mode 100644 (file)
index 0000000..efceec1
--- /dev/null
@@ -0,0 +1,27 @@
+[%# 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.)
diff --git a/template/en/default/extensions/license.txt.tmpl b/template/en/default/extensions/license.txt.tmpl
new file mode 100644 (file)
index 0000000..964e075
--- /dev/null
@@ -0,0 +1,47 @@
+[%# -*- 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>
diff --git a/template/en/default/extensions/name-readme.txt.tmpl b/template/en/default/extensions/name-readme.txt.tmpl
new file mode 100644 (file)
index 0000000..6d25c83
--- /dev/null
@@ -0,0 +1,38 @@
+[%# 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.
diff --git a/template/en/default/extensions/util.pm.tmpl b/template/en/default/extensions/util.pm.tmpl
new file mode 100644 (file)
index 0000000..e197e81
--- /dev/null
@@ -0,0 +1,42 @@
+[%# -*- 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;
index bc6ca560172b443677a5556d9fd918c93cee0018..1f63da79b4ddfb757a9dc96a6a54b72ef969b859 100644 (file)
     The request to change the email address for the
     account [%+ old_email FILTER html %] to 
     [%+ 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" %]
     [% title = "New Field Value Created" %]
index 230f029b54cc6754579d6afb18c4e154614fc2fa..144e2e7eabfe27f2b2ffb86ed8301d4f4c824215 100644 (file)
@@ -17,6 +17,7 @@
   #
   # Contributor(s): Gervase Markham <gerv@gerv.net>
   #                 Frédéric Buclin <LpSolit@gmail.com>
+  #                 Max Kanat-Alexander <mkanat@bugzilla.org>
   #%]
 
 [%# INTERFACE:
   # 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 
-  # via hooks: just place your <extension>-errors.html.tmpl into 
-  # template/en/extension/hook/global/user-error.html.tmpl/errors/
-  # Note: be aware of uniqueness of error string parameter value, since 
-  # nobody can guarantee the hook files processing order in the future
+  # via hooks: just place additional code into
+  # template/en/hook/global/user-error-errors.html.tmpl
+  # Note: be aware of uniqueness of error string parameter value, since
+  # nobody can guarantee the hook files processing order in the future.
   #%]
 
 [% PROCESS global/variables.none.tmpl %]
     does not exist or you aren't authorized to
     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" %]
     [% title = "Field Already Exists" %]
     The field '[% field.name FILTER html %]'