#!/usr/bin/perl -w

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (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.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

##########################################################
#
# Find all xml type files and run 'tidy' on each.
# Intended to be run occasionally by committers.
#
# Developed only for UNIX, YMMV.
#
# Procedure:
# Run the script. It will descend the directory tree.
# Run with no parameters or -h to show usage.
#
# See http://forrest.apache.org/tasks.html#subversion-monitoring
#
##########################################################

use strict;
use vars qw($opt_h $opt_v);
use Getopt::Std;
use File::Basename;
use File::Find;

#--------------------------------------------------
# ensure proper usage
getopts("hv");
if ((scalar @ARGV < 2) || defined($opt_h)) {
  ShowUsage();
  exit;
}
my $startDir = shift;
if (!-e $startDir) {
  print STDERR "\nThe start directory '$startDir' does not exist.\n";
  ShowUsage();
  exit;
}
my $configFile = shift;
if (!-e $configFile) {
  print STDERR "\nThe configuration file '$configFile' does not exist.\n";
  ShowUsage();
  exit;
}

#--------------------------------------------------
# configuration
my $command = "tidy -config $configFile";
my @xmlFileTypes = (
  ".xml", ".xsl", ".xslt", ".xmap", ".xcat",
  ".xmap", ".xconf", ".xroles", ".roles", ".xsp", ".rss",
  ".xlog", ".xsamples", ".xtest", ".xweb", ".xwelcome",
  ".samplesxconf", ".samplesxpipe", ".svg", ".xhtml", ".jdo", ".gt", ".jx", ".jm
x",
  ".jxt", ".meta", ".pagesheet", ".stx", ".xegrm", ".xgrm", ".xlex", ".xmi",
  ".xsd", ".rng", ".rdf", ".rdfs", ".xul", ".tld", ".xxe", ".ft", ".fv",
);
my $countTotal = 0;

chdir "$startDir" or die "Cannot cd to '$startDir': $!\n";

#--------------------------------------------------
sub process_file {
  return unless -f && -T; # process only text files
  my $fileName = $File::Find::name;
  my ($file, $dir, $ext) = fileparse($fileName, qr/\.[^.]*/);
  return if ($dir =~ /\/\.svn\//); # skip SVN directories
  return if ($dir =~ /\/CVS\//); # skip CVS directories
  return if ($dir =~ /\/build\//); # skip build directories
  return if ($file =~ /^\./); # skip hidden files
  return unless isXmlType($ext); # process only xml files
  $fileName =~ s/^\.\///; # strip leading ./
  my $pathName = $startDir . "/" . $fileName;
  $countTotal++;
  if ($opt_v) { print "$pathName : \n"; }
  open (TIDY, "$command $pathName |") or die "Cannot run 'tidy': $!";
  while (<TIDY>) {
    print;
  }
  close TIDY;
}
find(\&process_file, ".");

#--------------------------------------------------
# report some statistics
print qq!
Processed $countTotal xml-type files.
!;
print "\n";

#==================================================
# isXmlType
#==================================================

sub isXmlType {
  my ($extension) = @_;
  foreach my $e (@xmlFileTypes) {
    return 1 if $extension eq $e;
  }
  return 0;
}

#==================================================
# ShowUsage
#==================================================

sub ShowUsage {
  print STDERR qq!
Usage: $0 [-h] [-v] startDir configFile > logfile

  where:
  startDir = The directory (pathname) to start processing. Will descend.
  configFile = Pathname for configuration file for 'tidy'

  option:
  h = Show this help message.
  v = Be verbose.

Note: It will skip directories with name /build/

HEADSUP: You need to have "tidy" installed in your system and 
         it must be in reachable via the commandline. 

!;
}
