add other files worth tracking
[mharc.git] / bin / apply-config
diff --git a/bin/apply-config b/bin/apply-config
new file mode 100755 (executable)
index 0000000..8f97654
--- /dev/null
@@ -0,0 +1,258 @@
+#!/usr/bin/perl
+##--------------------------------------------------------------------------##
+##  File:
+##     $Id: apply-config,v 1.15 2002/10/17 03:14:31 ehood Exp $
+##  Description:
+##     Processes all '.in' template files.
+##--------------------------------------------------------------------------##
+##  Copyright (C) 2002 Earl Hood <earl@earlhood.com>
+##
+##  This program is free software; you can redistribute it and/or modify
+##  it under the terms of the GNU General Public License as published by
+##  the Free Software Foundation; either version 2 of the License, or
+##  (at your option) any later version.
+##  
+##  This program is distributed in the hope that it will be useful,
+##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##  GNU General Public License for more details.
+##  
+##  You should have received a copy of the GNU General Public License
+##  along with this program; if not, write to the Free Software
+##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+##  02111-1307, USA
+##--------------------------------------------------------------------------##
+
+package MHArc::apply_config;
+
+##--------------------------------------------------------------------------##
+# <x-boot-strap>
+BEGIN { die qq/CGI use FORBIDDEN!\n/ if (defined($ENV{'GATEWAY_INTERFACE'})); }
+my $Dir; BEGIN { $Dir = `dirname $0`; chomp $Dir; }
+use lib "$Dir/../lib";  # Add relative lib to search path
+# </x-boot-strap>
+##--------------------------------------------------------------------------##
+# <x-config>
+use MHArc::Config;
+my $config = MHArc::Config->load("$Dir/../lib/config.sh");
+# </x-config>
+##--------------------------------------------------------------------------##
+
+use Getopt::Long;
+use File::Find;
+use MHArc::Util qw(run_prg usage);
+
+my $clean = 0;
+my $distclean = 0;
+my $debug = 0;
+my $noact = 0;
+my $verbose = 0;
+
+my $clstatus = GetOptions(
+    "clean!"     => \$clean,
+    "distclean!"  => \$distclean,
+    "debug!"     => \$debug,
+    "n!"         => \$noact,
+    "verbose!"   => \$verbose,
+
+    "help"       => \$help,
+    "man"        => \$man
+);
+usage(0) unless $clstatus;
+usage(1) if $help;
+usage(2) if $man;
+
+$verbose = 1  if $debug || $noact;
+$clean   = 1  if $distclean;
+$MHArc::Util::ECHO_CMDS = 1  if ($verbose);
+$MHArc::Util::ECHO_ONLY = 1  if ($noact);
+
+my %done = ( );
+
+if ($debug) {
+  $config->dump_config(\*STDERR);
+}
+
+sub wanted {
+  if ($_ =~ /config\.sh$/ ||
+      $_ =~ /config\.sh\.in$/ ||
+      $_ =~ /config\.sh\.dist$/ ||
+      $_ =~ /config\.sh\.in\.dist$/) {
+    print qq/Skipping config file "$File::Find::name"\n/  if $debug;
+    return;
+  }
+  if (-d $_ && ($_ =~ /RCS$/ || $_ =~ /CVS$/ || $_ =~ /SCCS$/)) {
+    print qq/Pruning "$File::Find::name"\n/  if $debug;
+    $File::Find::prune = 1;
+    return;
+  }
+  if (-d $_ || !/\.in(?:\.dist)?$/o) {
+    print qq/Ignoring "$File::Find::name"\n/  if $debug;
+    return;
+  }
+  if ($done{$File::Find::name}) {
+    print qq/Skipping "$File::Find::name", already processed.\n/
+       if $debug;
+    return;
+  }
+
+  my $file = $_;
+  print qq/Checking "$File::Find::name"...\n/  if $debug;
+  if ($file =~ s/\.dist$//) {
+    if (!$clean) {
+      if (! -e $file) {
+       run_prg('/bin/cp', $_, $file);
+       run_prg('/bin/chmod', 'u+w', $file);
+      }
+    }
+    $done{$File::Find::name} = 1;
+    $done{"$File::Find::dir/$file"} = 1;
+  }
+
+  my $file_out = $file;
+  $file_out =~ s/\.in$//;
+
+  if ($clean) {
+    run_prg('/bin/rm', $file_out)  if (-e $file_out);
+    run_prg('/bin/rm', $file)     if ($distclean && (-e $file) &&
+                                      (-e "$file.dist"));
+    return;
+  }
+
+  print qq|Processing "$File::Find::dir/$file"\n|  if $verbose;
+  if (!$noact) {
+    local(*IN, *OUT);
+    open(IN, $file) ||
+       die qq|ERROR: Unable to open "$File::Find::dir/$file": $!\n|;
+    open(OUT, ">$file_out") ||
+       die qq|ERROR: Unable to create "$File::Find::dir/$file_out": $!\n|;
+
+    my($line);
+    while (defined($line = <IN>)) {
+      $line =~ s/\@\@([^@]*)\@\@/$config->{$1}/g;
+      print OUT $line;
+    }
+    close(IN);
+    close(OUT);
+    if (-x $file) {
+      run_prg('/bin/chmod', 'a+x,go-w', $file_out);
+    }
+  }
+}
+
+if (!@ARGV) {
+  my $home = $config->{'SW_ROOT'};
+     $home = "$Dir/.."  unless $home;
+  push(@ARGV, $home);
+
+  my($dir);
+  foreach $dir ($config->{'HTML_DIR'},
+               $config->{'CGI_DIR'},
+               $config->{'MBOX_DIR'},
+               $config->{'INFO_DIR'},
+               $config->{'MKNMZ_TMPL_DIR'}) {
+
+    next  unless $dir =~ /\S/;
+    if (! -e $dir) {
+      warn qq/Warning: "$dir" does not exist\n/;
+      next;
+    }
+    $dir =~ s/\/+$//;
+    if ($dir !~ /^\Q$home\E\//o) {
+      push(@ARGV, $dir);
+    }
+  }
+}
+
+find(\&wanted, @ARGV);
+
+##--------------------------------------------------------------------------##
+__END__
+
+=head1 NAME
+
+apply-config - Process input template files based upon configuration settings.
+
+=head1 SYNOPSIS
+
+  apply-config [options] [dir ...]
+
+=head1 DESCRIPTION
+
+This program processes input template files and expands variables
+referenced to values specified in C<E<lt>mharc-rootE<gt>/lib/config.sh>.
+
+Template files are designated by the C<.in> filename extentions.  For a
+given file, if C<I<file>.in.dist> exists and C<I<file>.in> does not,
+C<I<file>.in.dist> will be copied to C<I<file>.in> before processing.
+
+Variable references in template files are denoted as follows:
+
+  @@VARIABLE_NAME@@
+
+If the specified variable name is defined, the reference will be
+replaced with the empty string.
+
+=head1 OPTIONS
+
+Any non-option arguments are treated as directories to recursively
+scan for template files.  If no directories are specified, then
+C<$SW_ROOT> is used as defined in C<E<lt>mharc-rootE<gt>/lib/config.sh>.
+
+=over
+
+=item -clean
+
+Remove all files that have a C<.in> version.  This option is useful
+to clean up all files generated from templates.
+
+=item -distclean
+
+Remove all files that have a C<.in> version and remove all C<.in>
+files that have a C<.in.dist> version.  This option is useful to
+clean up all files for generating a distribution bundle.
+
+B<WARNING:> Use this option with care since it will delete all
+customized versions of C<.in> templates.  This option is mainly
+for use by mharc developers.
+
+=item -debug
+
+Print out alot of information on what is going on.  This options
+prints out more information than C<-verbose>.
+
+=item -n
+
+Just echo what would be done, but do not do it.
+
+=item -verbose
+
+Echo out status on any operation that modifies files.
+
+=back
+
+=head1 FILES
+
+=over
+
+=item C<E<lt>mharc-rootE<gt>/lib/config.sh>
+
+Configuration file defining variables values.
+
+=back
+
+=head1 VERSION
+
+C<$Id: apply-config,v 1.15 2002/10/17 03:14:31 ehood Exp $>
+
+=head1 AUTHOR
+
+Earl Hood, earl@earlhood.com
+
+This program is part of the mharc archiving system and comes with
+ABSOLUTELY NO WARRANTY and may be copied only under the terms of
+the GNU General Public License, which may be found in the mhArc
+distribution.
+
+=cut
+