diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /solenv/bin/modules/installer/worker.pm | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream.tar.xz libreoffice-upstream.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'solenv/bin/modules/installer/worker.pm')
-rw-r--r-- | solenv/bin/modules/installer/worker.pm | 921 |
1 files changed, 921 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm new file mode 100644 index 000000000..fb2969f77 --- /dev/null +++ b/solenv/bin/modules/installer/worker.pm @@ -0,0 +1,921 @@ +# +# 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::worker; + +use Cwd; +use File::Copy; +use File::stat; +use File::Temp qw(tmpnam); +use File::Path; +use File::Basename; +use installer::control; +use installer::converter; +use installer::exiter; +use installer::files; +use installer::globals; +use installer::logger; +use installer::pathanalyzer; +use installer::scpzipfiles; +use installer::scriptitems; +use installer::systemactions; +use installer::windows::language; + +######################################### +# Saving the patchlist file +######################################### + +sub _save_patchlist_file +{ + my ($installlogdir, $patchlistfilename) = @_; + + my $installpatchlistdir = installer::systemactions::create_directory_next_to_directory($installlogdir, "patchlist"); + $patchlistfilename =~ s/log\_/patchfiles\_/; + $patchlistfilename =~ s/\.log/\.txt/; + installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, \@installer::globals::patchfilecollector); + installer::logger::print_message( "... creating patchlist file $patchlistfilename \n" ); + +} + +############################################################### +# Removing all directories of a special language +# in the directory $basedir +############################################################### + +sub remove_old_installation_sets +{ + my ($basedir) = @_; + + installer::logger::print_message( "... removing old installation directories ...\n" ); + + my $removedir = $basedir; + + if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } + + # looking for non successful old installation sets + + $removedir = $basedir . "_witherror"; + if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } + + $removedir = $basedir . "_inprogress"; + if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } + + # finally the $basedir can be created empty + + if ( $installer::globals::localinstalldirset ) { installer::systemactions::create_directory_structure($basedir); } + + installer::systemactions::create_directory($basedir); +} + +############################################################### +# Creating the installation directory structure +############################################################### + +sub create_installation_directory +{ + my ($shipinstalldir, $languagestringref, $current_install_number_ref) = @_; + + my $installdir = ""; + + my $languageref = $languagestringref; + + $installdir = installer::systemactions::create_directories("install", $languageref); + installer::logger::print_message( "... creating installation set in $installdir ...\n" ); + remove_old_installation_sets($installdir); + my $inprogressinstalldir = $installdir . "_inprogress"; + installer::systemactions::rename_directory($installdir, $inprogressinstalldir); + $installdir = $inprogressinstalldir; + + $installer::globals::saveinstalldir = $installdir; # saving directory globally, in case of exiting + + return $installdir; +} + +############################################################### +# Analyzing and creating the log file +############################################################### + +sub analyze_and_save_logfile +{ + my ($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number) = @_; + + my $is_success = 1; + my $finalinstalldir = ""; + + installer::logger::print_message( "... checking log file " . $loggingdir . $installer::globals::logfilename . "\n" ); + + my $contains_error = installer::control::check_logfile(\@installer::globals::logfileinfo); + + # Dependent from the success, the installation directory can be renamed. + + if ( $contains_error ) + { + my $errordir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "_witherror"); + # Error output to STDERR + for ( my $j = 0; $j <= $#installer::globals::errorlogfileinfo; $j++ ) + { + my $line = $installer::globals::errorlogfileinfo[$j]; + $line =~ s/\s*$//g; + installer::logger::print_error( $line ); + } + $is_success = 0; + + $finalinstalldir = $errordir; + } + else + { + my $destdir = ""; + + $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", ""); + + $finalinstalldir = $destdir; + } + + # Saving the logfile in the log file directory and additionally in a log directory in the install directory + + my $numberedlogfilename = $installer::globals::logfilename; + installer::logger::print_message( "... creating log file $numberedlogfilename \n" ); + installer::files::save_file($loggingdir . $numberedlogfilename, \@installer::globals::logfileinfo); + installer::files::save_file($installlogdir . $installer::globals::separator . $numberedlogfilename, \@installer::globals::logfileinfo); + + # Saving the list of patchfiles in a patchlist directory in the install directory + if ( $installer::globals::creating_windows_installer_patch ) { _save_patchlist_file($installlogdir, $numberedlogfilename); } + + if ( $installer::globals::creating_windows_installer_patch ) { $installer::globals::creating_windows_installer_patch = 0; } + + # Exiting the packaging process, if an error occurred. + # This is important, to get an error code "-1", if an error was found in the log file, + # that did not break the packaging process + + if ( ! $is_success) { installer::exiter::exit_program("ERROR: Found an error in the logfile " . $loggingdir . $installer::globals::logfilename . ". Packaging failed.", "analyze_and_save_logfile"); } + + return ($is_success, $finalinstalldir); +} + +############################################################### +# Removing all directories that are saved in the +# global directory @installer::globals::removedirs +############################################################### + +sub clean_output_tree +{ + installer::logger::print_message( "... cleaning the output tree ...\n" ); + + for ( my $i = 0; $i <= $#installer::globals::removedirs; $i++ ) + { + if ( -d $installer::globals::removedirs[$i] ) + { + installer::logger::print_message( "... removing directory $installer::globals::removedirs[$i] ...\n" ); + installer::systemactions::remove_complete_directory($installer::globals::removedirs[$i], 1); + } + } + + # Last try to remove the ship test directory + + if ( $installer::globals::shiptestdirectory ) + { + if ( -d $installer::globals::shiptestdirectory ) + { + my $infoline = "Last try to remove $installer::globals::shiptestdirectory . \n"; + push(@installer::globals::logfileinfo, $infoline); + my $systemcall = "rmdir $installer::globals::shiptestdirectory"; + my $returnvalue = system($systemcall); + } + } +} + +########################################################### +# Setting one language in the language independent +# array of include paths with $(LANG) +########################################################### + +sub get_language_specific_include_paths +{ + my ( $patharrayref, $onelanguage ) = @_; + + my @patharray = (); + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + my $line = ${$patharrayref}[$i]; + $line =~ s/\$\(LANG\)/$onelanguage/g; + push(@patharray ,$line); + } + + return \@patharray; +} + +############################################################## +# Collecting all items with a defined flag +############################################################## + +sub collect_all_items_with_special_flag +{ + my ($itemsref, $flag) = @_; + + my @allitems = (); + + for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) + { + my $oneitem = ${$itemsref}[$i]; + my $styles = ""; + if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; + + if ( $styles =~ /\b$flag\b/ ) + { + push( @allitems, $oneitem ); + } + } + + return \@allitems; +} + +############################################################## +# Removing all items with a defined flag from collector +############################################################## + +sub remove_all_items_with_special_flag +{ + my ($itemsref, $flag) = @_; + + my @allitems = (); + + for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) + { + my $oneitem = ${$itemsref}[$i]; + my $styles = ""; + if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; + if ( $styles =~ /\b$flag\b/ ) + { + my $infoline = "Attention: Removing from collector: $oneitem->{'Name'} !\n"; + push( @installer::globals::logfileinfo, $infoline); + if ( $flag eq "BINARYTABLE_ONLY" ) { push(@installer::globals::binarytableonlyfiles, $oneitem); } + next; + } + push( @allitems, $oneitem ); + } + + return \@allitems; +} + +########################################################### +# Mechanism for simple installation without packing +########################################################### + +sub install_simple ($$$$$$) +{ + my ($packagename, $languagestring, $directoriesarray, $filesarray, $linksarray, $unixlinksarray) = @_; + + installer::logger::print_message( "... installing module $packagename ...\n" ); + + my $destdir = $installer::globals::destdir; + my @lines = (); + + installer::logger::print_message( "DestDir: $destdir \n" ); + installer::logger::print_message( "Rootpath: $installer::globals::rootpath \n" ); + + `mkdir -p $destdir` if $destdir ne ""; + `mkdir -p $destdir$installer::globals::rootpath`; + + # Create Directories + for ( my $i = 0; $i <= $#{$directoriesarray}; $i++ ) + { + my $onedir = ${$directoriesarray}[$i]; + my $dir = ""; + + if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } + + if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )) + { + my $hostname = $onedir->{'HostName'}; + + # ignore '.' subdirectories + next if ( $hostname =~ m/\.$/ ); + # remove './' from the path + $hostname =~ s/\.\///g; + + # printf "mkdir $destdir$hostname\n"; + mkdir $destdir . $hostname; + push @lines, "%dir " . $hostname . "\n"; + } + } + + for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) + { + my $onefile = ${$filesarray}[$i]; + my $unixrights = $onefile->{'UnixRights'}; + my $destination = $onefile->{'destination'}; + my $sourcepath = $onefile->{'sourcepath'}; + + # This is necessary to install SDK that includes files with $ in its name + # Otherwise, the following shell commands does not work and the file list + # is not correct + $destination =~ s/\$\$/\$/; + $sourcepath =~ s/\$\$/\$/; + + # remove './' from the path + $sourcepath =~ s/\.\///g; + $destination =~ s/\.\///g; + + push @lines, "$destination\n"; + if(-d "$destdir$destination"){ + rmtree("$destdir$destination"); + } + if(-e "$destdir$destination") { + unlink "$destdir$destination"; + } + + if ( -l "$sourcepath" ) { + symlink (readlink ("$sourcepath"), "$destdir$destination") || die "Can't symlink $destdir$destination -> " . readlink ("$sourcepath") . "$!"; + } + elsif ( -d $sourcepath ) { + `mkdir -p "$destdir$destination"`; + } + else { + copy ("$sourcepath", "$destdir$destination") || die "Can't copy file: $sourcepath -> $destdir$destination $!"; + my $sourcestat = stat($sourcepath); + utime ($sourcestat->atime, $sourcestat->mtime, "$destdir$destination"); + chmod (oct($unixrights), "$destdir$destination") || die "Can't change permissions: $!"; + } + push @lines, "$destination\n"; + } + + for ( my $i = 0; $i <= $#{$linksarray}; $i++ ) + { + my $onelink = ${$linksarray}[$i]; + my $destination = $onelink->{'destination'}; + my $destinationfile = $onelink->{'destinationfile'}; + + if(-e "$destdir$destination") { + unlink "$destdir$destination"; + } + symlink ("$destinationfile", "$destdir$destination") || die "Can't create symlink: $!"; + push @lines, "$destination\n"; + } + + for ( my $i = 0; $i <= $#{$unixlinksarray}; $i++ ) + { + my $onelink = ${$unixlinksarray}[$i]; + my $target = $onelink->{'Target'}; + my $destination = $onelink->{'destination'}; + my $cmd = "mkdir -p '" . dirname($destdir . $destination) . "'"; + system($cmd) && die "Failed to execute \"$cmd\""; + $cmd = "ln -sf '$target' '$destdir$destination'"; + + system($cmd) && die "Failed \"$cmd\""; + push @lines, "$destination\n"; + } + + if ( $destdir ne "" ) + { + my $filelist; + my $fname = $installer::globals::destdir . "/$packagename"; + open ($filelist, ">$fname") || die "Can't open $fname: $!"; + print $filelist @lines; + close ($filelist); + } + +} + +########################################################### +# Selecting langpack items +########################################################### + +sub select_langpack_items +{ + my ( $itemsref, $itemname ) = @_; + + installer::logger::include_header_into_logfile("Selecting RegistryItems for Language Packs"); + + my @itemsarray = (); + + for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) + { + my $oneitem = ${$itemsref}[$i]; + + # Items with style "LANGUAGEPACK" have to be included into the patch + my $styles = ""; + if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } + if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); } + } + + return \@itemsarray; +} + +########################################################### +# Selecting helppack items +########################################################### + +sub select_helppack_items +{ + my ( $itemsref, $itemname ) = @_; + + installer::logger::include_header_into_logfile("Selecting RegistryItems for Help Packs"); + + my @itemsarray = (); + + for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) + { + my $oneitem = ${$itemsref}[$i]; + + # Items with style "HELPPACK" have to be included into the patch + my $styles = ""; + if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } + if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) { push(@itemsarray, $oneitem); } + } + + return \@itemsarray; +} + +########################################################### +# Replacing %-variables with the content +# of $allvariableshashref +########################################################### + +sub replace_variables_in_string +{ + my ( $string, $variableshashref ) = @_; + + if ( $string =~ /^.*\%\w+.*$/ ) + { + my $key; + + # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes + foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) + { + my $value = $variableshashref->{$key}; + $key = "\%" . $key; + $string =~ s/\Q$key\E/$value/g; + } + } + + return $string; +} + +################################################################# +# Copying the files defined as ScpActions into the +# installation set. +################################################################# + +sub put_scpactions_into_installset +{ + my ($installdir) = @_; + + installer::logger::include_header_into_logfile("Start: Copying scp action files into installation set"); + + for ( my $i = 0; $i <= $#installer::globals::allscpactions; $i++ ) + { + my $onescpaction = $installer::globals::allscpactions[$i]; + + my $subdir = ""; + if ( $onescpaction->{'Subdir'} ) { $subdir = $onescpaction->{'Subdir'}; } + + if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; } # do not copy this ScpAction loader + + my $destdir = $installdir; + $destdir =~ s/\Q$installer::globals::separator\E\s*$//; + if ( $subdir ) { $destdir = $destdir . $installer::globals::separator . $subdir; } + + my $sourcefile = $onescpaction->{'sourcepath'}; + my $destfile = $destdir . $installer::globals::separator . $onescpaction->{'DestinationName'}; + + if (( $subdir =~ /\// ) || ( $subdir =~ /\\/ )) + { + installer::systemactions::create_directory_structure($destdir); + } + else + { + installer::systemactions::create_directory($destdir); + } + + installer::systemactions::copy_one_file($sourcefile, $destfile); + + if ( $onescpaction->{'UnixRights'} ) + { + chmod oct($onescpaction->{'UnixRights'}), $destfile; + } + + } + + installer::logger::include_header_into_logfile("End: Copying scp action files into installation set"); + +} + +################################################################# +# Collecting scp actions for all languages +################################################################# + +sub collect_scpactions +{ + my ($allscpactions) = @_; + + for ( my $i = 0; $i <= $#{$allscpactions}; $i++ ) + { + push(@installer::globals::allscpactions, ${$allscpactions}[$i]); + } +} + +########################################################### +# Adding additional variables into the variableshashref, +# that are defined in include files in the source tree. The +# names of the include files are stored in +# ADD_INCLUDE_FILES (comma separated list). +########################################################### + +sub add_variables_from_inc_to_hashref +{ + my ($allvariables, $includepatharrayref) = @_; + + my $infoline = ""; + my $includefilelist = $allvariables->{'ADD_INCLUDE_FILES'} || ""; + + for my $includefilename (split /,\s*/, $includefilelist) + { + $includefilename =~ s/^\s*//; + $includefilename =~ s/\s*$//; + $includefilenameref = $ENV{'SRCDIR'} . "/" . $includefilename; + if ( ! -f $includefilenameref ) { installer::exiter::exit_program("Include file $includefilename ($includefilenameref) not found!\nADD_INCLUDE_FILES = $allvariables->{'ADD_INCLUDE_FILES'}", "add_variables_from_inc_to_hashref"); } + + $infoline = "Including inc file: $includefilenameref \n"; + push( @installer::globals::globallogfileinfo, $infoline); + + my $includefile = installer::files::read_file($includefilenameref); + + for ( my $j = 0; $j <= $#{$includefile}; $j++ ) + { + # Analyzing all "key=value" lines + my $oneline = ${$includefile}[$j]; + + if ( $oneline =~ /^\s*(\S+)\s*\=\s*(.*?)\s*$/ ) # no white space allowed in key + { + my $key = $1; + my $value = $2; + $allvariables->{$key} = $value; + $infoline = "Setting of variable: $key = $value\n"; + push( @installer::globals::globallogfileinfo, $infoline); + } + } + } +} + +############################################## +# Collecting all files from include paths +############################################## + +sub collect_all_files_from_includepaths +{ + my ($patharrayref) = @_; + + installer::logger::globallog("Reading all directories: Start"); + installer::logger::print_message( "... reading include paths ...\n" ); + # empty the global + + @installer::globals::allincludepaths =(); + my $infoline; + + for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) + { + $includepath = ${$patharrayref}[$i]; + installer::remover::remove_leading_and_ending_whitespaces(\$includepath); + + if ( ! -d $includepath ) + { + $infoline = "$includepath does not exist. (Can be removed from include path list?)\n"; + push( @installer::globals::globallogfileinfo, $infoline); + next; + } + + my @sourcefiles = (); + my $pathstring = ""; + installer::systemactions::read_full_directory($includepath, $pathstring, \@sourcefiles); + + if ( ! ( $#sourcefiles > -1 )) + { + $infoline = "$includepath is empty. (Can be removed from include path list?)\n"; + push( @installer::globals::globallogfileinfo, $infoline); + } + else + { + my $number = $#sourcefiles + 1; + $infoline = "Directory $includepath contains $number files (including subdirs)\n"; + push( @installer::globals::globallogfileinfo, $infoline); + + my %allfileshash = (); + $allfileshash{'includepath'} = $includepath; + + for ( my $j = 0; $j <= $#sourcefiles; $j++ ) + { + $allfileshash{$sourcefiles[$j]} = 1; + } + + push(@installer::globals::allincludepaths, \%allfileshash); + } + } + + $installer::globals::include_paths_read = 1; + + installer::logger::globallog("Reading all directories: End"); + push( @installer::globals::globallogfileinfo, "\n"); +} + +############################################## +# Searching for a file with the gid +############################################## + +sub find_file_by_id +{ + my ( $filesref, $gid ) = @_; + + my $foundfile = 0; + my $onefile; + + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) + { + $onefile = ${$filesref}[$i]; + my $filegid = $onefile->{'gid'}; + + if ( $filegid eq $gid ) + { + $foundfile = 1; + last; + } + } + + if (! $foundfile ) { $onefile = ""; } + + return $onefile; +} + +################################################# +# Generating paths for cygwin (second version) +# This function generates smaller files for +################################################# + +sub generate_cygwin_paths +{ + my ($filesref) = @_; + + installer::logger::include_timestamp_into_logfile("Starting generating cygwin paths"); + + my $infoline = "Generating cygwin paths (generate_cygwin_paths)\n"; + push( @installer::globals::logfileinfo, $infoline); + + my $max = 5000; # number of paths in one file + + my @pathcollector = (); + my $startnumber = 0; + my $counter = 0; + + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) + { + my $line = ${$filesref}[$i]->{'sourcepath'} . "\n"; + push(@pathcollector, $line); + $counter++; + + if (( $i == $#{$filesref} ) || ((( $counter % $max ) == 0 ) && ( $i > 0 ))) + { + my $tmpfilename = "cygwinhelper_" . $i . ".txt"; + my $temppath = $installer::globals::temppath; + $temppath =~ s/\Q$installer::globals::separator\E\s*$//; + $tmpfilename = $temppath . $installer::globals::separator . $tmpfilename; + $infoline = "Creating temporary file for cygwin conversion: $tmpfilename (contains $counter paths)\n"; + push( @installer::globals::logfileinfo, $infoline); + if ( -f $tmpfilename ) { unlink $tmpfilename; } + + installer::files::save_file($tmpfilename, \@pathcollector); + + my $success = 0; + my @cyg_sourcepathlist = qx{cygpath -w -f "$tmpfilename"}; + chomp @cyg_sourcepathlist; + + # Validating the array, it has to contain the correct number of values + my $new_paths = $#cyg_sourcepathlist + 1; + if ( $new_paths == $counter ) { $success = 1; } + + if ($success) + { + $infoline = "Success: Successfully converted to cygwin paths!\n"; + push( @installer::globals::logfileinfo, $infoline); + } + else + { + $infoline = "ERROR: Failed to convert to cygwin paths!\n"; + push( @installer::globals::logfileinfo, $infoline); + installer::exiter::exit_program("ERROR: Failed to convert to cygwin paths!", "generate_cygwin_paths"); + } + + for ( my $j = 0; $j <= $#cyg_sourcepathlist; $j++ ) + { + my $number = $startnumber + $j; + ${$filesref}[$number]->{'cyg_sourcepath'} = $cyg_sourcepathlist[$j]; + } + + if ( -f $tmpfilename ) { unlink $tmpfilename; } + + @pathcollector = (); + $startnumber = $startnumber + $max; + $counter = 0; + } + } + + # Checking existence of cyg_sourcepath for every file + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) + { + if (( ! exists(${$filesref}[$i]->{'cyg_sourcepath'}) ) || ( ${$filesref}[$i]->{'cyg_sourcepath'} eq "" )) + { + $infoline = "ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}\n"; + push( @installer::globals::logfileinfo, $infoline); + installer::exiter::exit_program("ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}!", "generate_cygwin_paths"); + } + } + + installer::logger::include_timestamp_into_logfile("Ending generating cygwin paths"); +} + +###################################################### +# Getting the first entry from a list of languages +###################################################### + +sub get_first_from_list +{ + my ( $list ) = @_; + + my $first = $list; + + if ( $list =~ /^\s*(.+?),(.+)\s*$/) # "?" for minimal matching + { + $first = $1; + } + + return $first; +} + +################################################ +# Setting all spellchecker languages +################################################ + +sub set_spellcheckerlanguages +{ + my ( $productlanguagesarrayref, $allvariables ) = @_; + + my %productlanguages = (); + for ( my $i = 0; $i <= $#{$productlanguagesarrayref}; $i++ ) { $productlanguages{${$productlanguagesarrayref}[$i]} = 1; } + + my $spellcheckfilename = $allvariables->{'SPELLCHECKERFILE'}; + + my $spellcheckfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$spellcheckfilename, "", 1); + + if ($$spellcheckfileref eq "") { installer::exiter::exit_program("ERROR: Could not find $spellcheckfilename!", "set_spellcheckerlanguages"); } + + my $infoline = "Using spellchecker file: $$spellcheckfileref \n"; + push( @installer::globals::globallogfileinfo, $infoline); + + my $spellcheckfile = installer::files::read_file($$spellcheckfileref); + my %spellcheckhash = (); + + for ( my $j = 0; $j <= $#{$spellcheckfile}; $j++ ) + { + # Analyzing all "key=value" lines + my $oneline = ${$spellcheckfile}[$j]; + + if ( $oneline =~ /^\s*(\S+)\s*\=\s*\"(.*?)\"\s*$/ ) # no white space allowed in key + { + my $onelang = $1; + my $languagelist = $2; + + # Special handling for language packs. Only include the first language of the language list. + # If no spellchecker shall be included, the keyword "EMPTY" can be used. + + if ( $installer::globals::languagepack ) + { + my $first = get_first_from_list($languagelist); + + if ( $first eq "EMPTY" ) # no spellchecker into language pack + { + $languagelist = ""; + } + else + { + $languagelist = $first; + } + } + else # no language pack, so EMPTY is not required + { + $languagelist =~ s/^\s*EMPTY\s*,//; # removing the entry EMPTY + } + + $spellcheckhash{$onelang} = $languagelist; + } + } + + # Collecting all required languages in %installer::globals::spellcheckerlanguagehash + + foreach my $lang (keys %productlanguages) + { + my $languagelist = ""; + if ( exists($spellcheckhash{$lang}) ) { $languagelist = $spellcheckhash{$lang}; } + else { $languagelist = ""; } # no dictionary unless defined in SPELLCHECKERFILE + + my $langlisthash = installer::converter::convert_stringlist_into_hash(\$languagelist, ","); + foreach my $onelang ( keys %{$langlisthash} ) { $installer::globals::spellcheckerlanguagehash{$onelang} = 1; } + } + + $installer::globals::analyze_spellcheckerlanguage = 1; + + # Logging + + my $langstring = ""; + foreach my $lang (sort keys %installer::globals::spellcheckerlanguagehash) { $langstring = $langstring . "," . $lang } + $langstring =~ s/^\s*,//; + + $infoline = "Collected spellchecker languages for spellchecker: $langstring \n"; + push( @installer::globals::globallogfileinfo, $infoline); +} + +################################################ +# Including a license text into setup script +################################################ + +sub put_license_into_setup +{ + my ($installdir, $includepatharrayref) = @_; + + # find and read the license file + my $licenselanguage = "en-US"; # always english ! + my $licensefilename = "license"; + # my $licensefilename = "LICENSE" . ".txt"; + my $licenseincludepatharrayref = get_language_specific_include_paths($includepatharrayref, $licenselanguage); + + my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0); + if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "put_license_into_setup"); } + my $licensefile = installer::files::read_file($$licenseref); + + # Read setup + my $setupfilename = $installdir . $installer::globals::separator . "setup"; + my $setupfile = installer::files::read_file($setupfilename); + + # Replacement + my $infoline = "Adding licensefile into setup script\n"; + push( @installer::globals::logfileinfo, $infoline); + + my $includestring = ""; + for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) { $includestring = $includestring . ${$licensefile}[$i]; } + for ( my $i = 0; $i <= $#{$setupfile}; $i++ ) { ${$setupfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; } + + # Write setup + installer::files::save_file($setupfilename, $setupfile); +} + +######################################################### +# Collecting all pkgmap files from an installation set +######################################################### + +sub collectpackagemaps +{ + my ( $installdir, $languagestringref, $allvariables ) = @_; + + installer::logger::include_header_into_logfile("Collecting all packagemaps (pkgmap):"); + + my $pkgmapdir = installer::systemactions::create_directories("pkgmap", $languagestringref); + my $subdirname = $allvariables->{'UNIXPRODUCTNAME'} . "_pkgmaps"; + my $pkgmapsubdir = $pkgmapdir . $installer::globals::separator . $subdirname; + if ( -d $pkgmapsubdir ) { installer::systemactions::remove_complete_directory($pkgmapsubdir); } + if ( ! -d $pkgmapsubdir ) { installer::systemactions::create_directory($pkgmapsubdir); } + + $installdir =~ s/\/\s*$//; + # Collecting all packages in $installdir and its sub package ("packages") + my $searchdir = $installdir . $installer::globals::separator . $installer::globals::epmoutpath; + + my $allpackages = installer::systemactions::get_all_directories_without_path($searchdir); + + for ( my $i = 0; $i <= $#{$allpackages}; $i++ ) + { + my $pkgmapfile = $searchdir . $installer::globals::separator . ${$allpackages}[$i] . $installer::globals::separator . "pkgmap"; + my $destfilename = $pkgmapsubdir . $installer::globals::separator . ${$allpackages}[$i] . "_pkgmap"; + installer::systemactions::copy_one_file($pkgmapfile, $destfilename); + } + + # Create a tar gz file with all package maps + my $tarfilename = $subdirname . ".tar"; + my $targzname = $tarfilename . ".gz"; + $systemcall = "cd $pkgmapdir; tar -cf - $subdirname | $installer::globals::packertool > $targzname"; + installer::systemactions::make_systemcall($systemcall); + installer::systemactions::remove_complete_directory($pkgmapsubdir, 1); +} + +1; |