toolsandutils/productionbldtools/compare_kit_content.pl
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolsandutils/productionbldtools/compare_kit_content.pl	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,264 @@
+#! perl
+
+# Copyright (c) 2008-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:
+# Compare the sdkpkg lists for corresponding packages in two kits.
+# 
+#
+
+use strict;
+use Getopt::Long;
+
+my $toolVersion = "0.1";
+
+sub usage($)
+	{
+	my ($errmsg) = @_;
+	print STDERR "\ncompare_kit_content.pl - Version $toolVersion\n";
+
+	print "$errmsg\n" if ($errmsg);
+	
+	print STDERR << 'END_OF_HELP';
+
+Usage: compare_kit_content [-subset exp] [-temp dir] [-123] kit1 kit2
+
+Compare the two kits, by matching the sdkpkg files in each kit and comparing the
+list of contents for each package. Each kit can be specified either as a zip file
+or an unpacked directory.
+
+Options:
+-subset exp        Compare only packages with names matching exp
+-temp dir          Use dir as the location for temporary files
+-123               Controls the output: 1 = left only, 2= right only, 3= both (default 12)
+
+END_OF_HELP
+
+	exit(1);
+	}
+
+
+my $subset = "";
+my $temp = "";
+my $verbose = 0;
+my $help = 0;
+my $leftonly = 0;
+my $rightonly = 0;
+my $both = 0;
+
+# 1. Check arguments, output help etc.
+
+GetOptions (
+	'h|help' => \$help,				# print help message
+	'v+' => \$verbose,				# print extra diagnostic info
+	's|subset=s' => \$subset,		# pattern to match 
+	't|temp=s' => \$temp,	        # temporary directory
+	'1' => \$leftonly,	            # display files only in kit1
+	'2' => \$rightonly,	        # display files only in kit2
+	'3' => \$both,	                # display files present in both kits
+	);
+
+usage("") if ($help);
+usage("must specify two kits") if (@ARGV != 2);
+
+usage ("temp directory $temp does not exist") if ($temp ne "" && ! -d $temp);
+
+if ($leftonly==0 && $rightonly==0 && $both==0)
+	{
+	$leftonly = 1;
+	$rightonly = 1;
+	}
+
+sub leftfiles(@)
+	{
+	return if ($leftonly == 0 || scalar @_ == 0);
+	print "left:\t",join("\nleft:\t",sort @_), "\n";
+	}
+sub rightfiles(@)
+	{
+	return if ($rightonly == 0 || scalar @_ == 0);
+	print "right:\t",join("\nright:\t",sort @_), "\n";
+	}
+sub bothfiles(@)
+	{
+	return if ($both == 0 || scalar @_ == 0);
+	print "both:\t",join("\nboth:\t",sort @_), "\n";
+	}
+
+my ($kit1, $kit2) = @ARGV;
+
+# 2. Get the kit content list for both kits
+
+sub kit_content($)
+	{
+	my ($kit) = @_;
+	
+	if (-f "$kit\\package-list.xml.zip")
+		{
+		opendir DIR, $kit or usage("cannot read $kit directory: $!");
+		my @contents = grep /\.sdkpkg$/, readdir DIR;
+		closedir DIR;
+		
+		return "dir", @contents;
+		}
+	
+	usage("$kit is not a valid kit directory") if (!-f $kit);
+	
+	open UNZIP, "unzip -l $kit |" or usage("cannot read $kit as zip archive");
+	my @lines = <UNZIP>;
+	close UNZIP;
+	
+	#  36836436  07-12-08 02:59   com.symbian.api.GT-arm_0_0_M04604_Symbian_OS_v9.5.sdkpkg
+	my @contents;
+	foreach my $line (@lines)
+		{
+		if ($line =~ /\s(\S+\.sdkpkg)$/)
+			{
+			push @contents, $1;
+			}
+		}
+	return "zip", @contents;
+	}
+
+my ($kit1_type,@kit1_contents) = kit_content($kit1);
+my ($kit2_type,@kit2_contents) = kit_content($kit2);
+
+sub compare_package_files($$)
+	{
+	my ($zip1,$zip2) = @_;
+
+	open UNZIP, "unzip -l $zip1 |" or usage("cannot read $zip1 as zip archive");
+	my @lines1 = <UNZIP>;
+	close UNZIP;
+
+	open UNZIP, "unzip -l $zip2 |" or usage("cannot read $zip2 as zip archive");
+	my @lines2 = <UNZIP>;
+	close UNZIP;
+
+	#     699790  12-20-07 00:14   [emul]/epoc32/release/ARMV5/LIB/SipCodec.lib
+	my %zip1_files;
+	foreach my $line (@lines1)
+		{
+		next if ($line !~ /\s\d\d:\d\d\s+(\S.*)$/);
+		$zip1_files{$1} = 1;
+		}
+
+	my @mismatches;
+	my @bothlist;
+	foreach my $line (@lines2)
+		{
+		next if ($line !~ /\s\d\d:\d\d\s+(\S.*)$/);
+		my $file = $1;
+		
+		if (!defined $zip1_files{$file})
+			{
+			push @mismatches, $file;
+			next;
+			}
+		push @bothlist, $file;
+		delete $zip1_files{$file};	# matched - remove from the hash 
+		}
+	
+	bothfiles(@bothlist);
+	rightfiles(@mismatches);
+	leftfiles(keys %zip1_files);
+	}
+
+sub compare_packages($$$$)
+	{
+	my ($type1,$package1,$type2,$package2) = @_;
+	my @unzip = ("unzip", "-j");
+	my $tempdir = ".\\";
+	if ($temp ne "")
+		{
+		push @unzip, ("-d", "$temp");
+		$tempdir = "$temp\\";
+		}
+	
+	my @unlink_temporaries = ();
+	if ($type1 eq "zip")
+		{
+		my $expected_file = $tempdir.$package1;
+		system @unzip,$kit1,$package1;
+		usage ("failed to read $package1 from $kit1") if (! -f $expected_file);
+		push @unlink_temporaries, $expected_file;
+		$package1 = $expected_file;
+		}
+	else
+		{
+		$package1 = $kit1."\\".$package1;
+		}
+	if ($type2 eq "zip")
+		{
+		my $expected_file = $tempdir.$package2;
+		system @unzip,$kit2,$package2;
+		usage ("failed to read $package2 from $kit2") if (! -f $expected_file);
+		push @unlink_temporaries, $expected_file;
+		$package2 = $expected_file;
+		}
+	else
+		{
+		$package2 = $kit2."\\".$package2;
+		}
+	compare_package_files($package1, $package2);
+	
+	unlink @unlink_temporaries if (scalar @unlink_temporaries != 0);
+	}
+
+# 3. sort the lists, eliminating the version information
+
+print "left  ($kit1_type) = $kit1\n";
+print "right ($kit2_type) = $kit2\n";
+
+my %kit1_lookup;
+foreach my $package (sort @kit1_contents)
+	{
+	my $rootname = $package;
+	if ($package =~ /^([^_]*_)\d+_\d+_\S+\.sdkpkg$/)
+		{
+		$rootname = $1;
+		next if ($subset ne "" && $rootname !~ /$subset/i);
+		}
+	$kit1_lookup{$rootname} = $package;
+	}
+
+my @missing_packages;
+
+foreach my $package (sort @kit2_contents)
+	{
+	my $rootname = $package;
+	if ($package =~ /^([^_]*_)\d+_\d+_\S+\.sdkpkg$/)
+		{
+		$rootname = $1;
+		next if ($subset ne "" && $rootname !~ /$subset/i);
+		}
+	my $kit1_package = $kit1_lookup{$rootname};
+	
+	if (!defined $kit1_package)
+		{
+		push @missing_packages, "* $package is only in $kit2\n" if ($rightonly);
+		next;
+		}
+	
+	print "Comparing $rootname...\n";
+	compare_packages($kit1_type, $kit1_package, $kit2_type, $package);
+	delete $kit1_lookup{$rootname};
+	}
+
+foreach my $rootname (sort keys %kit1_lookup)
+	{
+	my $kit1_package = $kit1_lookup{$rootname};
+	push @missing_packages, "* $kit1_package is only in $kit1\n" if ($leftonly);
+	}
+	
+print sort @missing_packages;
\ No newline at end of file