--- /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 <theResultFilename>] [-e ext1 -e ext2] -d <dir1> -d <dir2> \n";
+ print "\n";
+ print "Options:\n";
+ print " -h : Show this help\n";
+ print " -help : Show this help\n";
+ print " -t <theFilename> : The name of the file, where the errors are written.\n";
+ print " If not specified errors are written to STDOUT\n";
+ print " -d <dir1> : Absoluth path to the ADOs directory. The last item in the dir\n";
+ print " should be the ADO name.\n";
+ print " -e <ext1> : 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 \"<myadoname>\" with real ado name\n";
+ print " for example <myadoname> == messaging\n";
+ print " perl $0 -t \my_path_results.txt -d \s60\app\<myadoname>\n";
+ print "\n";
+ print " Below one only checks txt-files\n";
+ print " perl $0 -t \my_path_results.txt -e txt -d \s60\app\<myadoname>\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;
+}
+
+
+
+
+