diff -r 000000000000 -r 83f4b4db085c bldsystemtools/commonbldutils/delta_zip.pl --- /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 < which contains the tree rooted at , +excluding all files listed in , 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=) + { + # 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); + } + + + +