#!/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 () { 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. !; }