1*b1cdbd2cSJim Jagielski:
2*b1cdbd2cSJim Jagielskieval 'exec perl -wS $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#
28*b1cdbd2cSJim Jagielski# packconfig.pl - pack xml configuration into archives
29*b1cdbd2cSJim Jagielski#
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielskiuse strict;
32*b1cdbd2cSJim Jagielskiuse Getopt::Long;
33*b1cdbd2cSJim Jagielskiuse File::Find;
34*b1cdbd2cSJim Jagielskiuse File::Basename;
35*b1cdbd2cSJim Jagielskiuse Archive::Zip qw(:ERROR_CODES :CONSTANTS);
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski#### globals ####
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielskimy $out_file;                # path to output archive
40*b1cdbd2cSJim Jagielskimy $tmp_out_file;            # path to temporary output file
41*b1cdbd2cSJim Jagielskimy $files_path;              # path to look for desired files
42*b1cdbd2cSJim Jagielskimy $verbose;                 # be verbose
43*b1cdbd2cSJim Jagielskimy $extra_verbose;           # be extra verbose
44*b1cdbd2cSJim Jagielskimy $do_rebuild = 0;          # is rebuilding zipfile required?
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski#### script id #####
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski( my $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/;
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielskimy $script_rev;
51*b1cdbd2cSJim Jagielskimy $id_str = ' $Revision: 1.3.24.2 $ ';
52*b1cdbd2cSJim Jagielski$id_str =~ /Revision:\s+(\S+)\s+\$/
53*b1cdbd2cSJim Jagielski  ? ($script_rev = $1) : ($script_rev = "-");
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski#print "$script_name -- version: $script_rev\n";
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski#### main #####
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielskiparse_options();
60*b1cdbd2cSJim Jagielskimy %files_hash;
61*b1cdbd2cSJim Jagielskimy $file_ref = get_files();
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski$do_rebuild = is_file_newer(\%files_hash) if $do_rebuild == 0;
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielskiif ( $do_rebuild == 1 ) {
66*b1cdbd2cSJim Jagielski    create_zip_archive(\%files_hash);
67*b1cdbd2cSJim Jagielski    replace_file($tmp_out_file, $out_file);
68*b1cdbd2cSJim Jagielski    print_message("packing  $out_file finished.");
69*b1cdbd2cSJim Jagielski} else {
70*b1cdbd2cSJim Jagielski    print_message("$out_file up to date. nothing to do.");
71*b1cdbd2cSJim Jagielski}
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielskiexit(0);
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski#### subroutines ####
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielskisub parse_options
78*b1cdbd2cSJim Jagielski{
79*b1cdbd2cSJim Jagielski    my $opt_help;
80*b1cdbd2cSJim Jagielski    my $p = Getopt::Long::Parser->new();
81*b1cdbd2cSJim Jagielski    my $success =$p->getoptions(
82*b1cdbd2cSJim Jagielski                             '-h' => \$opt_help,
83*b1cdbd2cSJim Jagielski                             '-o=s' => \$out_file,
84*b1cdbd2cSJim Jagielski                             '-i=s' => \$files_path,
85*b1cdbd2cSJim Jagielski                             '-v'   => \$verbose,
86*b1cdbd2cSJim Jagielski                             '-vv'  => \$extra_verbose
87*b1cdbd2cSJim Jagielski                            );
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski    if ( $opt_help || !$success || !$out_file || !$files_path )
90*b1cdbd2cSJim Jagielski    {
91*b1cdbd2cSJim Jagielski        usage();
92*b1cdbd2cSJim Jagielski        exit(1);
93*b1cdbd2cSJim Jagielski    }
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski    #define intermediate output file
96*b1cdbd2cSJim Jagielski    $tmp_out_file="$out_file"."$$".$ENV{INPATH};
97*b1cdbd2cSJim Jagielski    # Sanity checks.
98*b1cdbd2cSJim Jagielski
99*b1cdbd2cSJim Jagielski    # Check if out_file can be written.
100*b1cdbd2cSJim Jagielski    my $out_dir = dirname($out_file);
101*b1cdbd2cSJim Jagielski    print_error("no such directory: '$out_dir'", 2) if ! -d $out_dir;
102*b1cdbd2cSJim Jagielski    print_error("can't search directory: '$out_dir'", 2) if ! -x $out_dir;
103*b1cdbd2cSJim Jagielski    print_error("directory is not writable: '$out_dir'", 2) if ! -w $out_dir;
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski    # Check paths.
106*b1cdbd2cSJim Jagielski    foreach ($files_path) {
107*b1cdbd2cSJim Jagielski        print_error("no such directory: '$_'", 2) if ! -d $_;
108*b1cdbd2cSJim Jagielski        print_error("can't search directory: '$_'", 2) if ! -x $_;
109*b1cdbd2cSJim Jagielski    }
110*b1cdbd2cSJim Jagielski}
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielskisub get_files
113*b1cdbd2cSJim Jagielski{
114*b1cdbd2cSJim Jagielski    local @main::file_list;
115*b1cdbd2cSJim Jagielski
116*b1cdbd2cSJim Jagielski    find_files(\%files_hash);
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski    if ( !keys %files_hash ) {
119*b1cdbd2cSJim Jagielski        print_error("can't find any image lists in '$files_path'", 3);
120*b1cdbd2cSJim Jagielski    }
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski    return wantarray ? @main::file_list : \@main::file_list;
123*b1cdbd2cSJim Jagielski}
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielskisub find_files
126*b1cdbd2cSJim Jagielski{
127*b1cdbd2cSJim Jagielski    my $files_hash_ref = shift;
128*b1cdbd2cSJim Jagielski    find({ wanted => \&wanted, no_chdir => 0 }, "$files_path");
129*b1cdbd2cSJim Jagielski    foreach ( @main::file_list ) {
130*b1cdbd2cSJim Jagielski        /^\Q$files_path\E\/(.*)$/o;
131*b1cdbd2cSJim Jagielski        $files_hash_ref->{$1}++;
132*b1cdbd2cSJim Jagielski    }
133*b1cdbd2cSJim Jagielski}
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielskisub wanted
136*b1cdbd2cSJim Jagielski{
137*b1cdbd2cSJim Jagielski    my $file = $_;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski    if ( $file =~ /.*\.xml$/ && -f $file ) {
140*b1cdbd2cSJim Jagielski        push @main::file_list, $File::Find::name;
141*b1cdbd2cSJim Jagielski    }
142*b1cdbd2cSJim Jagielski}
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielskisub is_file_newer
145*b1cdbd2cSJim Jagielski{
146*b1cdbd2cSJim Jagielski    my $test_hash_ref = shift;
147*b1cdbd2cSJim Jagielski    my $reference_stamp = 0;
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski    print_message("checking timestamps ...") if $verbose;
150*b1cdbd2cSJim Jagielski    if ( -e $out_file ) {
151*b1cdbd2cSJim Jagielski        $reference_stamp = (stat($out_file))[9];
152*b1cdbd2cSJim Jagielski        print_message("found $out_file with $reference_stamp ...") if $verbose;
153*b1cdbd2cSJim Jagielski    }
154*b1cdbd2cSJim Jagielski    return 1 if $reference_stamp == 0;
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski    foreach ( sort keys %{$test_hash_ref} ) {
157*b1cdbd2cSJim Jagielski        my $path = $files_path;
158*b1cdbd2cSJim Jagielski        $path .= "/" if "$path" ne "";
159*b1cdbd2cSJim Jagielski        $path .= "$_";
160*b1cdbd2cSJim Jagielski        print_message("checking '$path' ...") if $extra_verbose;
161*b1cdbd2cSJim Jagielski        my $mtime = (stat($path))[9];
162*b1cdbd2cSJim Jagielski        return 1 if $reference_stamp < $mtime;
163*b1cdbd2cSJim Jagielski    }
164*b1cdbd2cSJim Jagielski    return 0;
165*b1cdbd2cSJim Jagielski}
166*b1cdbd2cSJim Jagielski
167*b1cdbd2cSJim Jagielskisub create_zip_archive
168*b1cdbd2cSJim Jagielski{
169*b1cdbd2cSJim Jagielski    my $zip_hash_ref = shift;
170*b1cdbd2cSJim Jagielski    print_message("creating config archive ...") if $verbose;
171*b1cdbd2cSJim Jagielski    my $zip = Archive::Zip->new();
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski    # on Mac OS X Intel we have unxmacxi.pro, on Mac OS X PowerPC unxmacxp.pro .. and so on
174*b1cdbd2cSJim Jagielski    my $platform = $ENV{INPATH};
175*b1cdbd2cSJim Jagielski
176*b1cdbd2cSJim Jagielski    foreach ( sort keys %{$zip_hash_ref} ) {
177*b1cdbd2cSJim Jagielski        my $path = "$files_path/$_";
178*b1cdbd2cSJim Jagielski	# only Mac OS X Aqua is concerned here
179*b1cdbd2cSJim Jagielski	# but changes for other platforms can easely be added following the same principle
180*b1cdbd2cSJim Jagielski	if ( ( $platform =~ /^.*macx*/) && ($path =~ /^.*menubar.xml/ ) ) {
181*b1cdbd2cSJim Jagielski	    $path = modify_mac_menus($path);
182*b1cdbd2cSJim Jagielski	}
183*b1cdbd2cSJim Jagielski	print_message("zipping '$path' ...") if $extra_verbose;
184*b1cdbd2cSJim Jagielski	if ( !$zip->addFile($path, $_) ) {
185*b1cdbd2cSJim Jagielski	    print_error("can't add file '$path' to config zip archive: $!", 5);
186*b1cdbd2cSJim Jagielski	}
187*b1cdbd2cSJim Jagielski    }
188*b1cdbd2cSJim Jagielski    my $status = $zip->writeToFileNamed($tmp_out_file);
189*b1cdbd2cSJim Jagielski    if ( $status != AZ_OK ) {
190*b1cdbd2cSJim Jagielski        print_error("write image zip archive '$tmp_out_file' failed. Reason: $status", 6);
191*b1cdbd2cSJim Jagielski    }
192*b1cdbd2cSJim Jagielski    return;
193*b1cdbd2cSJim Jagielski}
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielskisub modify_mac_menus
196*b1cdbd2cSJim Jagielski{
197*b1cdbd2cSJim Jagielski    my $path_base = "$ENV{'SOLARENV'}";
198*b1cdbd2cSJim Jagielski    $path_base =~ s/solenv//;
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski    my $new_file_name = "$path_base"."postprocess"."\/"."$ENV{INPATH}"."\/"."misc"."\/"."$_";
201*b1cdbd2cSJim Jagielski
202*b1cdbd2cSJim Jagielski    my $new_directory = $new_file_name;
203*b1cdbd2cSJim Jagielski    $new_directory =~ s/\/menubar.xml//;
204*b1cdbd2cSJim Jagielski    if ( ! -e $new_directory) {
205*b1cdbd2cSJim Jagielski	`mkdir -p "$new_directory"`;
206*b1cdbd2cSJim Jagielski    }
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski    my $old_file_name = "$files_path/$_";
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski    `cp $old_file_name $new_file_name`;
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim Jagielski    my $temp_file_name = "$new_file_name"."_tmp";
213*b1cdbd2cSJim Jagielski    my $xsl_file = "macosx/macosx_menubar_modification.xsl";
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski    my $result = `xsltproc $xsl_file $new_file_name > $temp_file_name`;
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski    if ( $result != 0) {
218*b1cdbd2cSJim Jagielski	print_error("xsltproc '$xsl_file' '$new_file_name'> '$temp_file_name' failed",1)
219*b1cdbd2cSJim Jagielski    }
220*b1cdbd2cSJim Jagielski
221*b1cdbd2cSJim Jagielski    replace_file( $temp_file_name, $new_file_name );
222*b1cdbd2cSJim Jagielski    return $new_file_name;
223*b1cdbd2cSJim Jagielski}
224*b1cdbd2cSJim Jagielski
225*b1cdbd2cSJim Jagielskisub replace_file
226*b1cdbd2cSJim Jagielski{
227*b1cdbd2cSJim Jagielski    my $source_file = shift;
228*b1cdbd2cSJim Jagielski    my $dest_file = shift;
229*b1cdbd2cSJim Jagielski    my $result = 0;
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski    $result = unlink($dest_file) if -f $dest_file;
232*b1cdbd2cSJim Jagielski    if ( $result != 1 && -f $dest_file ) {
233*b1cdbd2cSJim Jagielski        unlink $source_file;
234*b1cdbd2cSJim Jagielski        print_error("couldn't remove '$dest_file'",1);
235*b1cdbd2cSJim Jagielski    }  else {
236*b1cdbd2cSJim Jagielski        if ( !rename($source_file, $dest_file)) {
237*b1cdbd2cSJim Jagielski            unlink $source_file;
238*b1cdbd2cSJim Jagielski            print_error("couldn't rename '$source_file'",1);
239*b1cdbd2cSJim Jagielski        }
240*b1cdbd2cSJim Jagielski    }
241*b1cdbd2cSJim Jagielski    return;
242*b1cdbd2cSJim Jagielski}
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielskisub usage
245*b1cdbd2cSJim Jagielski{
246*b1cdbd2cSJim Jagielski    print STDERR "Usage: packimages.pl [-h] -o out_file -i file_path\n";
247*b1cdbd2cSJim Jagielski    print STDERR "Creates archive of images\n";
248*b1cdbd2cSJim Jagielski    print STDERR "Options:\n";
249*b1cdbd2cSJim Jagielski    print STDERR "    -h                 print this help\n";
250*b1cdbd2cSJim Jagielski    print STDERR "    -o out_file        path to output archive\n";
251*b1cdbd2cSJim Jagielski    print STDERR "    -i file_path       path to directory containing the config files\n";
252*b1cdbd2cSJim Jagielski    print STDERR "    -v                 verbose\n";
253*b1cdbd2cSJim Jagielski    print STDERR "    -vv                very verbose\n";
254*b1cdbd2cSJim Jagielski}
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielskisub print_message
257*b1cdbd2cSJim Jagielski{
258*b1cdbd2cSJim Jagielski    my $message     = shift;
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski    print "$script_name: ";
261*b1cdbd2cSJim Jagielski    print "$message\n";
262*b1cdbd2cSJim Jagielski    return;
263*b1cdbd2cSJim Jagielski}
264*b1cdbd2cSJim Jagielski
265*b1cdbd2cSJim Jagielskisub print_warning
266*b1cdbd2cSJim Jagielski{
267*b1cdbd2cSJim Jagielski    my $message     = shift;
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski    print STDERR "$script_name: ";
270*b1cdbd2cSJim Jagielski    print STDERR "WARNING $message\n";
271*b1cdbd2cSJim Jagielski    return;
272*b1cdbd2cSJim Jagielski}
273*b1cdbd2cSJim Jagielski
274*b1cdbd2cSJim Jagielskisub print_error
275*b1cdbd2cSJim Jagielski{
276*b1cdbd2cSJim Jagielski    my $message     = shift;
277*b1cdbd2cSJim Jagielski    my $error_code  = shift;
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski    print STDERR "$script_name: ";
280*b1cdbd2cSJim Jagielski    print STDERR "ERROR: $message\n";
281*b1cdbd2cSJim Jagielski
282*b1cdbd2cSJim Jagielski    if ( $error_code ) {
283*b1cdbd2cSJim Jagielski        print STDERR "\nFAILURE: $script_name aborted.\n";
284*b1cdbd2cSJim Jagielski        exit($error_code);
285*b1cdbd2cSJim Jagielski    }
286*b1cdbd2cSJim Jagielski    return;
287*b1cdbd2cSJim Jagielski}
288