Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 6 Jan 2012 12:40:14 +0000 (13:40 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 6 Jan 2012 12:40:14 +0000 (13:40 +0100)
SL/InstallationCheck.pm
scripts/installation_check.pl

index 5f97768..70d6217 100644 (file)
@@ -54,6 +54,32 @@ sub module_available {
   return eval "use $module $version; 1";
 }
 
+sub check_kpsewhich {
+  my $exit = system("which kpsewhich > /dev/null");
+
+  return $exit > 0 ? 0 : 1;
+}
+
+sub template_dirs {
+  my ($path) = @_;
+  opendir my $dh, $path || die "can't open $path";
+  my @templates = sort grep { !/^\.\.?$/ } readdir $dh;
+  close $dh;
+
+  return @templates;
+}
+
+sub classes_from_latex {
+  my ($path, $class) = @_;
+  open my $pipe, q#egrep -rs '^[\ \t]*# . "$class' $path". q# | sed 's/ //g' | awk -F '{' '{print $2}' | awk -F '}' '{print $1}' |#;
+  my @cls = <$pipe>;
+  close $pipe;
+
+  # can't use uniq here
+  my %class_hash = map { $_ => 1 } map { s/\n//; $_ } split ',', join ',', @cls;
+  return sort keys %class_hash;
+}
+
 my %conditional_dependencies;
 
 sub check_for_conditional_dependencies {
index 6a558ab..3a81c85 100755 (executable)
@@ -4,45 +4,122 @@ use strict;
 use Getopt::Long;
 use Pod::Usage;
 use Term::ANSIColor;
-
+our $master_templates;
 BEGIN {
   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
   push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
+
+  # this is a default dir. may be wrong in your installation, change it then
+  $master_templates = './templates/print/';
 }
 
 use SL::InstallationCheck;
 
+my %check;
+Getopt::Long::Configure ("bundling");
 GetOptions(
-  "verbose"   => \ my $v,
-  "all"       => \ my $a,
-  "optional!" => \ my $o,
-  "devel!"    => \ my $d,
-  "required!" => \ ( my $r = 1 ),
-  "help"      => sub { pod2usage(-verbose => 2) },
-  "color"     => \ ( my $c = 1 ),
+  "v|verbose"   => \ my $v,
+  "a|all"       => \ $check{a},
+  "o|optional!" => \ $check{o},
+  "d|devel!"    => \ $check{d},
+  "l|latex!"    => \ $check{l},
+  "r|required!" => \ $check{r},
+  "h|help"      => sub { pod2usage(-verbose => 2) },
+  "c|color!"    => \ ( my $c = 1 ),
 );
 
-$d = $r = $o = 1 if $a;
+# if notihing is requested check "required"
+$check{r} = 1 unless defined $check{a} ||
+                     defined $check{l} ||
+                     defined $check{o} ||
+                     defined $check{d};
+
+if ($check{a}) {
+  foreach my $check (keys %check) {
+    $check{$check} = 1 unless defined $check{$check};
+  }
+}
+
 
 $| = 1;
 
-if ($r) {
-  check($_, required => 1) for @SL::InstallationCheck::required_modules;
+if ($check{r}) {
+  print_header('Checking Required Modules');
+  check_module($_, required => 1) for @SL::InstallationCheck::required_modules;
+}
+if ($check{o}) {
+  print_header('Checking Optional Modules');
+  check_module($_, optional => 1) for @SL::InstallationCheck::optional_modules;
+}
+if ($check{d}) {
+  print_header('Checking Developer Modules');
+  check_module($_, devel => 1) for @SL::InstallationCheck::developer_modules;
+}
+if ($check{l}) {
+  check_latex();
+}
+
+sub check_latex {
+  my ($res) = check_kpsewhich();
+  print_result("Looking for LaTeX kpsewhich", $res ? ('ok', 'green') : ('NOT ok', 'red'));
+  if ($res) {
+    check_template_dir($_) for SL::InstallationCheck::template_dirs($master_templates);
+  }
+}
+
+sub check_template_dir {
+  my ($dir) = @_;
+  my $path  = $master_templates . $dir;
+
+  print_header("Checking LaTeX Dependencies for Master Templates '$dir'");
+  kpsewhich($path, 'cls', $_) for SL::InstallationCheck::classes_from_latex($path, '\documentclass');
+  kpsewhich($path, 'sty', $_) for SL::InstallationCheck::classes_from_latex($path, '\usepackage');
 }
-if ($o) {
-  check($_, optional => 1) for @SL::InstallationCheck::optional_modules;
+
+our $mastertemplate_path = './templates/print/';
+
+sub check_kpsewhich {
+  return 1 if SL::InstallationCheck::check_kpsewhich();
+
+  print STDERR <<EOL if $v;
++------------------------------------------------------------------------------+
+  Can't find kpsewhich, is there a proper installed LaTeX?
+  On Debian you may run "aptitude install texlive-base-bin"
++------------------------------------------------------------------------------+
+EOL
+  return 0;
 }
-if ($d) {
-  check($_, devel => 1) for @SL::InstallationCheck::developer_modules;
+
+sub kpsewhich {
+  my ($dw, $type, $package) = @_;
+  $package =~ s/[^-_0-9A-Za-z]//g;
+  my $type_desc = $type eq 'cls' ? 'document class' : 'package';
+
+  my $exit = system(qq|TEXINPUTS=".:$dw:" kpsewhich $package.$type > /dev/null|);
+  my $res  = $exit > 0 ? 0 : 1;
+
+  print_result("Looking for LaTeX $type_desc $package", $res);
+  if (!$res) {
+    print STDERR <<EOL if $v;
++------------------------------------------------------------------------------+
+  LaTeX $type_desc $package could not be loaded.
+
+  On Debian you may find the needed *.deb package with:
+    apt-file search $package.$type
+
+  Maybe you need to install apt-file first by:
+    aptitude install apt-file && apt-file update
++------------------------------------------------------------------------------+
+EOL
+  }
 }
 
-sub check {
+sub check_module {
   my ($module, %role) = @_;
 
   my $line = "Looking for $module->{fullname}";
-  print $line;
   my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
-  print dot_pad(length $line, $res ? 2 : 6, $res ? mycolor("ok", 'green') : mycolor("NOT ok", 'red')), $/;
+  print_result($line, $res);
 
   return if $res;
 
@@ -52,7 +129,7 @@ sub check {
     : $role{devel}    ? 'It is OPTIONAL for Lx-Office and only useful for developers.'
     :                   'It is not listed as a dependancy yet. Please tell this the developers.';
 
-  my @source_texts = source_texts($module);
+  my @source_texts = module_source_texts($module);
   local $" = $/;
   print STDERR <<EOL if $v;
 +------------------------------------------------------------------------------+
@@ -68,7 +145,7 @@ sub check {
 EOL
 }
 
-sub source_texts {
+sub module_source_texts {
   my ($module) = @_;
   my @texts;
   push @texts, <<EOL;
@@ -94,12 +171,17 @@ sub mycolor {
   return colored(@_);
 }
 
-sub dot_pad {
-  my ($s, $l, $text) = @_;
-  print " ";
-  print '.' x (80 - $s - 2 - $l);
-  print " ";
-  return $text;
+sub print_result {
+  my ($test, $exit) = @_;
+  print $test, " ", ('.' x (72 - length $test));
+  print $exit ? '.... '. mycolor('ok', 'green') : ' '. mycolor('NOT ok', 'red');
+  print "\n";
+  return;
+}
+
+sub print_header {
+  print $/;
+  print "$_[0]:", $/;
 }
 
 1;
@@ -118,21 +200,35 @@ scripts/installation_check.pl - check Lx-Office dependancies
 
 =head1 DESCRIPTION
 
-List all modules needed by Lx-Office, probes for them, and warns if one is not available.
+Check dependencys. List all perl modules needed by Lx-Office, probes for them,
+and warns if one is not available.  List all LaTeX document classes and
+packages needed by Lx-Office master templates, probes for them, and warns if
+one is not available.
+
+
+=head1 OPTIONS
 
 =over 4
 
 =item C<-a, --all>
 
-Probe for all modules.
+Probe for all perl modules and all LaTeX master templates.
 
 =item C<-c, --color>
 
 Color output. Default on.
 
+=item C<--no-color>
+
+No color output. Helpful to avoid terminal escape problems.
+
 =item C<-d, --devel>
 
-Probe for developer dependancies. (Used for console  and tags file)
+Probe for perl developer dependancies. (Used for console  and tags file)
+
+=item C<--no-devel>
+
+Don't probe for perl developer dependancies. (Useful in combination with --all)
 
 =item C<-h, --help>
 
@@ -142,13 +238,29 @@ Display this help.
 
 Probe for optional modules.
 
+=item C<--no-optional>
+
+Don't probe for optional perl modules. (Useful in combination with --all)
+
 =item C<-r, --required>
 
-Probe for required modules (default).
+Probe for required perl modules (default).
+
+=item C<--no-required>
+
+Don't probe for required perl modules. (Useful in combination with --all)
+
+=item C<-l. --latex>
+
+Probe for LaTeX documentclasses and packages in master templates.
+
+=item C<--no-latex>
+
+Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all)
 
 =item C<-v. --verbose>
 
-Print additional info for modules that are missing
+Print additional info for missing dependancies
 
 =back
 
@@ -178,5 +290,6 @@ Version requirements not fully tested yet.
 
   Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
   Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
+  Wulf Coulmann E<lt>wulf@coulmann.deE<gt>
 
 =cut