bldsystemtools/commonbldutils/check_tables.pl
branchRCL_3
changeset 5 d90029decf65
parent 4 a9d4531388d0
child 6 5e522efbae7b
--- a/bldsystemtools/commonbldutils/check_tables.pl	Wed Mar 31 23:20:42 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,519 +0,0 @@
-#
-# Copyright (c) 2009 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: 
-#
-#!Perl -w
-
-use strict;
-use Pod::Usage;
-use Getopt::Long;
-use FindBin;
-use FileHandle;
-use Net::SMTP;
-
-#--------------------------- GLOBAL VARIABLES ---------------------------#
-
-my $startDir = $FindBin::Bin;
-my %componentList; 		#This has the components from the export table.
-my @redundantComponents; #This is used by 2 methods. One populates it and 
-						 #the other reads it to remove the redundant 
-						 #components from the export table. 
-
-# The location of the export tables
-my $srcDir = $ENV{'SourceDir'};
-my $platform = $ENV{'Platform'};
-my $exportTableLocation =  "$srcDir\\os\\deviceplatformrelease\\symbianosbld\\productionbldcbrconfig\\"; 
-  
- 
-my $help = 0;
-my $man = 0;
-my $autoclean = 0;
-my $autoadd = 0;
-my $email = 0;
-
-my @report;
-my ($notification_address) = 'SysBuildSupport@symbian.com';
-my $message;
-
-# This has the components from the gt and tv components.txt
-# We need to manually put into the hash the following because these
-# are added by the release tools and are not explicitly mentioned in
-# the GTComponents.txt or TechviewComponents.txt
-my %mrpHashForProduct=(
-	"gt_techview_baseline" => 1,
-	"gt_only_baseline" => 1,
-	"gt_overwritten"=> 1,
-	"unresolved" => 1
-	);  
-
-# Just specify the export tables for each product
-my %exportTable = (
-		"8.0a" => "AutoCBR_Tornado_test_export.csv",
-		"8.1a" => "AutoCBR_8.1a_test_export.csv",
-		"8.0b" => "AutoCBR_Zephyr_test_export.csv",
-		"8.1b" => "AutoCBR_8.1b_test_export.csv",
-		"9.0"  => "AutoCBR_9.0_test_export.csv",
-		"9.1"  => "AutoCBR_9.1_test_export.csv",
-		"9.2" => "AutoCBR_9.2_test_export.csv",
-		"9.3" => "AutoCBR_9.3_test_export.csv",
-		"Intulo" => "AutoCBR_Intulo_test_export.csv",
-		"Future" => "AutoCBR_Future_test_export.csv",
-		"9.4" => "AutoCBR_9.4_test_export.csv",
-		"9.5" => "AutoCBR_9.5_test_export.csv",
-		"9.6" => "AutoCBR_9.6_test_export.csv",
-		"tb92" => "AutoCBR_tb92_test_export.csv",
-		"tb92sf" => "AutoCBR_tb92sf_test_export.csv",
-                "tb101sf" => "AutoCBR_tb101sf_test_export.csv"
-		);
-
-my %componentFiles = (
-		"8.0a" => {"gtonly" => $exportTableLocation."8.0a\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."8.0a\\techviewcomponents.txt"},		
-		"8.0b" => {"gtonly" => $exportTableLocation."8.0a\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."8.0a\\techviewcomponents.txt"},		
-		"8.1a" => {"gtonly" => $exportTableLocation."8.1a\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."8.1a\\techviewcomponents.txt"},
-		"8.1b" => {"gtonly" => $exportTableLocation."8.1b\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."8.1b\\techviewcomponents.txt"},
-		"9.0"  => {"gtonly" => $exportTableLocation."9.0\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.0\\techviewcomponents.txt"},
-		"9.1"  => {"gtonly" => $exportTableLocation."9.1\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.1\\techviewcomponents.txt"},
-		"9.2"  => {"gtonly" => $exportTableLocation."9.2\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.2\\techviewcomponents.txt"},
-		"9.3"  => {"gtonly" => $exportTableLocation."9.3\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.3\\techviewcomponents.txt"},		
-		"Intulo"  => {"gtonly" => $exportTableLocation."Intulo\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."Intulo\\techviewcomponents.txt"},
-		"Future"  => {"gtonly" => $exportTableLocation."Future\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."Future\\techviewcomponents.txt"},
-		"9.4"  => {"gtonly" => $exportTableLocation."9.4\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.4\\techviewcomponents.txt"},
-		"9.5"  => {"gtonly" => $exportTableLocation."9.5\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.5\\techviewcomponents.txt"},
-		"9.6"  => {"gtonly" => $exportTableLocation."9.6\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."9.6\\techviewcomponents.txt"},
-		"tb92"  => {"gtonly" => $exportTableLocation."tb92\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."tb92\\techviewcomponents.txt"},
-		"tb92sf"  => {"gtonly" => $exportTableLocation."tb92sf\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."tb92sf\\techviewcomponents.txt"},
-                "tb101sf"  => {"gtonly" => $exportTableLocation."tb101sf\\gtcomponents.txt",
-				   "tv" => $exportTableLocation."tb101sf\\techviewcomponents.txt"}
-
-
-	);
-
- 
-#------------------------ END OF GLOBAL VARIABLES -----------------------#
-
-
-# Utility function to print the keys of a hash ref (passed in).
-sub printHash
-{
-	my $hashRef = shift;
-	
-	foreach my $line(sort keys %{$hashRef})
-	{
-		push @report, $line."\n";
-		print $line."\n";
-	}
-}
-
-
-
-# Compare the components in the export table against
-# the components in the gt and tv components.txt files.
-sub compareTables
-{
-	my $product = shift;
-	
-	my $dirty = 0;
-	foreach my $key (sort keys %componentList)
-	{
-		if(exists $mrpHashForProduct{$key})
-		{
-			delete $mrpHashForProduct{$key};
-		}
-		else
-		{
-			push @redundantComponents, $key;
-		}
-	}
-	if (scalar (@redundantComponents) != 0)
-	{
-		$dirty =1;
-		$message = "\n*** The following components can be removed from $exportTable{$product}:\n\n";
-		print $message;
-		foreach my $line(@redundantComponents)
-		{
-			print $line."\n";
-		}
-	}
-	
-	if (scalar keys %mrpHashForProduct != 0)
-	{
-		$dirty = 1;
-		$message = "\n*** The following components are missing from $exportTable{$product}:\n\n";
-		push @report, $message;
-		print $message;
-		printHash(\%mrpHashForProduct);
-		
-		if ($email == 1)
-		{
-			&SendEmail("WARNING: For Symbian_OS_v$product: $exportTable{$product} is not up to date\n ",@report);
-		}
-	}
-	
-	if ($dirty == 0)
-	{
-		print "$exportTable{$product} is up to date\n";
-	}
-}
-# Get the components that are listed in the export table for the 
-# product. 
-
-sub getExportTableComponents
-{
-
-	my $product = shift;
-	my $expTable = $exportTableLocation."$product\\".$exportTable{$product};
-	
-	open(EXP_TABLE,"<$expTable") or die("Cannot open export table:\n$expTable");
-	
-	foreach my $line (<EXP_TABLE>)
-	{
-		if ($line =~ /\A([^\#,].+?),/)  #Capture the component name. Ignore '#' or ',' if at beginning of line
-		{
-			$line = lc($1);
-			$line =~ s/\s+//g;
-			$line =~ s/\t+//g;
-			
-			if (not exists $componentList{$line})
-			{
-				$componentList{$line} = 1;
-			}
-			else 
-			{
-				print "Duplicate in export table: $line\n";
-			}
-		}
-	}
-	close EXP_TABLE;
-}
-
-# Get the components from the gt and techview components.txt
-sub getComps
-{
-	my $tvfile = shift;
-	my $product = shift;
-	my $rv = shift;
-	 
-	my @mrpContents = split /\n/, $rv;
-	
-	foreach my $componentsLine (@mrpContents)
-	{
-		my $component = lc((split /[\s\t]/, $componentsLine)[0]);
-		if (not exists $mrpHashForProduct{$component})
-		{
-			$mrpHashForProduct{$component} =1;
-		}
-		else
-		{
-			print "Duplicate in gt/tv component: $component \n";
-		}
-	}
-	undef @mrpContents;
-	
-	#We make the assumption that the techviewcomponents.txt is 
-	#in the same location as the gtcomponents.txt for a given 
-	#product.
-	open(TXT1, "<$tvfile") || die("Failed to find the components file for product $product"); 
-	undef $/;
-	$rv = <TXT1>;
-	close(TXT1);
-
-	@mrpContents = split /\n/, $rv;
-	foreach my $componentsLine (@mrpContents)
-	{
-		my $component = lc((split /[\s\t]/, $componentsLine)[0]);
-		if (not exists $mrpHashForProduct{$component})
-		{
-			$mrpHashForProduct{$component} =1;
-		}
-		else
-		{
-			print "Duplicate in gt/tv component: $component \n";
-		}
-	}
-}
-
-# Get the location where the gt and techview components.txt 
-# are in. Get the contents of the gtcomponents.txt. The 
-# contents of the techviewcomponents.txt are gotten in getComps
-# function. 
-sub getGtAndTvFiles
-{
-	my $product = shift; 
-	
-	my $rv;
-	my $gtfilename = $componentFiles{$product}->{"gtonly"};
-	my $tvfilename = $componentFiles{$product}->{"tv"};
-	
-	open(TXT2, "<$gtfilename") || die("Failed to find the components file for product $product");
-	undef $/;
-	$rv = <TXT2>;
-	close(TXT2);
-	
-	getComps($tvfilename, $product, $rv);
-	
-# 	if ($rv !~ /no such file/)
-# 	{
-# 		my $tvfilename = "//EPOC/master/beech/product/tools/makecbr/files/$product/techviewcomponents.txt";
-# 		getComps($tvfilename, $product, $rv);
-# 		return;
-# 	}	
-# 	
-# 	$gtfilename = "//EPOC/master/os/deviceplatformrelease/symbianosbld/productionbldcbrconfig/$product/gtcomponents.txt";
-# 	$rv =  `p4 print -q $gtfilename 2>&1`;
-# 	
-# 	if ($rv !~ /no such file/)
-# 	{
-# 		my $tvfilename = "//EPOC/master/os/deviceplatformrelease/symbianosbld/productionbldcbrconfig/$product/techviewcomponents.txt";
-# 		getComps($tvfilename, $product, $rv);
-# 		return;
-# 	}
-#	die("Failed to find the Components file for product $product");
-}
-
-sub autoclean ($)
-{
-	my $product = shift; 
-	my $expTable = $exportTableLocation."$product\\".$exportTable{$product};
-	my %redundantComponentsHash;
-		
-	my $cleanexpTable = $exportTable{$product};
-	$cleanexpTable =~ s/\.csv//;
-	$cleanexpTable = $startDir."\\"."${cleanexpTable}.csv"; 
-    
-    if ($autoclean == 1)
-    {
-        print "********** Removing redundant components **********\n";
-    }
-	#open the export table
-	open(INPUT, "<$expTable") or die ("Could not open $expTable for read\n");
-	
-	#create the clean table
-	open(OUTPUT, ">$cleanexpTable") or die ("Could not create $cleanexpTable\n");
-	
-	foreach my $key (@redundantComponents)
-	{
-		#print $key."\n";
-		if (not exists $redundantComponentsHash{$key})
-		{
-			 $redundantComponentsHash{$key} = 1;
-		}
-	}
-	foreach my $line (<INPUT>)
-	{
-		if ($line =~ /\A([^\#,].+?),/)
-		{
-			my $component = lc($1);
-			$component =~ s/\s+//g;
-			$component =~ s/\t+//g;
-			
-			if ((not exists $redundantComponentsHash{$component}) || 
-			    ($autoclean == 0))
-			{
-				#print "Adding $line in $cleanexpTable\n";
-				print OUTPUT $line; 
-			}
-		}
-		else 
-		{
-			print OUTPUT $line; 
-		}
-	}
-	
-	#Warning: This sets the position in INPUT to the beginning of the file!
-	my $curPos = tell(INPUT);
-	seek(INPUT, 0,0);
-    my $firstLine = <INPUT>;
-    my @cells = split /,/, $firstLine;
-    my $numOfKeys = scalar(@cells) -1;
-	#restore the position in INPUT
-	seek (INPUT, $curPos,0);
-	
-	#Now add the missing components
-	if (((keys %mrpHashForProduct)> 0) && ($autoadd == 1))
-	{
-	   print OUTPUT "\n\n\#Automatically added componments - NEED CHECKING!\n";
-	   print "**********   Adding missing components   **********\n";
-	
-       foreach my $missingComponent (sort keys %mrpHashForProduct)
-       {
-    	   my $categoriesString;
-    	   my $counter = 0;
-    	   for ($counter = 0; $counter < $numOfKeys; $counter++)
-    	   {
-    	       $categoriesString = $categoriesString."D E F G,";
-    	   }
-    	   my $string = $missingComponent.",".$categoriesString;
-    	   
-    	   #remove the extra ',' from the string
-    	   chop($string);
-    	   print OUTPUT $string."\n";
-       }
-	}
-	print "Closing files\n";
-	close(INPUT);
-	close (OUTPUT);
-}
-
-# Send Email
-sub SendEmail
-{
-  my ($subject, @body) = @_;
-  my (@message);
-  
-  #return 1; # Debug to stop email sending
-  
-  push @message,"From: $ENV{COMPUTERNAME}\n";
-  push @message,"To: $notification_address\n";
-  push @message,"Subject: $subject\n";
-  push @message,"\n";
-  push @message,@body;
-  
-  my $smtp = Net::SMTP->new('lonsmtp.intra', Hello => $ENV{COMPUTERNAME}, Debug   => 0);
-  $smtp->mail();
-  $smtp->to($notification_address);
-  
-  $smtp->data(@message) or die "ERROR: Sending message because $!";
-  $smtp->quit;
-
-}
-
-sub main
-{
-
-	GetOptions('help|?' => \$help, 'man' =>\$man, 'remove' =>\$autoclean,
-	           'add' => \$autoadd, 'e' => \$email) or pod2usage(-verbose => 2);
-	pod2usage(-verbose => 1) if $help == 1;
-	pod2usage(-verbose => 2) if $man == 1;
-	
-	if ($#ARGV < 0)
-	{
-		pod2usage(-verbose => 0);
-	}
-	
-	print "******** $ARGV[0] ********\n";
-	my $prod = shift @ARGV;
-
-        my $isTestBuild = $ENV{'PublishLocation'};
-
-        if ($isTestBuild =~ m/Test/i)
-
-       {
-   
-         $email = 0 ;
-
-         print "\nThis is a test build, no need to export\n";
-
-         exit 1;
-
-       }
-
-      
-	if (not exists $exportTable{$prod})
-	{
-		print "ERROR: Product is invalid\n";
-		print "Aborting...\n";
-		exit;
-       
-	}
-
-	
-	getExportTableComponents($prod);
-	getGtAndTvFiles($prod);
-	compareTables($prod);
-	if (($autoclean == 1) || ($autoadd == 1) )
-	{
-		autoclean($prod);
-	}
-}
-
-main();
-
-=pod
-
-=head1 NAME
-
-check_tables.pl - Check the export tables for a product against the components that are in the product.
-
-=head1 SYNOPSIS
-
-check_tables.pl [options] <product>
-
- Options:
-   -help			brief help message
-   -man 			full documentation
-   -remove			Automatically remove redundant components. See below for details.
-   -add             Automatically add missing components. See below for details. 
-   -e				Sends a notification email if a component is missing from export table.
-
-=head1 OPTIONS
-
-=over 8
-
-=item B<-help>
-
-Prints a brief help message and exits
-
-=item B<-man>
-
-Prints the manual page and exists
-
-=item B<-remove>
-
-Create a clean version of the export table by removing the redundant entries.
-The clean table will be placed in the directory where the tool was run from 
-and will have the same name as the export table in perforce. You will need to  
-copy it to where you have your Perforce changes mapped in your client. 
-
-=item B<-add>
-
-The same as -remove but will automatically add the missing components. The 
-componenets are added with categories D E F and G. 
-
-=item B<-e>
-
-Sends a notification email to SysBuildSupport@Symbian.com if any components
-are missing from the export table.
-
-=back
-
-=head1 DESCRIPTION
-
-B<This program> will take a product as an argument and will check the 
-export table for that product for consistency. It will report any 
-redundant entries in the export table and also any components that are
-missing. It will also report any duplicate entries in the export table
-itself. If no problems are found it will report that the tables are 
-up to date. 
-
-=head1 VERSION
-
-$Id: //SSS/release/sf/tb92/os/buildtools/bldsystemtools/commonbldutils/check_tables.pl#2 $
-$Change: 1761838 $  $DateTime: 2010/02/11 15:04:36 $
-
-=cut