--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bldsystemtools/commonbldutils/delta_zip.pl Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,199 @@
+# Copyright (c) 1999-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:
+#
+
+use Getopt::Long;
+GetOptions("v", "x=s@");
+
+if (@ARGV<2)
+ {
+#........1.........2.........3.........4.........5.........6.........7.....
+ print <<USAGE_EOF;
+
+Usage:
+ delta_zip zipfile dir1 [dir2 ...] [-x excludezip ] [-x pattern]
+
+Create <zipfile> which contains the tree rooted at <dir1>,
+excluding all files listed in <excludezip>, and optionally
+all files which match the specified Perl patterns.
+
+This is done with "zip zipfile -@", with the appropriately
+filtered list of files supplied as standard input.
+
+USAGE_EOF
+ exit 1;
+ }
+
+my $zipfile = shift;
+die "$zipfile already exists\n" if (-e $zipfile);
+
+#--------
+# Find the basic list of files
+#
+
+my %filelist;
+my $filecount = 0;
+my $arg = shift;
+
+while ($arg ne "")
+ {
+ if (-d $arg)
+ {
+ add_dir($arg);
+ }
+ elsif (-e $arg)
+ {
+ add_file($arg);
+ }
+ else
+ {
+ print "Cannot find $arg - ignored\n";
+ }
+ print "$filecount files after processing $arg\n";
+
+ $arg = shift;
+ next;
+ }
+
+#--------
+# Remove excluded files
+#
+
+foreach $arg (@opt_x)
+ {
+ if (-e $arg)
+ {
+ exclude_zip($arg);
+ }
+ else
+ {
+ exclude_pattern($arg);
+ }
+ print "$filecount files after excluding $arg\n";
+ $arg = shift;
+ }
+
+print "Invoking \"zip $zipfile -@\"\n";
+
+open ZIPOUT, "| zip $zipfile -@";
+foreach $arg ( sort keys %filelist)
+ {
+ if ($filelist{$arg} ne "")
+ {
+ print ZIPOUT "$filelist{$arg}\n";
+ }
+ }
+
+close ZIPOUT;
+die "Problems creating zip file\n" if ($? != 0);
+
+exit 0;
+
+
+#------------------------------------------------------------
+
+sub add_file
+ {
+ my ($file) = @_;
+ my $key = lc $file;
+
+ $key =~ s-/-\\-g; # convert / to \ for path separators
+ $key =~ s/^\\//; # remove leading \ since it won't appear in zip files
+ if ($filelist{$key} ne "")
+ {
+ die "Duplicate file $file\n";
+ }
+ $filelist{$key} = $file;
+ $filecount += 1;
+ }
+
+sub exclude_file
+ {
+ my ($file) = @_;
+ my $key = lc $file;
+
+ $key =~ s-/-\\-g; # convert / to \ for path separators
+ $key =~ s/^\\//; # remove leading \ since it won't appear in zip files
+ if ($filelist{$key} ne "")
+ {
+ delete $filelist{$key};
+ $filecount -= 1;
+ }
+ }
+
+sub exclude_pattern
+ {
+ my ($pattern) = @_;
+ my $key;
+
+ foreach $key (keys %filelist)
+ {
+ if ($key =~ /$pattern/i && $filelist{$key} ne "")
+ {
+ delete $filelist{$key};
+ $filecount -= 1;
+ }
+ }
+ }
+
+sub add_dir
+ {
+ my ($dir) = @_;
+ opendir LISTDIR, $dir or print "Cannot read directory $dir\n" and return;
+ my @list = grep !/^\.\.?$/, readdir LISTDIR;
+ closedir LISTDIR;
+
+ if ($opt_v)
+ {
+ print "Scanning $dir...\n";
+ }
+ my $name;
+ foreach $name (@list)
+ {
+ my $filename = "$dir\\$name";
+ if (-d $filename)
+ {
+ add_dir($filename); # recurse
+ }
+ else
+ {
+ add_file($filename);
+ }
+ }
+ }
+
+sub exclude_zip
+ {
+ my ($excludezip) = @_;
+
+ die "$excludezip does not exist\n" if (!-e $excludezip);
+ print "Reading exclusions from $excludezip...\n";
+
+ my $line;
+ open ZIPEX, "unzip -l $excludezip |";
+ while ($line=<ZIPEX>)
+ {
+ # 4492 10-12-99 17:31 epoc32/BLDMAKE/AGENDA/ARM4.MAKE
+ if ($line =~ /..-..-..\s+..:..\s+(.*)$/)
+ {
+ exclude_file($1);
+ }
+ }
+ close ZIPEX;
+ die "Problem reading $excludezip\n" if ($? != 0);
+ }
+
+
+
+