blob: ee466495456d440ef1efb31e9ddcfe6938b5d856 [file] [log] [blame]
#!/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.
!;
}