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 = "OpenOffice.org"; 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