summaryrefslogtreecommitdiff
path: root/solenv/bin/oochkpatch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/oochkpatch.pl')
-rw-r--r--solenv/bin/oochkpatch.pl305
1 files changed, 305 insertions, 0 deletions
diff --git a/solenv/bin/oochkpatch.pl b/solenv/bin/oochkpatch.pl
new file mode 100644
index 000000000000..a15a6ba6fcc7
--- /dev/null
+++ b/solenv/bin/oochkpatch.pl
@@ -0,0 +1,305 @@
+:
+ eval 'exec perl -S $0 ${1+"$@"}'
+ if 0;
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: oochkpatch.pl,v $
+#
+# $Revision: 1.3 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+#
+# oochkpatch - check patch flags against CWS modules
+#
+
+require File::Temp;
+require File::Find;
+require Getopt::Long;
+require Pod::Usage;
+use Pod::Usage;
+use Getopt::Long;
+use File::Temp qw/ tempfile tempdir /;
+use File::Find;
+
+
+# configuration goes here
+##########################################################
+
+# uncomment this, if in pure OOo environment
+#my $toplevel_module = "instsetoo_native";
+#my $scp_module = "scp2";
+#my $setup_file = "setup_osl";
+
+# uncomment this, if within the StarOffice environment
+my $toplevel_module = "instset_native";
+my $scp_module = "scp2so";
+my $setup_file = "setup";
+
+my $deliver = "solenv/bin/deliver.pl";
+my $build = "solenv/bin/build.pl";
+
+# list of hardcoded exceptions (files that are _never_ considered
+# missing from the patch)
+my %hardcoded_exceptions = ('build.lst' => 1);
+
+
+# no configuration below this point, please!
+##########################################################
+
+# defaults
+my $from_module = "";
+my $verbose = '';
+my $help = '';
+my $man = '';
+my $modules = '';
+my $from = '';
+my $perl = '';
+
+GetOptions('help|?' => \$help,
+ 'man' => \$man,
+ 'verbose' => \$verbose,
+ 'from=s' => \$from_module ) or pod2usage(2);
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+# process remaining args
+print "Processing args...\n" if $verbose;
+foreach my $argument (@ARGV)
+{
+ print " Checking module ", $argument, "\n" if $verbose;
+ push @modules, $argument;
+}
+
+# platform-dependent stuff
+if( $^O eq 'MSWin32' )
+{
+ $perl = "$ENV{COMSPEC} -c $ENV{PERL}";
+ $setup_file = $setup_file . ".inf";
+}
+else
+{
+ $perl = 'perl';
+ $setup_file = $setup_file . ".ins";
+};
+
+# read some SOLAR stuff from env
+my $SRC_ROOT = $ENV{"SRC_ROOT"};
+my $INPATH = $ENV{"INPATH"};
+
+# process --from modules
+if( $from_module )
+{
+ print "Checking all modules upwards and including ", $from_module, "\n" if $verbose;
+
+ # append build.pl-generated list of modules
+ chdir "$SRC_ROOT/$toplevel_module" or
+ chdir "$SRC_ROOT/$toplevel_module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$toplevel_module!";
+ open(ALLMODULES,
+ "$perl $SRC_ROOT/$build --all:$from_module --show 2>&1 |") or die "ERROR: cannot build --show!\n";
+ while(<ALLMODULES>)
+ {
+ if( /Building project/ )
+ {
+ my @module = split( /\s+/, $_ );
+ print " which is ", $module[2], "\n" if $verbose;
+ push(@modules,$module[2]);
+ }
+ }
+}
+
+die "ERROR: no modules to check!\n" if !@modules;
+
+$tempdir = tempdir( TMPDIR => 1, CLEANUP => 1);
+
+# generate list of files with PATCH flag
+print "Generating list of files which have the PATCH flag...\n" if $verbose;
+
+my $path_to_setup_file = $SRC_ROOT."/".$scp_module."/".$INPATH."/bin/osl/".$setup_file;
+my $alternate_path_to_setup_file = $SRC_ROOT."/".$scp_module.".lnk/".$INPATH."/bin/osl/".$setup_file;
+my $in_file_block=0;
+my $patch_flag=0;
+my $file_name='';
+my $base;
+my $ext;
+my %pack_files;
+open(SETUP, "<".$path_to_setup_file) or
+ open(SETUP, "<".$alternate_path_to_setup_file) or die "ERROR: cannot open $path_to_setup_file!\n";
+while(<SETUP>)
+{
+ if( /^File\s+/ && !$in_file_block )
+ {
+ $in_file_block = 1;
+ $patch_flag=0;
+ $file_name='';
+ }
+ elsif( /^End/ && $file_name ne '' && $in_file_block )
+ {
+ $file_name =~ s/["']//g;
+ $pack_files{$file_name} = $patch_flag;
+
+ if( $patch_flag )
+ {
+ print( " File $file_name included in patch\n") if $verbose;
+ }
+ else
+ {
+ print( " File $file_name NOT included in patch\n") if $verbose;
+ }
+
+ $in_file_block = 0;
+ }
+ elsif( /^\s+Styles\s*=\s*.*PATCH/ && $in_file_block )
+ {
+ $patch_flag = 1;
+ }
+ elsif( ($res) = /^\s+Name\s*=\s*(.*);/ )
+ {
+ $file_name = $res;
+ }
+}
+
+# generate list of delivered files
+print "Generating list of delivered libs...\n" if $verbose;
+
+# first, deliver all modules to tempdir
+foreach my $module (@modules)
+{
+ print " dummy-delivering $module...\n" if $verbose;
+ chdir "$SRC_ROOT/$module" or
+ chdir "$SRC_ROOT/$module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$module!";
+ `$perl $SRC_ROOT/$deliver $tempdir`;
+}
+
+# now, check all files in delivered dirs for containedness in PATCH
+# set
+print "Checking against delivered files...\n" if $verbose;
+find(\&wanted, $tempdir );
+
+sub wanted
+{
+ my $fname;
+
+ if( -f )
+ {
+ $fname = $_;
+ if( !exists $pack_files{$fname} )
+ {
+ print " File $fname is not packed.\n" if $verbose;
+ }
+ elsif( $pack_files{$fname} == 0 )
+ {
+ if( !$hardcoded_exceptions{ $fname } )
+ {
+ # file not in patch set, and not in exception list
+ print " File $fname is packed, but NOT included in patch set and part of delivered output\n" if $verbose;
+ print "$fname\n" if !$verbose;
+ }
+ else
+ {
+ print " File $fname is NOT included in patch set, but member of hardcoded exception list\n" if $verbose;
+ }
+ }
+ elsif( $pack_files{$fname} == 1 )
+ {
+ print " File $fname packed and patched.\n" if $verbose;
+ }
+ }
+}
+
+
+__END__
+
+=head1 NAME
+
+oochkpatch.pl - Verify patch flags against module libraries
+
+=head1 SYNOPSIS
+
+oochkpatch.pl [options] [module-name ...]
+
+ Options:
+ --help|-h brief help message
+ --man|-m full documentation
+ --verbose|-v tell what's happening
+ --from=module check all modules from
+ given one upwards
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Print a brief help message and exits.
+
+=item B<--man>
+
+Prints the manual page and exits.
+
+=item B<--verbose>
+
+Verbosely tell what's currently happening
+
+=item B<--from=module>
+
+Assumes OOo was built incompatibly from given module
+upwards, and check against all libs from all upwards modules.
+Further modules can be given at the command line, which are merged
+with the ones generated from this option
+
+=back
+
+=head1 DESCRIPTION
+
+B<This program> will compare all libs delivered from the specified modules
+against the set of files marked with the B<patch> flag in scp2. Useful to check
+if the patch set is complete. Please note that this program needs to be run in
+a solar shell, i.e. the OOo build environment needs to be set up in the shell.
+
+There's kind of a heuristic involved, to determine exactly which files
+to check against includedness in the patch set (since e.g. all headers
+are delivered, but clearly need not be checked against patch
+flags). It works by first collecting all files that are mentioned in
+the pack master file, and then checking all files delivered from the
+specified modules against that pack list: if the file is not packed,
+or if it's packed and has the patch flag set, all is well. Otherwise,
+the file in question potentially misses the patch flag (because one of
+the modified modules contains it).
+
+=head1 EXAMPLE
+
+To determine the set of libs not yet carrying the patch flag for a CWS
+containing sfx2, svx, and vcl, which is incompatible from sfx2
+upwards, use something like this:
+
+oochkpatch.pl --from=sfx2 `cwsquery modules`
+
+This puts every module upwards and including sfx2 in the check list,
+plus vcl. Note that with this approach, you'll usually get a larger
+set of files for the patch than necessary - but at least you get all
+files that might have changed theoretically.
+
+=cut