diff -r 000000000000 -r 83f4b4db085c toolsandutils/productionbldtools/compare_kit_content.pl --- /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 = ; + 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 = ; + close UNZIP; + + open UNZIP, "unzip -l $zip2 |" or usage("cannot read $zip2 as zip archive"); + my @lines2 = ; + 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