diff -r 000000000000 -r beb51793110d build/tools/check_filename_uniq.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/tools/check_filename_uniq.pl Mon Jan 18 21:35:57 2010 +0200 @@ -0,0 +1,299 @@ +# +# Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: See the usage-method below. +# + +use File::Find; +use File::Spec; +use Getopt::Long; +use strict; + +my $isFirstError = 1; +my @dirList; +my $resultFile = undef; +my %extHash; # hash which contains the wanted extensions as keys + +my $errString = qq( +The following filenames are not unique inside ADO. Note that if those +files are not part of compilation (listed in used bld.inf) => there +are no immediate problems. + +); + + +########################################### +# Conversion routine. +# - makes all dir separators to be "/" +# - removes any drive letter from beginig of path +######################################### +sub convertPath +{ + my $path = shift; + $path =~ s/\\/\//g; + $path =~ s/^[A-Za-z]\://; + $path =~ tr/A-Z/a-z/; + + return $path; +} + +########################################################################### +########################################################################### +sub usage +{ + print "\n"; + print "This script is intended to check the architectural domain (ADO)\n"; + print "directory hierarchy content in S60-build.\n"; + print "It checks that the filenames with given extensions\n"; + print "are uniq inside the give ADO structure.\n"; + print "\n"; + print "Usage:\n"; + print " $0 [-h|-help] [-t ] [-e ext1 -e ext2] -d -d \n"; + print "\n"; + print "Options:\n"; + print " -h : Show this help\n"; + print " -help : Show this help\n"; + print " -t : The name of the file, where the errors are written.\n"; + print " If not specified errors are written to STDOUT\n"; + print " -d : Absoluth path to the ADOs directory. The last item in the dir\n"; + print " should be the ADO name.\n"; + print " -e : file extensions that are checked.\n"; + print " If none given, then default value is \"-e mmp,mk\". \n"; + print " If one is specified then the default ones are not handled by default.\n"; + print "\n"; + print "Return values:\n"; + print " 0 : no errors found (or help wanted)\n"; + print " -1 : errors found in check\n"; + print " -2 : erronous command line parameters or in result file opening\n"; + print "\n"; + print "Usage example:\n"; + print " in the below example replace \"\" with real ado name\n"; + print " for example == messaging\n"; + print " perl $0 -t \my_path_results.txt -d \s60\app\\n"; + print "\n"; + print " Below one only checks txt-files\n"; + print " perl $0 -t \my_path_results.txt -e txt -d \s60\app\\n"; + print "\n"; + print "Limitations:\n"; + print " - No spaces allowed in the file or directory names !!!\n"; + print "\n"; +} + +########################################################################### +########################################################################### +sub errorUsage +{ + usage; + exit(-2); +} +########################################################################### +########################################################################### +sub okUsage +{ + usage; + exit(0); +} + +########################################################################### +# print results +########################################################################### +sub printError +{ + + if(defined($resultFile)) + { + if($isFirstError > 0) + { + $isFirstError = 0; + print FILEOUT $errString; + } + print FILEOUT join("",@_);; + } + else + { + if($isFirstError > 0) + { + $isFirstError = 0; + print STDOUT $errString; + } + print STDOUT join("",@_); + } +} + + +########################################################################### +# Parses the command line parameters from ARGV +# +# Params: - +# +# Return: - +# +########################################################################### +sub parseCmdLine +{ + my $incorrectParam = 0; + my @extList; + + if( ! GetOptions('t=s' => \$resultFile, + 'd=s' => \@dirList, + 'e=s' => \@extList, + 'h' => \&okUsage, + 'help' => \&okUsage, + '<>' => \&errorUsage)) + { + exit(-2); + } + + if(scalar(@dirList) == 0) + { + print STDERR "\nERROR: At least one directory has to be specified with -d\n"; + exit(-2); + } + + foreach (@dirList) + { + if(/\s+/) + { + print STDERR "\nERROR: No spaces allowed in directory names\n"; + exit(-2); + } + } + + # if no ext given => use the default values. + if(scalar(@extList) == 0) + { + $extHash{"mmp"} = 1; + $extHash{"mk"} = 1; + } + else + { + # handle the extensions given + foreach my $param (@extList) + { + my @items = split(",",$param); + foreach my $item (@items) + { + # remove spaces + $item =~ s/\s//g; + $item = convertPath($item); + $extHash{$item} = 1; + } + } + } +} + +########################################################################### +########################################################################### +sub handleFileopenError +{ + print STDERR "\nERROR: Unable to open $resultFile\n"; + exit(-2); +} + + +########################################### +# This function is called for each file by +# the "find" functionality. +########################################### +# contains all the erronous file names, details in the +# $refToFileHash +my $refToErrHash; +# content is: +# {filenamewithExt => (foundInDir1,foundInDir2)} +my $refToFileHash; + +#actual function +sub handleFile +{ + my $file = convertPath($_); + my $fileDir = convertPath(File::Spec->catfile(File::Spec->splitdir($File::Find::dir))); + + # the find seems to change the current dir => checking if the item is a dir + # should be done from curr Dir (we need to add the ./ so that the -d (testing if + # item is directory works) + if( -d "./$file") + { + return; + } + + # its a file, test wether the extension is what we want + my @tmpList = split(/\./,$file); + my $ext = pop @tmpList; + + if(defined($extHash{$ext})) + { + # is there same name already => if yes => error + if(defined($$refToFileHash{$file})) + { + $$refToErrHash{$file} = 1; + } + # 1st occurance. Add as new item into the refToFileHash + else + { + my @list; + $$refToFileHash{$file} = \@list; + } + push(@{$$refToFileHash{$file}},$fileDir); + } +} + +########################################################################### +# MAIN functionality +########################################################################### +parseCmdLine; +if(defined($resultFile)) +{ + open(FILEOUT,">$resultFile") || handleFileopenError; +} + +# handle each root dir as separate case. This way +# we do not have to worry about stuff between dirs +foreach my $dir (@dirList) +{ + my %errFileHash; + $refToErrHash = \%errFileHash; + my %fileHash; + $refToFileHash = \%fileHash; + + find(\&handleFile,($dir)); + + # After one base dir has been handled, then print the found + # errors related to that one. + + if(scalar(keys(%errFileHash)) > 0) + { + printError "\nUnder: $dir\n"; + foreach my $errFile (keys (%errFileHash)) + { + printError " $errFile found in:\n"; + foreach my $fileLoc (@{$fileHash{$errFile}}) + { + printError " $fileLoc\n"; + } + } + } + else + { + printError "\nNo errors found under $dir\n"; + } +} + +if(defined($resultFile)) +{ + close FILEOUT; +} + + + + +