xref: /AOO41X/main/solenv/bin/modules/installer/ziplist.pm (revision 6a6ec68d792bd477e5b23798f42a1a9de0925497)
1#**************************************************************
2#
3#  Licensed to the Apache Software Foundation (ASF) under one
4#  or more contributor license agreements.  See the NOTICE file
5#  distributed with this work for additional information
6#  regarding copyright ownership.  The ASF licenses this file
7#  to you under the Apache License, Version 2.0 (the
8#  "License"); you may not use this file except in compliance
9#  with the License.  You may obtain a copy of the License at
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
12#
13#  Unless required by applicable law or agreed to in writing,
14#  software distributed under the License is distributed on an
15#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16#  KIND, either express or implied.  See the License for the
17#  specific language governing permissions and limitations
18#  under the License.
19#
20#**************************************************************
21
22
23
24package installer::ziplist;
25
26use installer::existence;
27use installer::exiter;
28use installer::globals;
29use installer::logger;
30use installer::parameter;
31use installer::remover;
32use installer::systemactions;
33
34#################################################
35# Getting data from path file and zip list file
36#################################################
37
38sub getproductblock
39{
40    my ($fileref, $search, $inheritance) = @_;
41
42    my @searchblock = ();
43    my $searchexists = 0;
44    my $record = 0;
45    my $count = 0;
46    my $line;
47    my $inh = $inheritance ? '(?::\s*(\S+)\s*)?' : "";
48    my $parent;
49
50    for ( my $i = 0; $i <= $#{$fileref}; $i++ )
51    {
52        $line = ${$fileref}[$i];
53
54        if ( $line =~ /^\s*\Q$search\E\s*$inh$/i )      # case insensitive
55        {
56            $record = 1;
57            $searchexists = 1;
58            $parent = $1 if $inheritance;
59        }
60
61        if ($record)
62        {
63            push(@searchblock, $line);
64        }
65
66        if ( ($record) && ($line =~ /\{/) )
67        {
68            $count++;
69        }
70
71        if ( ($record) && ($line =~ /\}/) )
72        {
73            $count--;
74        }
75
76        if ( ($record) && ($line =~ /\}/) && ( $count == 0 ) )
77        {
78            $record = 0;
79        }
80    }
81
82    if (( ! $searchexists ) && ( $search ne $installer::globals::globalblock ))
83    {
84        if ($search eq $installer::globals::product )
85        {
86            installer::exiter::exit_program("ERROR: Product $installer::globals::product not defined in $installer::globals::ziplistname", "getproductblock");
87        }
88        elsif ($search eq $installer::globals::compiler )
89        {
90            installer::exiter::exit_program("ERROR: Compiler $installer::globals::compiler not defined in $installer::globals::pathfilename", "getproductblock");
91        }
92        else    # this is not possible
93        {
94            installer::exiter::exit_program("ERROR: Unknown value for $search in getproductblock()", "getproductblock");
95        }
96    }
97
98    return (\@searchblock, $parent);
99}
100
101###############################################
102# Analyzing the settings in the zip list file
103###############################################
104
105sub analyze_settings_block
106{
107    my ($blockref) = @_;
108
109    my @newsettingsblock = ();
110    my $compilerstring = "";
111    my $record = 1;
112    my $counter = 0;
113
114    # Allowed values in settings block:
115    # "Settings", "Variables", "unix" (for destination path and logfile)
116    # Furthermore allowed values are $installer::globals::build (srx645) and $installer::globals::compiler (pro and nonpro (unxsols4.pro))
117
118    # Comment line in settings block begin with "#" or ";"
119
120    if ( $installer::globals::pro )
121    {
122        $compilerstring = $installer::globals::compiler . ".pro";
123    }
124    else
125    {
126        $compilerstring = $installer::globals::compiler;
127    }
128
129    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
130    {
131        my $line = ${$blockref}[$i];
132        my $nextline = "";
133
134        if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
135
136        # removing comment lines
137
138        if (($line =~ /^\s*\#/) || ($line =~ /^\s*\;/))
139        {
140            next;
141        }
142
143        # complete blocks of unknows strings are not recorded
144
145        if ((!($line =~ /^\s*\Q$compilerstring\E\s*$/i)) &&
146            (!($line =~ /^\s*\Q$installer::globals::build\E\s*$/i)) &&
147            (!($line =~ /^\s*\bSettings\b\s*$/i)) &&
148            (!($line =~ /^\s*\bVariables\b\s*$/i)) &&
149            (!($line =~ /^\s*\bunix\b\s*$/i)) &&
150            ($nextline =~ /^\s*\{\s*$/i))
151        {
152            $record = 0;
153            next;           # continue with next $i
154        }
155
156        if (!( $record ))
157        {
158            if ($line =~ /^\s*\{\s*$/i)
159            {
160                $counter++;
161            }
162
163            if ($line =~ /^\s*\}\s*$/i)
164            {
165                $counter--;
166            }
167
168            if ($counter == 0)
169            {
170                $record = 1;
171                next;   # continue with next $i
172            }
173        }
174
175        if ($record)
176        {
177            push(@newsettingsblock, $line);
178        }
179    }
180
181    return \@newsettingsblock;
182}
183
184########################################
185# Settings in zip list file
186########################################
187
188sub get_settings_from_ziplist
189{
190    my ($blockref) = @_;
191
192    my @allsettings = ();
193    my $isvariables = 0;
194    my $counter = 0;
195    my $variablescounter = 0;
196
197    # Take all settings from the settings block
198    # Do not take the variables from the settings block
199    # If a setting is defined more than once, take the
200    # setting with the largest counter (open brackets)
201
202    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
203    {
204        my $line = ${$blockref}[$i];
205        my $nextline = "";
206
207        if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
208
209        if (($line =~ /^\s*\S+\s*$/i) &&
210            ($nextline =~ /^\s*\{\s*$/i) &&
211            (!($line =~ /^\s*Variables\s*$/i)))
212        {
213            next;
214        }
215
216        if ($line =~ /^\s*Variables\s*$/i)
217        {
218            # This is a block of variables
219
220            $isvariables = 1;
221            next;
222        }
223
224        if ($line =~ /^\s*\{\s*$/i)
225        {
226            if ($isvariables)
227            {
228                $variablescounter++;
229            }
230            else
231            {
232                $counter++;
233            }
234
235            next;
236        }
237
238        if ($line =~ /^\s*\}\s*$/i)
239        {
240            if ($isvariables)
241            {
242                $variablescounter--;
243
244                if ($variablescounter == 0)
245                {
246                    $isvariables = 0;
247                }
248            }
249            else
250            {
251                $counter--;
252            }
253
254            next;
255        }
256
257        if ($isvariables)
258        {
259            next;
260        }
261
262        installer::remover::remove_leading_and_ending_whitespaces(\$line);
263
264        $line .= "\t##$counter##\n";
265
266        push(@allsettings, $line);
267    }
268
269    return \@allsettings;
270}
271
272#######################################
273# Variables from zip list file
274#######################################
275
276sub get_variables_from_ziplist
277{
278    my ($blockref) = @_;
279
280    my @allvariables = ();
281    my $isvariables = 0;
282    my $counter = 0;
283    my $variablescounter = 0;
284    my $countersum = 0;
285
286    # Take all variables from the settings block
287    # Do not take the other settings from the settings block
288    # If a variable is defined more than once, take the
289    # variable with the largest counter (open brackets)
290
291    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
292    {
293        my $line = ${$blockref}[$i];
294        my $nextline = ${$blockref}[$i+1];
295
296        if ($line =~ /^\s*Variables\s*$/i)
297        {
298            # This is a block of variables
299
300            $isvariables = 1;
301            next;
302        }
303
304        if ($line =~ /^\s*\{\s*$/i)
305        {
306            if ($isvariables)
307            {
308                $variablescounter++;
309            }
310            else
311            {
312                $counter++;
313            }
314
315            next;
316        }
317
318        if ($line =~ /^\s*\}\s*$/i)
319        {
320            if ($isvariables)
321            {
322                $variablescounter--;
323
324                if ($variablescounter == 0)
325                {
326                    $isvariables = 0;
327                }
328            }
329            else
330            {
331                $counter--;
332            }
333
334            next;
335        }
336
337        if (!($isvariables))
338        {
339            next;
340        }
341
342        $countersum = $counter + $variablescounter;
343
344        installer::remover::remove_leading_and_ending_whitespaces(\$line);
345
346        $line .= "\t##$countersum##\n";
347
348        push(@allvariables, $line);
349    }
350
351    return \@allvariables;
352}
353
354#######################################################################
355# Removing multiple variables and settings, defined in zip list file
356#######################################################################
357
358sub remove_multiples_from_ziplist
359{
360    my ($blockref) = @_;
361
362    # remove all definitions of settings and variables
363    # that occur more than once in the zip list file.
364    # Take the one with the most open brackets. This
365    # number is stored at the end of the string.
366
367    my @newarray = ();
368    my @itemarray = ();
369    my ($line, $itemname, $itemnumber);
370
371    # first collecting all variables and settings names
372
373    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
374    {
375        $line = ${$blockref}[$i];
376
377        if ($line =~ /^\s*\b(\S*)\b\s+.*\#\#\d+\#\#\s*$/i)
378        {
379            $itemname = $1;
380        }
381
382        if (! installer::existence::exists_in_array($itemname, \@itemarray))
383        {
384            push(@itemarray, $itemname);
385        }
386    }
387
388    # and now all $items can be selected with the highest number
389
390    for ( my $i = 0; $i <= $#itemarray; $i++ )
391    {
392        $itemname = $itemarray[$i];
393
394        my $itemnumbermax = 0;
395        my $printline = "";
396
397        for ( my $j = 0; $j <= $#{$blockref}; $j++ )
398        {
399            $line = ${$blockref}[$j];
400
401            if ($line =~ /^\s*\Q$itemname\E\s+.*\#\#(\d+)\#\#\s*$/)
402            {
403                $itemnumber = $1;
404
405                if ($itemnumber >= $itemnumbermax)
406                {
407                    $printline = $line;
408                    $itemnumbermax = $itemnumber;
409                }
410            }
411        }
412
413        # removing the ending number from the printline
414        # and putting it into the array
415
416        $printline =~ s/\#\#\d+\#\#//;
417        installer::remover::remove_leading_and_ending_whitespaces(\$line);
418        push(@newarray, $printline);
419    }
420
421    return \@newarray;
422}
423
424#########################################################
425# Reading one variable defined in the zip list file
426#########################################################
427
428sub getinfofromziplist
429{
430    my ($blockref, $variable) = @_;
431
432    my $searchstring = "";
433    my $line;
434
435    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
436    {
437        $line = ${$blockref}[$i];
438
439        if ( $line =~ /^\s*\Q$variable\E\s+(.+?)\s*$/ ) # "?" for minimal matching
440        {
441            $searchstring = $1;
442            last;
443        }
444    }
445
446    return \$searchstring;
447}
448
449####################################################
450# Replacing variables in include path
451####################################################
452
453sub replace_all_variables_in_pathes
454{
455    my ( $patharrayref, $variableshashref ) = @_;
456
457    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
458    {
459        my $line = ${$patharrayref}[$i];
460
461        my $key;
462
463        foreach $key (keys %{$variableshashref})
464        {
465            my $value = $variableshashref->{$key};
466
467            if (( $line =~ /\{$key\}/ ) && ( $value eq "" )) { $line = ".\n"; }
468
469            $line =~ s/\{\Q$key\E\}/$value/g;
470        }
471
472        ${$patharrayref}[$i] = $line;
473    }
474}
475
476####################################################
477# Replacing minor in include path
478####################################################
479
480sub replace_minor_in_pathes
481{
482    my ( $patharrayref ) = @_;
483
484    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
485    {
486        my $line = ${$patharrayref}[$i];
487
488        if ( ! defined $ENV{CWS_WORK_STAMP} and defined $ENV{UPDMINOR} )
489#       if ( $installer::globals::minor )
490        {
491            $line =~ s/\{minor\}/$installer::globals::minor/g;
492            # no difference for minor and minornonpre (ToDo ?)
493            $line =~ s/\{minornonpre\}/$installer::globals::minor/g;
494        }
495        else    # building without a minor
496        {
497            $line =~ s/\.\{minor\}//g;
498            $line =~ s/\.\{minornonpre\}//g;
499        }
500
501        ${$patharrayref}[$i] = $line;
502    }
503}
504
505####################################################
506# Replacing packagetype in include path
507####################################################
508
509sub replace_packagetype_in_pathes
510{
511    my ( $patharrayref ) = @_;
512
513    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
514    {
515        my $line = ${$patharrayref}[$i];
516
517        if (( $installer::globals::installertypedir ) && ( $line =~ /\{pkgtype\}/ ))
518        {
519            $line =~ s/\{pkgtype\}/$installer::globals::installertypedir/g;
520        }
521
522        ${$patharrayref}[$i] = $line;
523    }
524}
525
526####################################################
527# Removing ending separators in pathes
528####################################################
529
530sub remove_ending_separator
531{
532    my ( $patharrayref ) = @_;
533
534    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
535    {
536        my $line = ${$patharrayref}[$i];
537
538        installer::remover::remove_ending_pathseparator(\$line);
539
540        $line =~ s/\s*$//;
541        $line = $line . "\n";
542
543        ${$patharrayref}[$i] = $line;
544    }
545}
546
547####################################################
548# Replacing languages in include path
549####################################################
550
551sub replace_languages_in_pathes
552{
553    my ( $patharrayref, $languagesref ) = @_;
554
555    installer::logger::include_header_into_logfile("Replacing languages in include pathes:");
556
557    my @patharray = ();
558    my $infoline = "";
559
560    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
561    {
562        my $line = ${$patharrayref}[$i];
563
564        if ( $line =~ /\$\(LANG\)/ )
565        {
566            my $originalline = $line;
567            my $newline = "";
568
569            for ( my $j = 0; $j <= $#{$languagesref}; $j++ )
570            {
571                my $language = ${$languagesref}[$j];
572                $line =~ s/\$\(LANG\)/$language/g;
573                push(@patharray ,$line);
574                $newdir = $line;
575                $line = $originalline;
576
577                installer::remover::remove_leading_and_ending_whitespaces(\$newline);
578
579                # Is it necessary to refresh the global array, containing all files of all include pathes?
580                if ( -d $newdir )
581                {
582                    # Checking if $newdir is empty
583                    if ( ! installer::systemactions::is_empty_dir($newdir) )
584                    {
585                        $installer::globals::refresh_includepathes = 1;
586                        $infoline = "Directory $newdir exists and is not empty. Refreshing global file array is required.\n";
587                        push( @installer::globals::logfileinfo, $infoline);
588                    }
589                    else
590                    {
591                        $infoline = "Directory $newdir is empty. No refresh of global file array required.\n";
592                        push( @installer::globals::logfileinfo, $infoline);
593                    }
594                }
595                else
596                {
597                    $infoline = "Directory $newdir does not exist. No refresh of global file array required.\n";
598                    push( @installer::globals::logfileinfo, $infoline);
599                }
600            }
601        }
602        else        # not language dependent include path
603        {
604            push(@patharray ,$line);
605        }
606    }
607
608    return \@patharray;
609}
610
611#####################################################
612# Collecting all files from all include paths
613#####################################################
614
615sub list_all_files_from_include_path
616{
617    my ( $patharrayref) = @_;
618
619    installer::logger::include_header_into_logfile("Include pathes:");
620
621    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
622    {
623        my $path = ${$patharrayref}[$i];
624        installer::remover::remove_leading_and_ending_whitespaces(\$path);
625        my $infoline = "$path\n";
626        push( @installer::globals::logfileinfo, $infoline);
627    }
628
629    push( @installer::globals::logfileinfo, "\n");
630
631    return \@filesarray;
632}
633
634#####################################################
635# Collecting all files from all include paths
636#####################################################
637
638sub set_manufacturer
639{
640    my ($allvariables) = @_;
641
642    my $openofficeproductname = "Apache OpenOffice";
643    my $sunname = "";
644
645
646    if ( $allvariables->{'OPENSOURCE'} && $allvariables->{'OPENSOURCE'} == 1 )
647    {
648        $installer::globals::isopensourceproduct = 1;
649        $installer::globals::manufacturer = $openofficeproductname;
650        $installer::globals::longmanufacturer = $openofficeproductname;
651    }
652    else
653    {
654        $installer::globals::isopensourceproduct = 0;
655        if (( $allvariables->{'DEFINEDMANUFACTURER'} ) && ( $allvariables->{'DEFINEDMANUFACTURER'} ne "" )) { $sunname = $allvariables->{'DEFINEDMANUFACTURER'}; }
656        else { installer::exiter::exit_program("ERROR: Property DEFINEDMANUFACTURER has to be set for this product!", "set_manufacturer"); }
657        $installer::globals::manufacturer = $sunname;
658        $installer::globals::longmanufacturer = $sunname;
659    }
660
661    $allvariables->{'MANUFACTURER'} = $installer::globals::manufacturer;
662}
663
664##############################################################
665# A ProductVersion has to be defined. If it is not set in
666# zip.lst, it is set now to "1"
667##############################################################
668
669sub set_default_productversion_if_required
670{
671    my ($allvariables) = @_;
672
673    if (!($allvariables->{'PRODUCTVERSION'}))
674    {
675        $allvariables->{'PRODUCTVERSION'} = 1;  # FAKE
676    }
677}
678
679####################################################
680# Removing .. in pathes
681####################################################
682
683sub simplify_path
684{
685    my ( $pathref ) = @_;
686
687    my $oldpath = $$pathref;
688
689    my $change = 0;
690
691    while ( $oldpath =~ /(^.*)(\Q$installer::globals::separator\E.*\w+?)(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ )
692    {
693        my $part1 = $1;
694        my $part2 = $4;
695        $oldpath = $part1 . $part2;
696        $change = 1;
697    }
698
699    if ( $change ) { $$pathref = $oldpath . "\n"; }
700}
701
702####################################################
703# Removing ending separators in pathes
704####################################################
705
706sub resolve_relative_pathes
707{
708    my ( $patharrayref ) = @_;
709
710    for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
711    {
712        installer::parameter::make_path_absolute(\${$patharrayref}[$i]);
713        simplify_path(\${$patharrayref}[$i]);
714    }
715}
716
717####################################################
718# Replacing variables inside zip list variables
719# Example: {milestone} to be replaced by
720# $installer::globals::lastminor
721####################################################
722
723sub replace_variables_in_ziplist_variables
724{
725    my ($blockref) = @_;
726
727    my $milestonevariable = $installer::globals::lastminor;
728    $milestonevariable =~ s/m//;
729    $milestonevariable =~ s/s/\./;
730
731    my $localminor = $installer::globals::lastminor;
732    if ( $installer::globals::minor ) { $localminor = $installer::globals::minor; }
733
734    my $buildidstringcws = $installer::globals::build . $localminor . "(Build:" . $installer::globals::buildid . ")";
735
736    # the environment variable CWS_WORK_STAMP is set only in CWS
737    if ( $ENV{'CWS_WORK_STAMP'} ) { $buildidstringcws = $buildidstringcws . "\[CWS\:" . $ENV{'CWS_WORK_STAMP'} . "\]"; }
738
739    for ( my $i = 0; $i <= $#{$blockref}; $i++ )
740    {
741        if ($installer::globals::lastminor) { ${$blockref}[$i] =~ s/\{milestone\}/$milestonevariable/; }
742        else { ${$blockref}[$i] =~ s/\{milestone\}//; }
743        if ( $localminor ) { ${$blockref}[$i] =~ s/\{minor\}/$localminor/; }
744        else { ${$blockref}[$i] =~ s/\{minor\}//; }
745        if ( $installer::globals::buildid ) { ${$blockref}[$i] =~ s/\{buildid\}/$installer::globals::buildid/; }
746        else { ${$blockref}[$i] =~ s/\{buildid\}//; }
747        if ( $installer::globals::build ) { ${$blockref}[$i] =~ s/\{buildsource\}/$installer::globals::build/; }
748        else { ${$blockref}[$i] =~ s/\{build\}//; }
749        ${$blockref}[$i] =~ s/\{buildidcws\}/$buildidstringcws/;
750    }
751}
752
753###########################################################
754# Overwrite the vendor string in openoffice.lst that is defined in configure
755###########################################################
756
757sub overwrite_ooovendor
758{
759    my ($variableshashref) = @_;
760    $variableshashref->{'OOOVENDOR'} = $ENV{'OOO_VENDOR'} , if( defined $ENV{'OOO_VENDOR'}  && $ENV{'OOO_VENDOR'} ne "" );
761}
762
763###########################################################
764# Adding the lowercase variables into the variableshashref
765###########################################################
766
767sub add_variables_to_allvariableshashref
768{
769    my ($variableshashref) = @_;
770
771    my $lcvariable = lc($variableshashref->{'PRODUCTNAME'});
772    $variableshashref->{'LCPRODUCTNAME'} = $lcvariable;
773
774    if ($variableshashref->{'SHORT_PRODUCTEXTENSION'})
775    {
776        $variableshashref->{'LCPRODUCTEXTENSION'} = "\-" . lc($variableshashref->{'SHORT_PRODUCTEXTENSION'}); # including the "-" !
777    }
778    else
779    {
780        $variableshashref->{'LCPRODUCTEXTENSION'} = "";
781    }
782
783    if ( $installer::globals::patch ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::patchaddon; }
784    elsif ( $installer::globals::languagepack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::languagepackaddon; }
785    else { $variableshashref->{'PRODUCTADDON'} = ""; }
786
787    my $localbuild = $installer::globals::build;
788    if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; }   # using "680" instead of "src680"
789    $variableshashref->{'PRODUCTMAJOR'} = $localbuild;
790
791    my $localminor = "";
792    if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; }
793    else { $localminor = $installer::globals::lastminor; }
794    if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; }
795    $variableshashref->{'PRODUCTMINOR'} = $localminor;
796
797    $variableshashref->{'PRODUCTBUILDID'} = $installer::globals::buildid;
798    $variableshashref->{'SYSTEM_LIBTEXTCAT_DATA'} = $ENV{'SYSTEM_LIBTEXTCAT_DATA'} , if( defined $ENV{'SYSTEM_LIBTEXTCAT_DATA'} && $ENV{'SYSTEM_LIBTEXTCAT_DATA'} ne "" );
799}
800
8011;
802