diff options
Diffstat (limited to 'solenv/bin/modules/installer/ziplist.pm')
-rw-r--r-- | solenv/bin/modules/installer/ziplist.pm | 828 |
1 files changed, 828 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/ziplist.pm b/solenv/bin/modules/installer/ziplist.pm new file mode 100644 index 000000000..b76c62fc7 --- /dev/null +++ b/solenv/bin/modules/installer/ziplist.pm @@ -0,0 +1,828 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +package installer::ziplist; + +use base 'Exporter'; + +use File::Spec::Functions qw(rel2abs); + +use installer::converter; +use installer::exiter; +use installer::files; +use installer::globals; +use installer::logger; +use installer::remover; +use installer::systemactions; + +our @EXPORT_OK = qw(read_ziplist); + +sub read_ziplist { + my $ziplistname = shift; + + installer::logger::globallog("zip list file: $ziplistname"); + + my $ziplistref = installer::files::read_file($ziplistname); + + installer::logger::print_message( "... analyzing $ziplistname ... \n" ); + + my ($productblockref, $parent) = getproductblock($ziplistref, $installer::globals::product, 1); # product block from zip.lst + + my ($settingsblockref, undef) = getproductblock($productblockref, "Settings", 0); # settings block from zip.lst + $settingsblockref = analyze_settings_block($settingsblockref); # select data from settings block in zip.lst + + my $allsettingsarrayref = get_settings_from_ziplist($settingsblockref); + my $allvariablesarrayref = get_variables_from_ziplist($settingsblockref); + + my ($globalproductblockref, undef) = getproductblock($ziplistref, $installer::globals::globalblock, 0); # global product block from zip.lst + + while (defined $parent) { + my $parentproductblockref; + ($parentproductblockref, $parent) = getproductblock($ziplistref, $parent, 1); + my ($parentsettingsblockref, undef) = getproductblock($parentproductblockref, "Settings", 0); + $parentsettingsblockref = analyze_settings_block($parentsettingsblockref); + my $allparentsettingsarrayref = get_settings_from_ziplist($parentsettingsblockref); + my $allparentvariablesarrayref = get_variables_from_ziplist($parentsettingsblockref); + $allsettingsarrayref = + installer::converter::combine_arrays_from_references_first_win( + $allsettingsarrayref, $allparentsettingsarrayref) + if $#{$allparentsettingsarrayref} > -1; + $allvariablesarrayref = + installer::converter::combine_arrays_from_references_first_win( + $allvariablesarrayref, $allparentvariablesarrayref) + if $#{$allparentvariablesarrayref} > -1; + } + + if ( @{$globalproductblockref} ) { + my ($globalsettingsblockref, undef) = getproductblock($globalproductblockref, "Settings", 0); # settings block from zip.lst + + $globalsettingsblockref = analyze_settings_block($globalsettingsblockref); # select data from settings block in zip.lst + + my $allglobalsettingsarrayref = get_settings_from_ziplist($globalsettingsblockref); + + my $allglobalvariablesarrayref = get_variables_from_ziplist($globalsettingsblockref); + + if ( @{$allglobalsettingsarrayref} ) { + $allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win($allsettingsarrayref, $allglobalsettingsarrayref); + } + if ( @{$allglobalvariablesarrayref} ) { + $allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win($allvariablesarrayref, $allglobalvariablesarrayref); + } + } + + $allsettingsarrayref = remove_multiples_from_ziplist($allsettingsarrayref); + $allvariablesarrayref = remove_multiples_from_ziplist($allvariablesarrayref); + + replace_variables_in_ziplist_variables($allvariablesarrayref); + + my $allvariableshashref = installer::converter::convert_array_to_hash($allvariablesarrayref); + + set_default_productversion_if_required($allvariableshashref); + add_variables_to_allvariableshashref($allvariableshashref); + overwrite_branding( $allvariableshashref ); + + return $allsettingsarrayref, $allvariableshashref; +} + +################################################# +# Getting data from path file and zip list file +################################################# + +sub getproductblock +{ + my ($fileref, $search, $inheritance) = @_; + + my @searchblock = (); + my $searchexists = 0; + my $record = 0; + my $count = 0; + my $line; + my $inh = $inheritance ? '(?::\s*(\S+)\s*)?' : ""; + my $parent; + + for ( my $i = 0; $i <= $#{$fileref}; $i++ ) + { + $line = ${$fileref}[$i]; + + if ( $line =~ /^\s*\Q$search\E\s*$inh$/i ) # case insensitive + { + $record = 1; + $searchexists = 1; + $parent = $1 if $inheritance; + } + + if ($record) + { + push(@searchblock, $line); + } + + if ( ($record) && ($line =~ /\{/) ) + { + $count++; + } + + if ( ($record) && ($line =~ /\}/) ) + { + $count--; + } + + if ( ($record) && ($line =~ /\}/) && ( $count == 0 ) ) + { + $record = 0; + } + } + + if (( ! $searchexists ) && ( $search ne $installer::globals::globalblock )) + { + if ($search eq $installer::globals::product ) + { + installer::exiter::exit_program("ERROR: Product $installer::globals::product not defined in $installer::globals::ziplistname", "getproductblock"); + } + else # this is not possible + { + installer::exiter::exit_program("ERROR: Unknown value for $search in getproductblock()", "getproductblock"); + } + } + + return (\@searchblock, $parent); +} + +############################################### +# Analyzing the settings in the zip list file +############################################### + +sub analyze_settings_block +{ + my ($blockref) = @_; + + my @newsettingsblock = (); + my $record = 1; + my $counter = 0; + + # Allowed values in settings block: + # "Settings", "Variables", "unix" (for destination path and logfile) + + # Comment line in settings block begin with "#" or ";" + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + my $line = ${$blockref}[$i]; + my $nextline = ""; + + if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; } + + # removing comment lines + + if (($line =~ /^\s*\#/) || ($line =~ /^\s*\;/)) + { + next; + } + + # complete blocks of unknown strings are not recorded + + if ((!($line =~ /^\s*\Q$installer::globals::build\E\s*$/i)) && + (!($line =~ /^\s*\bSettings\b\s*$/i)) && + (!($line =~ /^\s*\bVariables\b\s*$/i)) && + (!($line =~ /^\s*\bunix\b\s*$/i)) && + ($nextline =~ /^\s*\{\s*$/i)) + { + $record = 0; + next; # continue with next $i + } + + if (!( $record )) + { + if ($line =~ /^\s*\{\s*$/i) + { + $counter++; + } + + if ($line =~ /^\s*\}\s*$/i) + { + $counter--; + } + + if ($counter == 0) + { + $record = 1; + next; # continue with next $i + } + } + + if ($record) + { + push(@newsettingsblock, $line); + } + } + + return \@newsettingsblock; +} + +######################################## +# Settings in zip list file +######################################## + +sub get_settings_from_ziplist +{ + my ($blockref) = @_; + + my @allsettings = (); + my $isvariables = 0; + my $counter = 0; + my $variablescounter = 0; + + # Take all settings from the settings block + # Do not take the variables from the settings block + # If a setting is defined more than once, take the + # setting with the largest counter (open brackets) + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + my $line = ${$blockref}[$i]; + my $nextline = ""; + + if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; } + + if (($line =~ /^\s*\S+\s*$/i) && + ($nextline =~ /^\s*\{\s*$/i) && + (!($line =~ /^\s*Variables\s*$/i))) + { + next; + } + + if ($line =~ /^\s*Variables\s*$/i) + { + # This is a block of variables + + $isvariables = 1; + next; + } + + if ($line =~ /^\s*\{\s*$/i) + { + if ($isvariables) + { + $variablescounter++; + } + else + { + $counter++; + } + + next; + } + + if ($line =~ /^\s*\}\s*$/i) + { + if ($isvariables) + { + $variablescounter--; + + if ($variablescounter == 0) + { + $isvariables = 0; + } + } + else + { + $counter--; + } + + next; + } + + if ($isvariables) + { + next; + } + + installer::remover::remove_leading_and_ending_whitespaces(\$line); + + $line .= "\t##$counter##\n"; + + push(@allsettings, $line); + } + + return \@allsettings; +} + +####################################### +# Variables from zip list file +####################################### + +sub get_variables_from_ziplist +{ + my ($blockref) = @_; + + my @allvariables = (); + my $isvariables = 0; + my $counter = 0; + my $variablescounter = 0; + my $countersum = 0; + + # Take all variables from the settings block + # Do not take the other settings from the settings block + # If a variable is defined more than once, take the + # variable with the largest counter (open brackets) + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + my $line = ${$blockref}[$i]; + my $nextline = ${$blockref}[$i+1]; + + if ($line =~ /^\s*Variables\s*$/i) + { + # This is a block of variables + + $isvariables = 1; + next; + } + + if ($line =~ /^\s*\{\s*$/i) + { + if ($isvariables) + { + $variablescounter++; + } + else + { + $counter++; + } + + next; + } + + if ($line =~ /^\s*\}\s*$/i) + { + if ($isvariables) + { + $variablescounter--; + + if ($variablescounter == 0) + { + $isvariables = 0; + } + } + else + { + $counter--; + } + + next; + } + + if (!($isvariables)) + { + next; + } + + $countersum = $counter + $variablescounter; + + installer::remover::remove_leading_and_ending_whitespaces(\$line); + + $line .= "\t##$countersum##\n"; + + push(@allvariables, $line); + } + + return \@allvariables; +} + +####################################################################### +# Removing multiple variables and settings, defined in zip list file +####################################################################### + +sub remove_multiples_from_ziplist +{ + my ($blockref) = @_; + + # remove all definitions of settings and variables + # that occur more than once in the zip list file. + # Take the one with the most open brackets. This + # number is stored at the end of the string. + + my @newarray = (); + my @itemarray = (); + my ($line, $itemname, $itemnumber); + + # first collecting all variables and settings names + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + $line = ${$blockref}[$i]; + + if ($line =~ /^\s*\b(\S*)\b\s+.*\#\#\d+\#\#\s*$/i) + { + $itemname = $1; + } + + if (! grep {$_ eq $itemname} @itemarray) + { + push(@itemarray, $itemname); + } + } + + # and now all $items can be selected with the highest number + + for ( my $i = 0; $i <= $#itemarray; $i++ ) + { + $itemname = $itemarray[$i]; + + my $itemnumbermax = 0; + my $printline = ""; + + for ( my $j = 0; $j <= $#{$blockref}; $j++ ) + { + $line = ${$blockref}[$j]; + + if ($line =~ /^\s*\Q$itemname\E\s+.*\#\#(\d+)\#\#\s*$/) + { + $itemnumber = $1; + + if ($itemnumber >= $itemnumbermax) + { + $printline = $line; + $itemnumbermax = $itemnumber; + } + } + } + + # removing the ending number from the printline + # and putting it into the array + + $printline =~ s/\#\#\d+\#\#//; + installer::remover::remove_leading_and_ending_whitespaces(\$line); + push(@newarray, $printline); + } + + return \@newarray; +} + +######################################################### +# Reading one variable defined in the zip list file +######################################################### + +sub getinfofromziplist +{ + my ($blockref, $variable) = @_; + + my $searchstring = ""; + my $line; + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + $line = ${$blockref}[$i]; + + if ( $line =~ /^\s*\Q$variable\E\s+(.+?)\s*$/ ) # "?" for minimal matching + { + $searchstring = $1; + last; + } + } + + return \$searchstring; +} + +#################################################### +# Replacing variables in include path +#################################################### + +sub replace_all_variables_in_paths +{ + my ( $patharrayref, $variableshashref ) = @_; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + + my $key; + + foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) + { + my $value = $variableshashref->{$key}; + + if (( $line =~ /\{$key\}/ ) && ( $value eq "" )) { $line = ".\n"; } + + $line =~ s/\{\Q$key\E\}/$value/g; + } + + ${$patharrayref}[$i] = $line; + } +} + +#################################################### +# Replacing minor in include path +#################################################### + +sub replace_minor_in_paths +{ + my ( $patharrayref ) = @_; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + + $line =~ s/\.\{minor\}//g; + $line =~ s/\.\{minornonpre\}//g; + + ${$patharrayref}[$i] = $line; + } +} + +#################################################### +# Replacing packagetype in include path +#################################################### + +sub replace_packagetype_in_paths +{ + my ( $patharrayref ) = @_; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + + if (( $installer::globals::installertypedir ) && ( $line =~ /\{pkgtype\}/ )) + { + $line =~ s/\{pkgtype\}/$installer::globals::installertypedir/g; + } + + ${$patharrayref}[$i] = $line; + } +} + +#################################################### +# Removing ending separators in paths +#################################################### + +sub remove_ending_separator +{ + my ( $patharrayref ) = @_; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + + installer::remover::remove_ending_pathseparator(\$line); + + $line =~ s/\s*$//; + $line = $line . "\n"; + + ${$patharrayref}[$i] = $line; + } +} + +#################################################### +# Replacing languages in include path +#################################################### + +sub replace_languages_in_paths +{ + my ( $patharrayref, $languagesref ) = @_; + + installer::logger::include_header_into_logfile("Replacing languages in include paths:"); + + my @patharray = (); + my $infoline = ""; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + + if ( $line =~ /\$\(LANG\)/ ) + { + my $originalline = $line; + my $newline = ""; + + for ( my $j = 0; $j <= $#{$languagesref}; $j++ ) + { + my $language = ${$languagesref}[$j]; + $line =~ s/\$\(LANG\)/$language/g; + push(@patharray ,$line); + $newdir = $line; + $line = $originalline; + + installer::remover::remove_leading_and_ending_whitespaces(\$newline); + + # Is it necessary to refresh the global array, containing all files of all include paths? + if ( -d $newdir ) + { + # Checking if $newdir is empty + if ( ! installer::systemactions::is_empty_dir($newdir) ) + { + $installer::globals::refresh_includepaths = 1; + $infoline = "Directory $newdir exists and is not empty. Refreshing global file array is required.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + else + { + $infoline = "Directory $newdir is empty. No refresh of global file array required.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + } + else + { + $infoline = "Directory $newdir does not exist. No refresh of global file array required.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + } + } + else # not language dependent include path + { + push(@patharray ,$line); + } + } + + return \@patharray; +} + +##################################################### +# Collecting all files from all include paths +##################################################### + +sub list_all_files_from_include_path +{ + my ( $patharrayref) = @_; + + installer::logger::include_header_into_logfile("Include paths:"); + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $path = ${$patharrayref}[$i]; + installer::remover::remove_leading_and_ending_whitespaces(\$path); + my $infoline = "$path\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + push( @installer::globals::logfileinfo, "\n"); + + return \@filesarray; +} + +##################################################### +# Collecting all files from all include paths +##################################################### + +sub set_manufacturer +{ + my ($allvariables) = @_; + my $manufacturer; + + if( defined $ENV{'OOO_VENDOR'} && $ENV{'OOO_VENDOR'} ne "" ) + { + $manufacturer = $ENV{'OOO_VENDOR'}; + } + elsif( defined $ENV{'USERNAME'} && $ENV{'USERNAME'} ne "" ) + { + $manufacturer = $ENV{'USERNAME'}; + } + elsif( defined $ENV{'USER'} && $ENV{'USER'} ne "" ) + { + $manufacturer = $ENV{'USER'}; + } + else + { + $manufacturer = "default"; + } + + $installer::globals::manufacturer = $manufacturer; + $installer::globals::longmanufacturer = $manufacturer; + + $allvariables->{'MANUFACTURER'} = $installer::globals::manufacturer; +} + +############################################################## +# A ProductVersion has to be defined. If it is not set in +# zip.lst, it is set now to "1" +############################################################## + +sub set_default_productversion_if_required +{ + my ($allvariables) = @_; + + if (!($allvariables->{'PRODUCTVERSION'})) + { + $allvariables->{'PRODUCTVERSION'} = 1; # FAKE + } +} + +#################################################### +# Removing .. in paths +#################################################### + +sub simplify_path +{ + my ( $pathref ) = @_; + + my $oldpath = $$pathref; + + my $change = 0; + + while ( $oldpath =~ /(^.*)(\Q$installer::globals::separator\E.*\w+?)(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ ) + { + my $part1 = $1; + my $part2 = $4; + $oldpath = $part1 . $part2; + $change = 1; + } + + if ( $change ) { $$pathref = $oldpath . "\n"; } +} + +#################################################### +# Removing ending separators in paths +#################################################### + +sub resolve_relative_paths +{ + my ( $patharrayref ) = @_; + + for my $path ( @{$patharrayref} ) + { + $path = rel2abs($path); + simplify_path(\$path); + } +} + +#################################################### +# Replacing variables inside zip list variables +# Example: {milestone} to be replaced by +# $installer::globals::lastminor +#################################################### + +sub replace_variables_in_ziplist_variables +{ + my ($blockref) = @_; + + for ( my $i = 0; $i <= $#{$blockref}; $i++ ) + { + ${$blockref}[$i] =~ s/\{milestone\}//; + ${$blockref}[$i] =~ s/\{minor\}//; + if ( $installer::globals::buildid ) { ${$blockref}[$i] =~ s/\{buildid\}/$installer::globals::buildid/; } + else { ${$blockref}[$i] =~ s/\{buildid\}//; } + if ( $installer::globals::build ) { ${$blockref}[$i] =~ s/\{buildsource\}/$installer::globals::build/; } + else { ${$blockref}[$i] =~ s/\{build\}//; } + } +} + +########################################################### +# Overwrite branding data in openoffice.lst that is defined in configure +########################################################### + +sub overwrite_branding +{ + my ($variableshashref) = @_; + $variableshashref->{'PROGRESSBARCOLOR'} = $ENV{'PROGRESSBARCOLOR'} , if( defined $ENV{'PROGRESSBARCOLOR'} && $ENV{'PROGRESSBARCOLOR'} ne "" ); + $variableshashref->{'PROGRESSSIZE'} = $ENV{'PROGRESSSIZE'} , if( defined $ENV{'PROGRESSSIZE'} && $ENV{'PROGRESSSIZE'} ne "" ); + $variableshashref->{'PROGRESSPOSITION'} = $ENV{'PROGRESSPOSITION'} , if( defined $ENV{'PROGRESSPOSITION'} && $ENV{'PROGRESSPOSITION'} ne "" ); + $variableshashref->{'PROGRESSFRAMECOLOR'} = $ENV{'PROGRESSFRAMECOLOR'} , if( defined $ENV{'PROGRESSFRAMECOLOR'} && $ENV{'PROGRESSFRAMECOLOR'} ne "" ); + $variableshashref->{'PROGRESSTEXTCOLOR'} = $ENV{'PROGRESSTEXTCOLOR'} , if( defined $ENV{'PROGRESSTEXTCOLOR'} && $ENV{'PROGRESSTEXTCOLOR'} ne "" ); + $variableshashref->{'PROGRESSTEXTBASELINE'} = $ENV{'PROGRESSTEXTBASELINE'} , if( defined $ENV{'PROGRESSTEXTBASELINE'} && $ENV{'PROGRESSTEXTBASELINE'} ne "" ); +} + +########################################################### +# Adding the lowercase variables into the variableshashref +########################################################### + +sub add_variables_to_allvariableshashref +{ + my ($variableshashref) = @_; + + my $lcvariable = lc($variableshashref->{'PRODUCTNAME'}); + $variableshashref->{'LCPRODUCTNAME'} = $lcvariable; + + if ($variableshashref->{'PRODUCTEXTENSION'}) + { + $variableshashref->{'LCPRODUCTEXTENSION'} = "\-" . lc($variableshashref->{'PRODUCTEXTENSION'}); # including the "-" ! + } + else + { + $variableshashref->{'LCPRODUCTEXTENSION'} = ""; + } + + if ( $installer::globals::languagepack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::languagepackaddon; } + elsif ( $installer::globals::helppack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::helppackaddon; } + else { $variableshashref->{'PRODUCTADDON'} = ""; } + + my $localbuild = $installer::globals::build; + if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680" + $variableshashref->{'PRODUCTMAJOR'} = $localbuild; + + $variableshashref->{'PRODUCTBUILDID'} = $installer::globals::buildid; +} + +1; |