From f2d5af261b95310c2fb7d0565222c211998bff4f Mon Sep 17 00:00:00 2001
From: Max Kanat-Alexander <mkanat@bugzilla.org>
Date: Wed, 13 Oct 2010 16:36:18 -0700
Subject: [PATCH] Bug 602418: Add "template_cache" to bz_locations(), a way of
 specifying that cached templates should be stored somewhere else than the
 data directory. r=LpSolit, a=mkanat

---
 Bugzilla/Constants.pm                    |  8 +++++---
 Bugzilla/Install/Filesystem.pm           |  3 ++-
 Bugzilla/Template.pm                     | 24 ++++++++++++++----------
 template/en/default/setup/strings.txt.pl |  4 ++--
 4 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm
index 06bdaade0..14c3f2b26 100644
--- a/Bugzilla/Constants.pm
+++ b/Bugzilla/Constants.pm
@@ -596,6 +596,7 @@ sub bz_locations {
         $datadir = "data";
     }
 
+    $datadir = "$libpath/$datadir";
     # We have to return absolute paths for mod_perl. 
     # That means that if you modify these paths, they must be absolute paths.
     return {
@@ -605,10 +606,11 @@ sub bz_locations {
         # make sure this still points to the CGIs.
         'cgi_path'    => $libpath,
         'templatedir' => "$libpath/template",
+        'template_cache' => "$datadir/template",
         'project'     => $project,
         'localconfig' => "$libpath/$localconfig",
-        'datadir'     => "$libpath/$datadir",
-        'attachdir'   => "$libpath/$datadir/attachments",
+        'datadir'     => $datadir,
+        'attachdir'   => "$datadir/attachments",
         'skinsdir'    => "$libpath/skins",
         # $webdotdir must be in the web server's tree somewhere. Even if you use a 
         # local dot, we output images to there. Also, if $webdotdir is 
@@ -616,7 +618,7 @@ sub bz_locations {
         # change showdependencygraph.cgi to set image_url to the correct 
         # location.
         # The script should really generate these graphs directly...
-        'webdotdir'   => "$libpath/$datadir/webdot",
+        'webdotdir'   => "$datadir/webdot",
         'extensionsdir' => "$libpath/extensions",
     };
 }
diff --git a/Bugzilla/Install/Filesystem.pm b/Bugzilla/Install/Filesystem.pm
index 20bd021ef..6a265bffe 100644
--- a/Bugzilla/Install/Filesystem.pm
+++ b/Bugzilla/Install/Filesystem.pm
@@ -121,6 +121,7 @@ sub FILESYSTEM {
     my $extlib        = bz_locations()->{'ext_libpath'};
     my $skinsdir      = bz_locations()->{'skinsdir'};
     my $localconfig   = bz_locations()->{'localconfig'};
+    my $template_cache = bz_locations()->{'template_cache'};
 
     # We want to set the permissions the same for all localconfig files
     # across all PROJECTs, so we do something special with $localconfig,
@@ -189,7 +190,7 @@ sub FILESYSTEM {
     # the webserver.
     my %recurse_dirs = (
         # Writeable directories
-        "$datadir/template" => { files => CGI_READ,
+         $template_cache    => { files => CGI_READ,
                                   dirs => DIR_CGI_OVERWRITE },
          $attachdir         => { files => CGI_WRITE,
                                   dirs => DIR_CGI_WRITE },
diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm
index ee4d6cba2..46a4b6b72 100644
--- a/Bugzilla/Template.pm
+++ b/Bugzilla/Template.pm
@@ -633,7 +633,7 @@ sub create {
         ABSOLUTE => 1,
         RELATIVE => $ENV{MOD_PERL} ? 0 : 1,
 
-        COMPILE_DIR => bz_locations()->{'datadir'} . "/template",
+        COMPILE_DIR => bz_locations()->{'template_cache'},
 
         # Initialize templates (f.e. by loading plugins like Hook).
         PRE_PROCESS => ["global/initialize.none.tmpl"],
@@ -990,23 +990,27 @@ sub precompile_templates {
     my ($output) = @_;
 
     # Remove the compiled templates.
+    my $cache_dir = bz_locations()->{'template_cache'};
     my $datadir = bz_locations()->{'datadir'};
-    if (-e "$datadir/template") {
+    if (-e $cache_dir) {
         print install_string('template_removing_dir') . "\n" if $output;
 
         # This frequently fails if the webserver made the files, because
         # then the webserver owns the directories.
-        rmtree("$datadir/template");
+        rmtree($cache_dir);
 
         # Check that the directory was really removed, and if not, move it
         # into data/deleteme/.
-        if (-e "$datadir/template") {
+        if (-e $cache_dir) {
+            my $deleteme = "$datadir/deleteme";
+            
             print STDERR "\n\n",
                 install_string('template_removal_failed', 
-                               { datadir => $datadir }), "\n\n";
-            mkpath("$datadir/deleteme");
+                               { deleteme => $deleteme, 
+                                 template_cache => $cache_dir }), "\n\n";
+            mkpath($deleteme);
             my $random = generate_random_password();
-            rename("$datadir/template", "$datadir/deleteme/$random")
+            rename($cache_dir, "$deleteme/$random")
               or die "move failed: $!";
         }
     }
@@ -1071,10 +1075,10 @@ sub _do_template_symlink {
 
     my $abs_root  = dirname($abs_path);
     my $dir_name  = basename($abs_path);
-    my $datadir   = bz_locations()->{'datadir'};
-    my $container = "$datadir/template$abs_root";
+    my $cache_dir   = bz_locations()->{'template_cache'};
+    my $container = "$cache_dir$abs_root";
     mkpath($container);
-    my $target = "$datadir/template/$dir_name";
+    my $target = "$cache_dir/$dir_name";
     # Check if the directory exists, because if there are no extensions,
     # there won't be an "data/template/extensions" directory to link to.
     if (-d $target) {
diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl
index ca1bf6145..889bb12b2 100644
--- a/template/en/default/setup/strings.txt.pl
+++ b/template/en/default/setup/strings.txt.pl
@@ -389,8 +389,8 @@ EOT
 EOT
     template_precompile   => "Precompiling templates...",
     template_removal_failed => <<END,
-WARNING: The directory '##datadir##/template' could not be removed.
-         It has been moved into '##datadir##/deleteme', which should be
+WARNING: The directory '##template_cache##' could not be removed.
+         It has been moved into '##deleteme##', which should be
          deleted manually to conserve disk space.
 END
     template_removing_dir => "Removing existing compiled templates...",
-- 
2.24.1