xref: /aoo4110/main/solenv/bin/oochkpatch.pl (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski:
2*b1cdbd2cSJim Jagielski    eval 'exec perl -S $0 ${1+"$@"}'
3*b1cdbd2cSJim Jagielski        if 0;
4*b1cdbd2cSJim Jagielski#**************************************************************
5*b1cdbd2cSJim Jagielski#
6*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
7*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
8*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
9*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
10*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
11*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
12*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
13*b1cdbd2cSJim Jagielski#
14*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
15*b1cdbd2cSJim Jagielski#
16*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
17*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
18*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
20*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
21*b1cdbd2cSJim Jagielski#  under the License.
22*b1cdbd2cSJim Jagielski#
23*b1cdbd2cSJim Jagielski#**************************************************************
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski#
27*b1cdbd2cSJim Jagielski# oochkpatch - check patch flags against CWS modules
28*b1cdbd2cSJim Jagielski#
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim Jagielskirequire File::Temp;
31*b1cdbd2cSJim Jagielskirequire File::Find;
32*b1cdbd2cSJim Jagielskirequire Getopt::Long;
33*b1cdbd2cSJim Jagielskirequire Pod::Usage;
34*b1cdbd2cSJim Jagielskiuse Pod::Usage;
35*b1cdbd2cSJim Jagielskiuse Getopt::Long;
36*b1cdbd2cSJim Jagielskiuse File::Temp qw/ tempfile tempdir /;
37*b1cdbd2cSJim Jagielskiuse File::Find;
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski# configuration goes here
41*b1cdbd2cSJim Jagielski##########################################################
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski# uncomment this, if in pure OOo environment
44*b1cdbd2cSJim Jagielski#my $toplevel_module = "instsetoo_native";
45*b1cdbd2cSJim Jagielski#my $scp_module	    = "scp2";
46*b1cdbd2cSJim Jagielski#my $setup_file	    = "setup_osl";
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski# uncomment this, if within the StarOffice environment
49*b1cdbd2cSJim Jagielskimy $toplevel_module = "instset_native";
50*b1cdbd2cSJim Jagielskimy $scp_module	    = "scp2so";
51*b1cdbd2cSJim Jagielskimy $setup_file	    = "setup";
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielskimy $deliver = "solenv/bin/deliver.pl";
54*b1cdbd2cSJim Jagielskimy $build	= "solenv/bin/build.pl";
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski# list of hardcoded exceptions (files that are _never_ considered
57*b1cdbd2cSJim Jagielski# missing from the patch)
58*b1cdbd2cSJim Jagielskimy %hardcoded_exceptions = ('build.lst' => 1);
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski# no configuration below this point, please!
62*b1cdbd2cSJim Jagielski##########################################################
63*b1cdbd2cSJim Jagielski
64*b1cdbd2cSJim Jagielski# defaults
65*b1cdbd2cSJim Jagielskimy $from_module = "";
66*b1cdbd2cSJim Jagielskimy $verbose		= '';
67*b1cdbd2cSJim Jagielskimy $help		= '';
68*b1cdbd2cSJim Jagielskimy $man			= '';
69*b1cdbd2cSJim Jagielskimy $modules		= '';
70*b1cdbd2cSJim Jagielskimy $from		= '';
71*b1cdbd2cSJim Jagielskimy $perl		= '';
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim JagielskiGetOptions('help|?'  => \$help,
74*b1cdbd2cSJim Jagielski		   'man'     => \$man,
75*b1cdbd2cSJim Jagielski		   'verbose' => \$verbose,
76*b1cdbd2cSJim Jagielski		   'from=s'  => \$from_module ) or pod2usage(2);
77*b1cdbd2cSJim Jagielskipod2usage(1) if $help;
78*b1cdbd2cSJim Jagielskipod2usage(-exitstatus => 0, -verbose => 2) if $man;
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielski# process remaining args
81*b1cdbd2cSJim Jagielskiprint "Processing args...\n" if $verbose;
82*b1cdbd2cSJim Jagielskiforeach my $argument (@ARGV)
83*b1cdbd2cSJim Jagielski{
84*b1cdbd2cSJim Jagielski	print " Checking module ", $argument, "\n" if $verbose;
85*b1cdbd2cSJim Jagielski	push @modules, $argument;
86*b1cdbd2cSJim Jagielski}
87*b1cdbd2cSJim Jagielski
88*b1cdbd2cSJim Jagielski# platform-dependent stuff
89*b1cdbd2cSJim Jagielskiif( $^O eq 'MSWin32' )
90*b1cdbd2cSJim Jagielski{
91*b1cdbd2cSJim Jagielski	$perl = "$ENV{COMSPEC} -c $ENV{PERL}";
92*b1cdbd2cSJim Jagielski	$setup_file = $setup_file . ".inf";
93*b1cdbd2cSJim Jagielski}
94*b1cdbd2cSJim Jagielskielse
95*b1cdbd2cSJim Jagielski{
96*b1cdbd2cSJim Jagielski	$perl = 'perl';
97*b1cdbd2cSJim Jagielski	$setup_file = $setup_file . ".ins";
98*b1cdbd2cSJim Jagielski};
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski# read some SOLAR stuff from env
101*b1cdbd2cSJim Jagielskimy $SRC_ROOT = $ENV{"SRC_ROOT"};
102*b1cdbd2cSJim Jagielskimy $INPATH = $ENV{"INPATH"};
103*b1cdbd2cSJim Jagielski
104*b1cdbd2cSJim Jagielski# process --from modules
105*b1cdbd2cSJim Jagielskiif( $from_module )
106*b1cdbd2cSJim Jagielski{
107*b1cdbd2cSJim Jagielski	print "Checking all modules upwards and including ", $from_module, "\n" if $verbose;
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski	# append build.pl-generated list of modules
110*b1cdbd2cSJim Jagielski	chdir "$SRC_ROOT/$toplevel_module" or
111*b1cdbd2cSJim Jagielski		chdir "$SRC_ROOT/$toplevel_module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$toplevel_module!";
112*b1cdbd2cSJim Jagielski	open(ALLMODULES,
113*b1cdbd2cSJim Jagielski		 "$perl $SRC_ROOT/$build --all:$from_module --show 2>&1 |") or die "ERROR: cannot build --show!\n";
114*b1cdbd2cSJim Jagielski	while(<ALLMODULES>)
115*b1cdbd2cSJim Jagielski	{
116*b1cdbd2cSJim Jagielski		if( /Building project/ )
117*b1cdbd2cSJim Jagielski		{
118*b1cdbd2cSJim Jagielski			my @module = split( /\s+/, $_ );
119*b1cdbd2cSJim Jagielski			print " which is ", $module[2], "\n" if $verbose;
120*b1cdbd2cSJim Jagielski			push(@modules,$module[2]);
121*b1cdbd2cSJim Jagielski		}
122*b1cdbd2cSJim Jagielski	}
123*b1cdbd2cSJim Jagielski}
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielskidie "ERROR: no modules to check!\n" if !@modules;
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski$tempdir = tempdir( TMPDIR => 1, CLEANUP => 1);
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski# generate list of files with PATCH flag
130*b1cdbd2cSJim Jagielskiprint "Generating list of files which have the PATCH flag...\n" if $verbose;
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielskimy $path_to_setup_file = $SRC_ROOT."/".$scp_module."/".$INPATH."/bin/osl/".$setup_file;
133*b1cdbd2cSJim Jagielskimy $alternate_path_to_setup_file = $SRC_ROOT."/".$scp_module.".lnk/".$INPATH."/bin/osl/".$setup_file;
134*b1cdbd2cSJim Jagielskimy $in_file_block=0;
135*b1cdbd2cSJim Jagielskimy $patch_flag=0;
136*b1cdbd2cSJim Jagielskimy $file_name='';
137*b1cdbd2cSJim Jagielskimy $base;
138*b1cdbd2cSJim Jagielskimy $ext;
139*b1cdbd2cSJim Jagielskimy %pack_files;
140*b1cdbd2cSJim Jagielskiopen(SETUP, "<".$path_to_setup_file) or
141*b1cdbd2cSJim Jagielski   open(SETUP, "<".$alternate_path_to_setup_file) or die "ERROR: cannot open $path_to_setup_file!\n";
142*b1cdbd2cSJim Jagielskiwhile(<SETUP>)
143*b1cdbd2cSJim Jagielski{
144*b1cdbd2cSJim Jagielski	if( /^File\s+/ && !$in_file_block )
145*b1cdbd2cSJim Jagielski	{
146*b1cdbd2cSJim Jagielski		$in_file_block = 1;
147*b1cdbd2cSJim Jagielski		$patch_flag=0;
148*b1cdbd2cSJim Jagielski		$file_name='';
149*b1cdbd2cSJim Jagielski	}
150*b1cdbd2cSJim Jagielski	elsif( /^End/ && $file_name ne '' && $in_file_block )
151*b1cdbd2cSJim Jagielski	{
152*b1cdbd2cSJim Jagielski		$file_name =~ s/["']//g;
153*b1cdbd2cSJim Jagielski		$pack_files{$file_name} = $patch_flag;
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski		if( $patch_flag )
156*b1cdbd2cSJim Jagielski		{
157*b1cdbd2cSJim Jagielski			print( " File $file_name included in patch\n") if $verbose;
158*b1cdbd2cSJim Jagielski		}
159*b1cdbd2cSJim Jagielski		else
160*b1cdbd2cSJim Jagielski		{
161*b1cdbd2cSJim Jagielski			print( " File $file_name NOT included in patch\n") if $verbose;
162*b1cdbd2cSJim Jagielski		}
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski		$in_file_block = 0;
165*b1cdbd2cSJim Jagielski	}
166*b1cdbd2cSJim Jagielski	elsif( /^\s+Styles\s*=\s*.*PATCH/ && $in_file_block )
167*b1cdbd2cSJim Jagielski	{
168*b1cdbd2cSJim Jagielski		$patch_flag = 1;
169*b1cdbd2cSJim Jagielski	}
170*b1cdbd2cSJim Jagielski	elsif( ($res) = /^\s+Name\s*=\s*(.*);/ )
171*b1cdbd2cSJim Jagielski	{
172*b1cdbd2cSJim Jagielski		$file_name = $res;
173*b1cdbd2cSJim Jagielski	}
174*b1cdbd2cSJim Jagielski}
175*b1cdbd2cSJim Jagielski
176*b1cdbd2cSJim Jagielski# generate list of delivered files
177*b1cdbd2cSJim Jagielskiprint "Generating list of delivered libs...\n" if $verbose;
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski# first, deliver all modules to tempdir
180*b1cdbd2cSJim Jagielskiforeach my $module (@modules)
181*b1cdbd2cSJim Jagielski{
182*b1cdbd2cSJim Jagielski	print " dummy-delivering $module...\n" if $verbose;
183*b1cdbd2cSJim Jagielski	chdir "$SRC_ROOT/$module" or
184*b1cdbd2cSJim Jagielski		chdir "$SRC_ROOT/$module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$module!";
185*b1cdbd2cSJim Jagielski	`$perl $SRC_ROOT/$deliver $tempdir`;
186*b1cdbd2cSJim Jagielski}
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielski# now, check all files in delivered dirs for containedness in PATCH
189*b1cdbd2cSJim Jagielski# set
190*b1cdbd2cSJim Jagielskiprint "Checking against delivered files...\n" if $verbose;
191*b1cdbd2cSJim Jagielskifind(\&wanted, $tempdir );
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielskisub wanted
194*b1cdbd2cSJim Jagielski{
195*b1cdbd2cSJim Jagielski	my $fname;
196*b1cdbd2cSJim Jagielski
197*b1cdbd2cSJim Jagielski	if( -f )
198*b1cdbd2cSJim Jagielski	{
199*b1cdbd2cSJim Jagielski		$fname = $_;
200*b1cdbd2cSJim Jagielski		if( !exists $pack_files{$fname} )
201*b1cdbd2cSJim Jagielski		{
202*b1cdbd2cSJim Jagielski			print " File $fname is not packed.\n" if $verbose;
203*b1cdbd2cSJim Jagielski		}
204*b1cdbd2cSJim Jagielski		elsif( $pack_files{$fname} == 0 )
205*b1cdbd2cSJim Jagielski		{
206*b1cdbd2cSJim Jagielski			if( !$hardcoded_exceptions{ $fname } )
207*b1cdbd2cSJim Jagielski			{
208*b1cdbd2cSJim Jagielski				# file not in patch set, and not in exception list
209*b1cdbd2cSJim Jagielski				print " File $fname is packed, but NOT included in patch set and part of delivered output\n" if $verbose;
210*b1cdbd2cSJim Jagielski				print "$fname\n" if !$verbose;
211*b1cdbd2cSJim Jagielski			}
212*b1cdbd2cSJim Jagielski			else
213*b1cdbd2cSJim Jagielski			{
214*b1cdbd2cSJim Jagielski				print " File $fname is NOT included in patch set, but member of hardcoded exception list\n" if $verbose;
215*b1cdbd2cSJim Jagielski			}
216*b1cdbd2cSJim Jagielski		}
217*b1cdbd2cSJim Jagielski		elsif( $pack_files{$fname} == 1 )
218*b1cdbd2cSJim Jagielski		{
219*b1cdbd2cSJim Jagielski			print " File $fname packed and patched.\n" if $verbose;
220*b1cdbd2cSJim Jagielski		}
221*b1cdbd2cSJim Jagielski	}
222*b1cdbd2cSJim Jagielski}
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski
225*b1cdbd2cSJim Jagielski__END__
226*b1cdbd2cSJim Jagielski
227*b1cdbd2cSJim Jagielski=head1 NAME
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielskioochkpatch.pl - Verify patch flags against module libraries
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski=head1 SYNOPSIS
232*b1cdbd2cSJim Jagielski
233*b1cdbd2cSJim Jagielskioochkpatch.pl [options] [module-name ...]
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski Options:
236*b1cdbd2cSJim Jagielski   --help|-h         brief help message
237*b1cdbd2cSJim Jagielski   --man|-m          full documentation
238*b1cdbd2cSJim Jagielski   --verbose|-v      tell what's happening
239*b1cdbd2cSJim Jagielski   --from=module     check all modules from
240*b1cdbd2cSJim Jagielski                     given one upwards
241*b1cdbd2cSJim Jagielski
242*b1cdbd2cSJim Jagielski=head1 OPTIONS
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielski=over 8
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski=item B<--help>
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim JagielskiPrint a brief help message and exits.
249*b1cdbd2cSJim Jagielski
250*b1cdbd2cSJim Jagielski=item B<--man>
251*b1cdbd2cSJim Jagielski
252*b1cdbd2cSJim JagielskiPrints the manual page and exits.
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski=item B<--verbose>
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim JagielskiVerbosely tell what's currently happening
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski=item B<--from=module>
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim JagielskiAssumes OOo was built incompatibly from given module
261*b1cdbd2cSJim Jagielskiupwards, and check against all libs from all upwards modules.
262*b1cdbd2cSJim JagielskiFurther modules can be given at the command line, which are merged
263*b1cdbd2cSJim Jagielskiwith the ones generated from this option
264*b1cdbd2cSJim Jagielski
265*b1cdbd2cSJim Jagielski=back
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski=head1 DESCRIPTION
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim JagielskiB<This program> will compare all libs delivered from the specified modules
270*b1cdbd2cSJim Jagielskiagainst the set of files marked with the B<patch> flag in scp2. Useful to check
271*b1cdbd2cSJim Jagielskiif the patch set is complete. Please note that this program needs to be run in
272*b1cdbd2cSJim Jagielskia solar shell, i.e. the OOo build environment needs to be set up in the shell.
273*b1cdbd2cSJim Jagielski
274*b1cdbd2cSJim JagielskiThere's kind of a heuristic involved, to determine exactly which files
275*b1cdbd2cSJim Jagielskito check against includedness in the patch set (since e.g. all headers
276*b1cdbd2cSJim Jagielskiare delivered, but clearly need not be checked against patch
277*b1cdbd2cSJim Jagielskiflags). It works by first collecting all files that are mentioned in
278*b1cdbd2cSJim Jagielskithe pack master file, and then checking all files delivered from the
279*b1cdbd2cSJim Jagielskispecified modules against that pack list: if the file is not packed,
280*b1cdbd2cSJim Jagielskior if it's packed and has the patch flag set, all is well. Otherwise,
281*b1cdbd2cSJim Jagielskithe file in question potentially misses the patch flag (because one of
282*b1cdbd2cSJim Jagielskithe modified modules contains it).
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski=head1 EXAMPLE
285*b1cdbd2cSJim Jagielski
286*b1cdbd2cSJim JagielskiTo determine the set of libs not yet carrying the patch flag for a CWS
287*b1cdbd2cSJim Jagielskicontaining sfx2, svx, and vcl, which is incompatible from sfx2
288*b1cdbd2cSJim Jagielskiupwards, use something like this:
289*b1cdbd2cSJim Jagielski
290*b1cdbd2cSJim Jagielskioochkpatch.pl --from=sfx2 `cwsquery modules`
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim JagielskiThis puts every module upwards and including sfx2 in the check list,
293*b1cdbd2cSJim Jagielskiplus vcl. Note that with this approach, you'll usually get a larger
294*b1cdbd2cSJim Jagielskiset of files for the patch than necessary - but at least you get all
295*b1cdbd2cSJim Jagielskifiles that might have changed theoretically.
296*b1cdbd2cSJim Jagielski
297*b1cdbd2cSJim Jagielski=cut
298