# -*- 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 are the Bugzilla tests. # # The Initial Developer of the Original Code is Jacob Steenhagen. # Portions created by Jacob Steenhagen are # Copyright (C) 2001 Jacob Steenhagen. All # Rights Reserved. # # Contributor(s): Jacob Steenhagen # David D. Kilzer # Tobias Burnus # package Support::Templates; use strict; use lib 't'; use base qw(Exporter); @Support::Templates::EXPORT = qw(@languages @include_paths %include_path @referenced_files %actual_files $num_actual_files); use vars qw(@languages @include_paths %include_path @referenced_files %actual_files $num_actual_files); use Support::Files; use File::Find; use File::Spec; # The available template languages @languages = (); # The colon separated includepath per language %include_path = (); # All include paths @include_paths = (); # Files which are referenced in the cgi files @referenced_files = (); # All files sorted by include_path %actual_files = (); # total number of actual_files $num_actual_files = 0; # Scan for the template available languages and include paths { opendir(DIR, "template") || die "Can't open 'template': $!"; my @files = grep { /^[a-z-]+$/i } readdir(DIR); closedir DIR; foreach my $langdir (@files) { next if($langdir =~ /^CVS$/i); my $path = File::Spec->catdir('template', $langdir, 'custom'); my @dirs = (); push(@dirs, $path) if(-d $path); $path = File::Spec->catdir('template', $langdir, 'extension'); push(@dirs, $path) if(-d $path); $path = File::Spec->catdir('template', $langdir, 'default'); push(@dirs, $path) if(-d $path); next if(scalar(@dirs) == 0); push(@languages, $langdir); push(@include_paths, @dirs); $include_path{$langdir} = join(":",@dirs); } } my @files; # Local subroutine used with File::Find sub find_templates { # Prune CVS directories if (-d $_ && $_ eq 'CVS') { $File::Find::prune = 1; return; } # Only include files ending in '.tmpl' if (-f $_ && $_ =~ m/\.tmpl$/i) { my $filename; my $local_dir = File::Spec->abs2rel($File::Find::dir, $File::Find::topdir); # File::Spec 3.13 and newer return "." instead of "" if both # arguments of abs2rel() are identical. $local_dir = "" if ($local_dir eq "."); if ($local_dir) { $filename = File::Spec->catfile($local_dir, $_); } else { $filename = $_; } push(@files, $filename); } } # Scan the given template include path for templates sub find_actual_files { my $include_path = $_[0]; @files = (); find(\&find_templates, $include_path); return @files; } foreach my $include_path (@include_paths) { $actual_files{$include_path} = [ find_actual_files($include_path) ]; $num_actual_files += scalar(@{$actual_files{$include_path}}); } # Scan Bugzilla's perl code looking for templates used and put them # in the @referenced_files array to be used by the 004template.t test. my %seen; foreach my $file (@Support::Files::testitems) { open (FILE, $file); my @lines = ; close (FILE); foreach my $line (@lines) { if ($line =~ m/template->process\(\"(.+?)\", .+?\)/) { my $template = $1; # Ignore templates with $ in the name, since they're # probably vars, not real files next if $template =~ m/\$/; next if $seen{$template}; push (@referenced_files, $template); $seen{$template} = 1; } } } 1;