1*b1cdbd2cSJim Jagielski#************************************************************** 2*b1cdbd2cSJim Jagielski# 3*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski# distributed with this work for additional information 6*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski# 11*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski# 13*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski# under the License. 19*b1cdbd2cSJim Jagielski# 20*b1cdbd2cSJim Jagielski#************************************************************** 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielskipackage installer::systemactions; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse Cwd; 27*b1cdbd2cSJim Jagielskiuse File::Copy; 28*b1cdbd2cSJim Jagielskiuse installer::converter; 29*b1cdbd2cSJim Jagielskiuse installer::exiter; 30*b1cdbd2cSJim Jagielskiuse installer::globals; 31*b1cdbd2cSJim Jagielskiuse installer::pathanalyzer; 32*b1cdbd2cSJim Jagielskiuse installer::remover; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski###################################################### 35*b1cdbd2cSJim Jagielski# Creating a new direcotory 36*b1cdbd2cSJim Jagielski###################################################### 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielskisub create_directory 39*b1cdbd2cSJim Jagielski{ 40*b1cdbd2cSJim Jagielski my ($directory) = @_; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski my $returnvalue = 1; 43*b1cdbd2cSJim Jagielski my $infoline = ""; 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski if (!(-d $directory)) 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, 0775); 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski if ($returnvalue) 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 52*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Created directory: %s\n", $directory); 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1"; 55*b1cdbd2cSJim Jagielski system($localcall); 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski # chmod 0775 is not sufficient on mac to remove sticky tag 58*b1cdbd2cSJim Jagielski $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1"; 59*b1cdbd2cSJim Jagielski system($localcall); 60*b1cdbd2cSJim Jagielski } 61*b1cdbd2cSJim Jagielski else 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski # New solution in parallel packing: It is possible, that the directory now exists, although it 64*b1cdbd2cSJim Jagielski # was not created in this process. There is only an important error, if the directory does not 65*b1cdbd2cSJim Jagielski # exist now. 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 68*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 69*b1cdbd2cSJim Jagielski "Did not succeed in creating directory: \"%s\". Further attempts will follow.\n", 70*b1cdbd2cSJim Jagielski $directory); 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski if (!(-d $directory)) 73*b1cdbd2cSJim Jagielski { 74*b1cdbd2cSJim Jagielski # Problem with parallel packaging? -> Try a little harder, before exiting. 75*b1cdbd2cSJim Jagielski # Did someone else remove the parent directory in the meantime? 76*b1cdbd2cSJim Jagielski my $parentdir = $directory; 77*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 78*b1cdbd2cSJim Jagielski if (!(-d $parentdir)) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski $returnvalue = mkdir($parentdir, 0775); 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski if ($returnvalue) 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 85*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 86*b1cdbd2cSJim Jagielski "Attention: Successfully created parent directory (should already be created before): %s\n", 87*b1cdbd2cSJim Jagielski $parentdir); 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski my $localcall = "chmod 775 $parentdir \>\/dev\/null 2\>\&1"; 90*b1cdbd2cSJim Jagielski system($localcall); 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski else 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski $infoline = "Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n"; 95*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 96*b1cdbd2cSJim Jagielski if ( -d $parentdir ) 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 99*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 100*b1cdbd2cSJim Jagielski "Attention: Finally the parent directory \"%s\" exists, but I could not create it.\n", 101*b1cdbd2cSJim Jagielski $parentdir); 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski else 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski # Now it is time to exit, even the parent could not be created. 106*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory"); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski } 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski # At this point we have to assume, that the parent directory exist. 112*b1cdbd2cSJim Jagielski # Trying once more to create the desired directory 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, 0775); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski if ($returnvalue) 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 119*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 120*b1cdbd2cSJim Jagielski "Attention: Created directory \"\" in the second try.\n", 121*b1cdbd2cSJim Jagielski $directory);; 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; 124*b1cdbd2cSJim Jagielski system($localcall); 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski else 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski if ( -d $directory ) 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 131*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 132*b1cdbd2cSJim Jagielski "Attention: Finally the directory \"%s\" exists, but I could not create it.\n", 133*b1cdbd2cSJim Jagielski $directory); 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski else 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski # It is time to exit, even the second try failed. 138*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory"); 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski else 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 145*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 146*b1cdbd2cSJim Jagielski "Another process created this directory in exactly this moment :-) : %s\n", 147*b1cdbd2cSJim Jagielski $directory);; 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski else 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Already existing directory, did not create: %s\n", $directory); 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski} 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski###################################################### 158*b1cdbd2cSJim Jagielski# Creating a new direcotory with defined privileges 159*b1cdbd2cSJim Jagielski###################################################### 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielskisub create_directory_with_privileges 162*b1cdbd2cSJim Jagielski{ 163*b1cdbd2cSJim Jagielski my ($directory, $privileges) = @_; 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski my $returnvalue = 1; 166*b1cdbd2cSJim Jagielski my $infoline = ""; 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski if (!(-d $directory)) 169*b1cdbd2cSJim Jagielski { 170*b1cdbd2cSJim Jagielski my $localprivileges = oct("0".$privileges); # changes "777" to 0777 171*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, $localprivileges); 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski if ($returnvalue) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 176*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Created directory: %s\n", $directory); 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 179*b1cdbd2cSJim Jagielski system($localcall); 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski else 182*b1cdbd2cSJim Jagielski { 183*b1cdbd2cSJim Jagielski # New solution in parallel packing: It is possible, that the directory now exists, although it 184*b1cdbd2cSJim Jagielski # was not created in this process. There is only an important error, if the directory does not 185*b1cdbd2cSJim Jagielski # exist now. 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 188*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 189*b1cdbd2cSJim Jagielski "Did not succeed in creating directory: \"%s\". Further attempts will follow.\n", 190*b1cdbd2cSJim Jagielski $directory); 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski if (!(-d $directory)) 193*b1cdbd2cSJim Jagielski { 194*b1cdbd2cSJim Jagielski # Problem with parallel packaging? -> Try a little harder, before exiting. 195*b1cdbd2cSJim Jagielski # Did someone else remove the parent directory in the meantime? 196*b1cdbd2cSJim Jagielski my $parentdir = $directory; 197*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 198*b1cdbd2cSJim Jagielski if (!(-d $parentdir)) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, $localprivileges); 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski if ($returnvalue) 203*b1cdbd2cSJim Jagielski { 204*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 205*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 206*b1cdbd2cSJim Jagielski "Attention: Successfully created parent directory (should already be created before): %s\n", 207*b1cdbd2cSJim Jagielski $parentdir); 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski my $localcall = "chmod $privileges $parentdir \>\/dev\/null 2\>\&1"; 210*b1cdbd2cSJim Jagielski system($localcall); 211*b1cdbd2cSJim Jagielski } 212*b1cdbd2cSJim Jagielski else 213*b1cdbd2cSJim Jagielski { 214*b1cdbd2cSJim Jagielski $infoline = "Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n"; 215*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 216*b1cdbd2cSJim Jagielski if ( -d $parentdir ) 217*b1cdbd2cSJim Jagielski { 218*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 219*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 220*b1cdbd2cSJim Jagielski "Attention: Finally the parent directory \"%s\" exists, but I could not create it.\n", 221*b1cdbd2cSJim Jagielski $parentdir); 222*b1cdbd2cSJim Jagielski } 223*b1cdbd2cSJim Jagielski else 224*b1cdbd2cSJim Jagielski { 225*b1cdbd2cSJim Jagielski # Now it is time to exit, even the parent could not be created. 226*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges"); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski } 229*b1cdbd2cSJim Jagielski } 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski # At this point we have to assume, that the parent directory exist. 232*b1cdbd2cSJim Jagielski # Trying once more to create the desired directory 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, $localprivileges); 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski if ($returnvalue) 237*b1cdbd2cSJim Jagielski { 238*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 239*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Attention: Created directory \"%s\" in the second try.\n", 240*b1cdbd2cSJim Jagielski $directory); 241*b1cdbd2cSJim Jagielski 242*b1cdbd2cSJim Jagielski my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 243*b1cdbd2cSJim Jagielski system($localcall); 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski else 246*b1cdbd2cSJim Jagielski { 247*b1cdbd2cSJim Jagielski if ( -d $directory ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 250*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 251*b1cdbd2cSJim Jagielski "Attention: Finally the directory \"\" exists, but I could not create it.\n", 252*b1cdbd2cSJim Jagielski $directory); 253*b1cdbd2cSJim Jagielski } 254*b1cdbd2cSJim Jagielski else 255*b1cdbd2cSJim Jagielski { 256*b1cdbd2cSJim Jagielski # It is time to exit, even the second try failed. 257*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges"); 258*b1cdbd2cSJim Jagielski } 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski else 262*b1cdbd2cSJim Jagielski { 263*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 264*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 265*b1cdbd2cSJim Jagielski "Another process created this directory in exactly this moment :-) : %s\n", 266*b1cdbd2cSJim Jagielski $directory); 267*b1cdbd2cSJim Jagielski } 268*b1cdbd2cSJim Jagielski } 269*b1cdbd2cSJim Jagielski } 270*b1cdbd2cSJim Jagielski else 271*b1cdbd2cSJim Jagielski { 272*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 273*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Already existing directory, did not create: %s\n", $directory); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 276*b1cdbd2cSJim Jagielski system($localcall); 277*b1cdbd2cSJim Jagielski } 278*b1cdbd2cSJim Jagielski} 279*b1cdbd2cSJim Jagielski 280*b1cdbd2cSJim Jagielski 281*b1cdbd2cSJim Jagielski 282*b1cdbd2cSJim Jagielski 283*b1cdbd2cSJim Jagielski=item is_directory_empty ($path) 284*b1cdbd2cSJim Jagielski Return 285*b1cdbd2cSJim Jagielski 1 if there are no files in the directory pointed to by $path 286*b1cdbd2cSJim Jagielski 0 if there are files 287*b1cdbd2cSJim Jagielski -1 if there is an error accessing the directory. 288*b1cdbd2cSJim Jagielski=cut 289*b1cdbd2cSJim Jagielskisub is_directory_empty ($) 290*b1cdbd2cSJim Jagielski{ 291*b1cdbd2cSJim Jagielski my ($path) = @_; 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski opendir my $dir, $path or return -1; 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski my $result = 1; 296*b1cdbd2cSJim Jagielski while (my $entry = readdir($dir)) 297*b1cdbd2cSJim Jagielski { 298*b1cdbd2cSJim Jagielski if ($entry !~ /^\.+$/) 299*b1cdbd2cSJim Jagielski { 300*b1cdbd2cSJim Jagielski $result = 0; 301*b1cdbd2cSJim Jagielski last; 302*b1cdbd2cSJim Jagielski } 303*b1cdbd2cSJim Jagielski } 304*b1cdbd2cSJim Jagielski 305*b1cdbd2cSJim Jagielski return $result; 306*b1cdbd2cSJim Jagielski} 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski 309*b1cdbd2cSJim Jagielski 310*b1cdbd2cSJim Jagielski 311*b1cdbd2cSJim Jagielski###################################################### 312*b1cdbd2cSJim Jagielski# Removing a new direcotory 313*b1cdbd2cSJim Jagielski###################################################### 314*b1cdbd2cSJim Jagielski 315*b1cdbd2cSJim Jagielskisub remove_empty_directory 316*b1cdbd2cSJim Jagielski{ 317*b1cdbd2cSJim Jagielski my ($directory) = @_; 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski my $returnvalue = 1; 320*b1cdbd2cSJim Jagielski 321*b1cdbd2cSJim Jagielski if (-d $directory) 322*b1cdbd2cSJim Jagielski { 323*b1cdbd2cSJim Jagielski if ( ! is_directory_empty($directory)) 324*b1cdbd2cSJim Jagielski { 325*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("directory '%s' is not empty and can not be removed\n", $directory); 326*b1cdbd2cSJim Jagielski return; 327*b1cdbd2cSJim Jagielski } 328*b1cdbd2cSJim Jagielski else 329*b1cdbd2cSJim Jagielski { 330*b1cdbd2cSJim Jagielski my $systemcall = "rmdir $directory"; 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski $returnvalue = system($systemcall); 333*b1cdbd2cSJim Jagielski 334*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall); 335*b1cdbd2cSJim Jagielski 336*b1cdbd2cSJim Jagielski if ($returnvalue) 337*b1cdbd2cSJim Jagielski { 338*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("ERROR: Could not remove \"%s\"!\n", $directory); 339*b1cdbd2cSJim Jagielski } 340*b1cdbd2cSJim Jagielski else 341*b1cdbd2cSJim Jagielski { 342*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Success: Removed \"%s\"!\n", $directory); 343*b1cdbd2cSJim Jagielski } 344*b1cdbd2cSJim Jagielski } 345*b1cdbd2cSJim Jagielski } 346*b1cdbd2cSJim Jagielski} 347*b1cdbd2cSJim Jagielski 348*b1cdbd2cSJim Jagielski####################################################################### 349*b1cdbd2cSJim Jagielski# Calculating the number of languages in the string 350*b1cdbd2cSJim Jagielski####################################################################### 351*b1cdbd2cSJim Jagielski 352*b1cdbd2cSJim Jagielskisub get_number_of_langs 353*b1cdbd2cSJim Jagielski{ 354*b1cdbd2cSJim Jagielski my ($languagestring) = @_; 355*b1cdbd2cSJim Jagielski 356*b1cdbd2cSJim Jagielski my $number = 1; 357*b1cdbd2cSJim Jagielski 358*b1cdbd2cSJim Jagielski my $workstring = $languagestring; 359*b1cdbd2cSJim Jagielski 360*b1cdbd2cSJim Jagielski while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ ) 361*b1cdbd2cSJim Jagielski { 362*b1cdbd2cSJim Jagielski $workstring = $1; 363*b1cdbd2cSJim Jagielski $number++; 364*b1cdbd2cSJim Jagielski } 365*b1cdbd2cSJim Jagielski 366*b1cdbd2cSJim Jagielski return $number; 367*b1cdbd2cSJim Jagielski} 368*b1cdbd2cSJim Jagielski 369*b1cdbd2cSJim Jagielski####################################################################### 370*b1cdbd2cSJim Jagielski# Creating the directories, in which files are generated or unzipped 371*b1cdbd2cSJim Jagielski####################################################################### 372*b1cdbd2cSJim Jagielski 373*b1cdbd2cSJim Jagielskisub create_directories 374*b1cdbd2cSJim Jagielski{ 375*b1cdbd2cSJim Jagielski my ($newdirectory, $languagesref) =@_; 376*b1cdbd2cSJim Jagielski 377*b1cdbd2cSJim Jagielski $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 378*b1cdbd2cSJim Jagielski 379*b1cdbd2cSJim Jagielski my $path = ""; 380*b1cdbd2cSJim Jagielski 381*b1cdbd2cSJim Jagielski if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons 382*b1cdbd2cSJim Jagielski { 383*b1cdbd2cSJim Jagielski if ( $installer::globals::temppathdefined ) { $path = $installer::globals::temppath; } 384*b1cdbd2cSJim Jagielski else { $path = $installer::globals::unpackpath; } 385*b1cdbd2cSJim Jagielski $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 386*b1cdbd2cSJim Jagielski $path = $path . $installer::globals::separator; 387*b1cdbd2cSJim Jagielski } 388*b1cdbd2cSJim Jagielski elsif ( ( $newdirectory eq "jds" ) ) 389*b1cdbd2cSJim Jagielski { 390*b1cdbd2cSJim Jagielski if ( $installer::globals::jdstemppathdefined ) { $path = $installer::globals::jdstemppath; } 391*b1cdbd2cSJim Jagielski else { $path = $installer::globals::unpackpath; } 392*b1cdbd2cSJim Jagielski $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 393*b1cdbd2cSJim Jagielski $path = $path . $installer::globals::separator; 394*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($path); 395*b1cdbd2cSJim Jagielski } 396*b1cdbd2cSJim Jagielski else 397*b1cdbd2cSJim Jagielski { 398*b1cdbd2cSJim Jagielski $path = $installer::globals::unpackpath . $installer::globals::separator; 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski # special handling, if LOCALINSTALLDIR is set 401*b1cdbd2cSJim Jagielski if (( $installer::globals::localinstalldirset ) && ( $newdirectory eq "install" )) 402*b1cdbd2cSJim Jagielski { 403*b1cdbd2cSJim Jagielski $installer::globals::localinstalldir =~ s/\Q$installer::globals::separator\E\s*$//; 404*b1cdbd2cSJim Jagielski $path = $installer::globals::localinstalldir . $installer::globals::separator; 405*b1cdbd2cSJim Jagielski } 406*b1cdbd2cSJim Jagielski } 407*b1cdbd2cSJim Jagielski 408*b1cdbd2cSJim Jagielski $infoline = "create_directories: Using $path for $newdirectory !\n"; 409*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 410*b1cdbd2cSJim Jagielski 411*b1cdbd2cSJim Jagielski if ($newdirectory eq "unzip" ) # special handling for common directory 412*b1cdbd2cSJim Jagielski { 413*b1cdbd2cSJim Jagielski $path = $path . ".." . $installer::globals::separator . "common" . $installer::globals::productextension . $installer::globals::separator; 414*b1cdbd2cSJim Jagielski create_directory($path); 415*b1cdbd2cSJim Jagielski 416*b1cdbd2cSJim Jagielski $path = $path . $newdirectory . $installer::globals::separator; 417*b1cdbd2cSJim Jagielski create_directory($path); 418*b1cdbd2cSJim Jagielski } 419*b1cdbd2cSJim Jagielski else 420*b1cdbd2cSJim Jagielski { 421*b1cdbd2cSJim Jagielski my $localproductname = $installer::globals::product; 422*b1cdbd2cSJim Jagielski my $localproductsubdir = ""; 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski if ( $installer::globals::product =~ /^\s*(.+?)\_\_(.+?)\s*$/ ) 425*b1cdbd2cSJim Jagielski { 426*b1cdbd2cSJim Jagielski $localproductname = $1; 427*b1cdbd2cSJim Jagielski $localproductsubdir = $2; 428*b1cdbd2cSJim Jagielski } 429*b1cdbd2cSJim Jagielski 430*b1cdbd2cSJim Jagielski if ( $installer::globals::languagepack ) { $path = $path . $localproductname . "_languagepack" . $installer::globals::separator; } 431*b1cdbd2cSJim Jagielski elsif ( $installer::globals::patch ) { $path = $path . $localproductname . "_patch" . $installer::globals::separator; } 432*b1cdbd2cSJim Jagielski else { $path = $path . $localproductname . $installer::globals::separator; } 433*b1cdbd2cSJim Jagielski 434*b1cdbd2cSJim Jagielski create_directory($path); 435*b1cdbd2cSJim Jagielski 436*b1cdbd2cSJim Jagielski if ( $localproductsubdir ) 437*b1cdbd2cSJim Jagielski { 438*b1cdbd2cSJim Jagielski $path = $path . $localproductsubdir . $installer::globals::separator; 439*b1cdbd2cSJim Jagielski create_directory($path); 440*b1cdbd2cSJim Jagielski } 441*b1cdbd2cSJim Jagielski 442*b1cdbd2cSJim Jagielski $path = $path . $installer::globals::installertypedir . $installer::globals::separator; 443*b1cdbd2cSJim Jagielski create_directory($path); 444*b1cdbd2cSJim Jagielski 445*b1cdbd2cSJim Jagielski $path = $path . $newdirectory . $installer::globals::separator; 446*b1cdbd2cSJim Jagielski create_directory($path); 447*b1cdbd2cSJim Jagielski 448*b1cdbd2cSJim Jagielski my $locallanguagesref = ""; 449*b1cdbd2cSJim Jagielski 450*b1cdbd2cSJim Jagielski if ( $$languagesref ) { $locallanguagesref = $$languagesref; } 451*b1cdbd2cSJim Jagielski 452*b1cdbd2cSJim Jagielski if (!($locallanguagesref eq "" )) # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files 453*b1cdbd2cSJim Jagielski { 454*b1cdbd2cSJim Jagielski my $languagestring = installer::languages::get_language_directory_name($$languagesref); 455*b1cdbd2cSJim Jagielski 456*b1cdbd2cSJim Jagielski $path = $path . $languagestring . $installer::globals::separator; 457*b1cdbd2cSJim Jagielski create_directory($path); 458*b1cdbd2cSJim Jagielski } 459*b1cdbd2cSJim Jagielski } 460*b1cdbd2cSJim Jagielski 461*b1cdbd2cSJim Jagielski installer::remover::remove_ending_pathseparator(\$path); 462*b1cdbd2cSJim Jagielski 463*b1cdbd2cSJim Jagielski $path = installer::converter::make_path_conform($path); 464*b1cdbd2cSJim Jagielski 465*b1cdbd2cSJim Jagielski return $path; 466*b1cdbd2cSJim Jagielski} 467*b1cdbd2cSJim Jagielski 468*b1cdbd2cSJim Jagielski######################## 469*b1cdbd2cSJim Jagielski# Copying one file 470*b1cdbd2cSJim Jagielski######################## 471*b1cdbd2cSJim Jagielski 472*b1cdbd2cSJim Jagielskisub copy_one_file 473*b1cdbd2cSJim Jagielski{ 474*b1cdbd2cSJim Jagielski my ($source, $dest) = @_; 475*b1cdbd2cSJim Jagielski 476*b1cdbd2cSJim Jagielski my ($returnvalue, $infoline); 477*b1cdbd2cSJim Jagielski 478*b1cdbd2cSJim Jagielski 479*b1cdbd2cSJim Jagielski # copy returns 0 if files are identical :-( 480*b1cdbd2cSJim Jagielski if ( $installer::globals::isos2 ) { 481*b1cdbd2cSJim Jagielski unlink($dest); 482*b1cdbd2cSJim Jagielski } 483*b1cdbd2cSJim Jagielski 484*b1cdbd2cSJim Jagielski my $copyreturn = copy($source, $dest); 485*b1cdbd2cSJim Jagielski 486*b1cdbd2cSJim Jagielski if ($copyreturn) 487*b1cdbd2cSJim Jagielski { 488*b1cdbd2cSJim Jagielski $infoline = "Copy: $source to $dest\n"; 489*b1cdbd2cSJim Jagielski $returnvalue = 1; 490*b1cdbd2cSJim Jagielski } 491*b1cdbd2cSJim Jagielski else 492*b1cdbd2cSJim Jagielski { 493*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not copy #$source# to $dest\n"; 494*b1cdbd2cSJim Jagielski $returnvalue = 0; 495*b1cdbd2cSJim Jagielski } 496*b1cdbd2cSJim Jagielski 497*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 498*b1cdbd2cSJim Jagielski 499*b1cdbd2cSJim Jagielski if ( !$returnvalue ) { 500*b1cdbd2cSJim Jagielski return $returnvalue; 501*b1cdbd2cSJim Jagielski } 502*b1cdbd2cSJim Jagielski 503*b1cdbd2cSJim Jagielski # taking care of file attributes 504*b1cdbd2cSJim Jagielski if ($installer::globals::iswin && -f $dest) { 505*b1cdbd2cSJim Jagielski my $mode = -x $source ? 0775 : 0664; 506*b1cdbd2cSJim Jagielski my $mode_str = sprintf("%o", $mode); 507*b1cdbd2cSJim Jagielski my $chmodreturn = chmod($mode, $dest); 508*b1cdbd2cSJim Jagielski if ($chmodreturn) 509*b1cdbd2cSJim Jagielski { 510*b1cdbd2cSJim Jagielski $infoline = "chmod $mode_str, $dest\n"; 511*b1cdbd2cSJim Jagielski $returnvalue = 1; 512*b1cdbd2cSJim Jagielski } 513*b1cdbd2cSJim Jagielski else 514*b1cdbd2cSJim Jagielski { 515*b1cdbd2cSJim Jagielski $infoline = "WARNING: Could not chmod $dest: $!\n"; 516*b1cdbd2cSJim Jagielski $returnvalue = 0; 517*b1cdbd2cSJim Jagielski } 518*b1cdbd2cSJim Jagielski 519*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 520*b1cdbd2cSJim Jagielski } 521*b1cdbd2cSJim Jagielski 522*b1cdbd2cSJim Jagielski return $returnvalue; 523*b1cdbd2cSJim Jagielski} 524*b1cdbd2cSJim Jagielski 525*b1cdbd2cSJim Jagielski########################## 526*b1cdbd2cSJim Jagielski# Hard linking one file 527*b1cdbd2cSJim Jagielski########################## 528*b1cdbd2cSJim Jagielski 529*b1cdbd2cSJim Jagielskisub hardlink_one_file 530*b1cdbd2cSJim Jagielski{ 531*b1cdbd2cSJim Jagielski my ($source, $dest) = @_; 532*b1cdbd2cSJim Jagielski 533*b1cdbd2cSJim Jagielski my ($returnvalue, $infoline); 534*b1cdbd2cSJim Jagielski 535*b1cdbd2cSJim Jagielski my $copyreturn = link($source, $dest); 536*b1cdbd2cSJim Jagielski 537*b1cdbd2cSJim Jagielski if ($copyreturn) 538*b1cdbd2cSJim Jagielski { 539*b1cdbd2cSJim Jagielski $infoline = "Link: $source to $dest\n"; 540*b1cdbd2cSJim Jagielski $returnvalue = 1; 541*b1cdbd2cSJim Jagielski } 542*b1cdbd2cSJim Jagielski else 543*b1cdbd2cSJim Jagielski { 544*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not link $source to $dest\n"; 545*b1cdbd2cSJim Jagielski $returnvalue = 0; 546*b1cdbd2cSJim Jagielski } 547*b1cdbd2cSJim Jagielski 548*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 549*b1cdbd2cSJim Jagielski 550*b1cdbd2cSJim Jagielski return $returnvalue; 551*b1cdbd2cSJim Jagielski} 552*b1cdbd2cSJim Jagielski 553*b1cdbd2cSJim Jagielski########################## 554*b1cdbd2cSJim Jagielski# Soft linking one file 555*b1cdbd2cSJim Jagielski########################## 556*b1cdbd2cSJim Jagielski 557*b1cdbd2cSJim Jagielskisub softlink_one_file 558*b1cdbd2cSJim Jagielski{ 559*b1cdbd2cSJim Jagielski my ($source, $dest) = @_; 560*b1cdbd2cSJim Jagielski 561*b1cdbd2cSJim Jagielski my ($returnvalue, $infoline); 562*b1cdbd2cSJim Jagielski 563*b1cdbd2cSJim Jagielski my $linkreturn = symlink($source, $dest); 564*b1cdbd2cSJim Jagielski 565*b1cdbd2cSJim Jagielski if ($linkreturn) 566*b1cdbd2cSJim Jagielski { 567*b1cdbd2cSJim Jagielski $infoline = "Symlink: $source to $dest\n"; 568*b1cdbd2cSJim Jagielski $returnvalue = 1; 569*b1cdbd2cSJim Jagielski } 570*b1cdbd2cSJim Jagielski else 571*b1cdbd2cSJim Jagielski { 572*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not symlink $source to $dest\n"; 573*b1cdbd2cSJim Jagielski $returnvalue = 0; 574*b1cdbd2cSJim Jagielski } 575*b1cdbd2cSJim Jagielski 576*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 577*b1cdbd2cSJim Jagielski 578*b1cdbd2cSJim Jagielski return $returnvalue; 579*b1cdbd2cSJim Jagielski} 580*b1cdbd2cSJim Jagielski 581*b1cdbd2cSJim Jagielski######################## 582*b1cdbd2cSJim Jagielski# Renaming one file 583*b1cdbd2cSJim Jagielski######################## 584*b1cdbd2cSJim Jagielski 585*b1cdbd2cSJim Jagielskisub rename_one_file 586*b1cdbd2cSJim Jagielski{ 587*b1cdbd2cSJim Jagielski my ($source, $dest) = @_; 588*b1cdbd2cSJim Jagielski 589*b1cdbd2cSJim Jagielski my ($returnvalue, $infoline); 590*b1cdbd2cSJim Jagielski 591*b1cdbd2cSJim Jagielski my $renamereturn = rename($source, $dest); 592*b1cdbd2cSJim Jagielski 593*b1cdbd2cSJim Jagielski if ($renamereturn) 594*b1cdbd2cSJim Jagielski { 595*b1cdbd2cSJim Jagielski $infoline = "Rename: $source to $dest\n"; 596*b1cdbd2cSJim Jagielski $returnvalue = 1; 597*b1cdbd2cSJim Jagielski } 598*b1cdbd2cSJim Jagielski else 599*b1cdbd2cSJim Jagielski { 600*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not rename $source to $dest\n"; 601*b1cdbd2cSJim Jagielski $returnvalue = 0; 602*b1cdbd2cSJim Jagielski } 603*b1cdbd2cSJim Jagielski 604*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 605*b1cdbd2cSJim Jagielski 606*b1cdbd2cSJim Jagielski return $returnvalue; 607*b1cdbd2cSJim Jagielski} 608*b1cdbd2cSJim Jagielski 609*b1cdbd2cSJim Jagielski########################################## 610*b1cdbd2cSJim Jagielski# Copying all files from one directory 611*b1cdbd2cSJim Jagielski# to another directory 612*b1cdbd2cSJim Jagielski########################################## 613*b1cdbd2cSJim Jagielski 614*b1cdbd2cSJim Jagielskisub copy_directory 615*b1cdbd2cSJim Jagielski{ 616*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir) = @_; 617*b1cdbd2cSJim Jagielski 618*b1cdbd2cSJim Jagielski my @sourcefiles = (); 619*b1cdbd2cSJim Jagielski 620*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 621*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 622*b1cdbd2cSJim Jagielski 623*b1cdbd2cSJim Jagielski my $infoline = "\n"; 624*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 625*b1cdbd2cSJim Jagielski $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; 626*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 627*b1cdbd2cSJim Jagielski 628*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 629*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 630*b1cdbd2cSJim Jagielski closedir(DIR); 631*b1cdbd2cSJim Jagielski 632*b1cdbd2cSJim Jagielski my $onefile; 633*b1cdbd2cSJim Jagielski 634*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 635*b1cdbd2cSJim Jagielski { 636*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 637*b1cdbd2cSJim Jagielski { 638*b1cdbd2cSJim Jagielski my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 639*b1cdbd2cSJim Jagielski my $destfile = $destdir . $installer::globals::separator . $onefile; 640*b1cdbd2cSJim Jagielski if ( -f $sourcefile ) # only files, no directories 641*b1cdbd2cSJim Jagielski { 642*b1cdbd2cSJim Jagielski copy_one_file($sourcefile, $destfile); 643*b1cdbd2cSJim Jagielski } 644*b1cdbd2cSJim Jagielski } 645*b1cdbd2cSJim Jagielski } 646*b1cdbd2cSJim Jagielski} 647*b1cdbd2cSJim Jagielski 648*b1cdbd2cSJim Jagielski########################################## 649*b1cdbd2cSJim Jagielski# Copying all files from one directory 650*b1cdbd2cSJim Jagielski# to another directory 651*b1cdbd2cSJim Jagielski########################################## 652*b1cdbd2cSJim Jagielski 653*b1cdbd2cSJim Jagielskisub is_empty_dir 654*b1cdbd2cSJim Jagielski{ 655*b1cdbd2cSJim Jagielski my ($dir) = @_; 656*b1cdbd2cSJim Jagielski 657*b1cdbd2cSJim Jagielski my $directory_is_empty = 1; 658*b1cdbd2cSJim Jagielski my @sourcefiles = (); 659*b1cdbd2cSJim Jagielski 660*b1cdbd2cSJim Jagielski opendir(DIR, $dir); 661*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 662*b1cdbd2cSJim Jagielski closedir(DIR); 663*b1cdbd2cSJim Jagielski 664*b1cdbd2cSJim Jagielski my $onefile; 665*b1cdbd2cSJim Jagielski my @realcontent = (); 666*b1cdbd2cSJim Jagielski 667*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 668*b1cdbd2cSJim Jagielski { 669*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 670*b1cdbd2cSJim Jagielski { 671*b1cdbd2cSJim Jagielski push(@realcontent, $onefile); 672*b1cdbd2cSJim Jagielski } 673*b1cdbd2cSJim Jagielski } 674*b1cdbd2cSJim Jagielski 675*b1cdbd2cSJim Jagielski if ( $#realcontent > -1 ) { $directory_is_empty = 0; } 676*b1cdbd2cSJim Jagielski 677*b1cdbd2cSJim Jagielski return $directory_is_empty; 678*b1cdbd2cSJim Jagielski} 679*b1cdbd2cSJim Jagielski 680*b1cdbd2cSJim Jagielski##################################################################### 681*b1cdbd2cSJim Jagielski# Creating hard links to a complete directory with sub directories. 682*b1cdbd2cSJim Jagielski##################################################################### 683*b1cdbd2cSJim Jagielski 684*b1cdbd2cSJim Jagielskisub hardlink_complete_directory 685*b1cdbd2cSJim Jagielski{ 686*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir) = @_; 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielski my @sourcefiles = (); 689*b1cdbd2cSJim Jagielski 690*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 691*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 692*b1cdbd2cSJim Jagielski 693*b1cdbd2cSJim Jagielski if ( ! -d $destdir ) { create_directory($destdir); } 694*b1cdbd2cSJim Jagielski 695*b1cdbd2cSJim Jagielski my $infoline = "\n"; 696*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 697*b1cdbd2cSJim Jagielski $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n"; 698*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 699*b1cdbd2cSJim Jagielski 700*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 701*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 702*b1cdbd2cSJim Jagielski closedir(DIR); 703*b1cdbd2cSJim Jagielski 704*b1cdbd2cSJim Jagielski my $onefile; 705*b1cdbd2cSJim Jagielski 706*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 707*b1cdbd2cSJim Jagielski { 708*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 709*b1cdbd2cSJim Jagielski { 710*b1cdbd2cSJim Jagielski my $source = $sourcedir . $installer::globals::separator . $onefile; 711*b1cdbd2cSJim Jagielski my $dest = $destdir . $installer::globals::separator . $onefile; 712*b1cdbd2cSJim Jagielski if ( -f $source ) # only files, no directories 713*b1cdbd2cSJim Jagielski { 714*b1cdbd2cSJim Jagielski hardlink_one_file($source, $dest); 715*b1cdbd2cSJim Jagielski } 716*b1cdbd2cSJim Jagielski if ( -d $source ) # recursive 717*b1cdbd2cSJim Jagielski { 718*b1cdbd2cSJim Jagielski hardlink_complete_directory($source, $dest); 719*b1cdbd2cSJim Jagielski } 720*b1cdbd2cSJim Jagielski } 721*b1cdbd2cSJim Jagielski } 722*b1cdbd2cSJim Jagielski} 723*b1cdbd2cSJim Jagielski 724*b1cdbd2cSJim Jagielski##################################################################### 725*b1cdbd2cSJim Jagielski# Creating hard links to a complete directory with sub directories. 726*b1cdbd2cSJim Jagielski##################################################################### 727*b1cdbd2cSJim Jagielski 728*b1cdbd2cSJim Jagielskisub softlink_complete_directory 729*b1cdbd2cSJim Jagielski{ 730*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir, $depth) = @_; 731*b1cdbd2cSJim Jagielski 732*b1cdbd2cSJim Jagielski my @sourcefiles = (); 733*b1cdbd2cSJim Jagielski 734*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 735*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 736*b1cdbd2cSJim Jagielski 737*b1cdbd2cSJim Jagielski if ( ! -d $destdir ) { create_directory($destdir); } 738*b1cdbd2cSJim Jagielski 739*b1cdbd2cSJim Jagielski my $infoline = "\n"; 740*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 741*b1cdbd2cSJim Jagielski $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n"; 742*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 743*b1cdbd2cSJim Jagielski 744*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 745*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 746*b1cdbd2cSJim Jagielski closedir(DIR); 747*b1cdbd2cSJim Jagielski 748*b1cdbd2cSJim Jagielski my $onefile; 749*b1cdbd2cSJim Jagielski 750*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 751*b1cdbd2cSJim Jagielski { 752*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 753*b1cdbd2cSJim Jagielski { 754*b1cdbd2cSJim Jagielski my $source = $sourcedir . $installer::globals::separator . $onefile; 755*b1cdbd2cSJim Jagielski my $dest = $destdir . $installer::globals::separator . $onefile; 756*b1cdbd2cSJim Jagielski if ( -f $source ) # only files, no directories 757*b1cdbd2cSJim Jagielski { 758*b1cdbd2cSJim Jagielski my $localsource = $source; 759*b1cdbd2cSJim Jagielski if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } } 760*b1cdbd2cSJim Jagielski softlink_one_file($localsource, $dest); 761*b1cdbd2cSJim Jagielski } 762*b1cdbd2cSJim Jagielski if ( -d $source ) # recursive 763*b1cdbd2cSJim Jagielski { 764*b1cdbd2cSJim Jagielski my $newdepth = $depth + 1; 765*b1cdbd2cSJim Jagielski softlink_complete_directory($source, $dest, $newdepth); 766*b1cdbd2cSJim Jagielski } 767*b1cdbd2cSJim Jagielski } 768*b1cdbd2cSJim Jagielski } 769*b1cdbd2cSJim Jagielski} 770*b1cdbd2cSJim Jagielski 771*b1cdbd2cSJim Jagielski##################################################### 772*b1cdbd2cSJim Jagielski# Copying a complete directory with sub directories. 773*b1cdbd2cSJim Jagielski##################################################### 774*b1cdbd2cSJim Jagielski 775*b1cdbd2cSJim Jagielskisub copy_complete_directory 776*b1cdbd2cSJim Jagielski{ 777*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir) = @_; 778*b1cdbd2cSJim Jagielski 779*b1cdbd2cSJim Jagielski my @sourcefiles = (); 780*b1cdbd2cSJim Jagielski 781*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 782*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 783*b1cdbd2cSJim Jagielski 784*b1cdbd2cSJim Jagielski if ( ! -d $destdir ) { create_directory($destdir); } 785*b1cdbd2cSJim Jagielski 786*b1cdbd2cSJim Jagielski my $infoline = "\n"; 787*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 788*b1cdbd2cSJim Jagielski $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; 789*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 790*b1cdbd2cSJim Jagielski 791*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 792*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 793*b1cdbd2cSJim Jagielski closedir(DIR); 794*b1cdbd2cSJim Jagielski 795*b1cdbd2cSJim Jagielski my $onefile; 796*b1cdbd2cSJim Jagielski 797*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 798*b1cdbd2cSJim Jagielski { 799*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 800*b1cdbd2cSJim Jagielski { 801*b1cdbd2cSJim Jagielski my $source = $sourcedir . $installer::globals::separator . $onefile; 802*b1cdbd2cSJim Jagielski my $dest = $destdir . $installer::globals::separator . $onefile; 803*b1cdbd2cSJim Jagielski if ( -f $source ) # only files, no directories 804*b1cdbd2cSJim Jagielski { 805*b1cdbd2cSJim Jagielski copy_one_file($source, $dest); 806*b1cdbd2cSJim Jagielski } 807*b1cdbd2cSJim Jagielski if ( -d $source ) # recursive 808*b1cdbd2cSJim Jagielski { 809*b1cdbd2cSJim Jagielski if ((!( $source =~ /packages\/SUNW/ )) && (!( $source =~ /packages\/OOO/ ))) # do not copy complete Solaris packages! 810*b1cdbd2cSJim Jagielski { 811*b1cdbd2cSJim Jagielski copy_complete_directory($source, $dest); 812*b1cdbd2cSJim Jagielski } 813*b1cdbd2cSJim Jagielski } 814*b1cdbd2cSJim Jagielski } 815*b1cdbd2cSJim Jagielski } 816*b1cdbd2cSJim Jagielski} 817*b1cdbd2cSJim Jagielski 818*b1cdbd2cSJim Jagielski##################################################################################### 819*b1cdbd2cSJim Jagielski# Copying a complete directory with sub directories, but not the CVS directories. 820*b1cdbd2cSJim Jagielski##################################################################################### 821*b1cdbd2cSJim Jagielski 822*b1cdbd2cSJim Jagielskisub copy_complete_directory_without_cvs 823*b1cdbd2cSJim Jagielski{ 824*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir) = @_; 825*b1cdbd2cSJim Jagielski 826*b1cdbd2cSJim Jagielski my @sourcefiles = (); 827*b1cdbd2cSJim Jagielski 828*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 829*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 830*b1cdbd2cSJim Jagielski 831*b1cdbd2cSJim Jagielski if ( ! -d $destdir ) { create_directory($destdir); } 832*b1cdbd2cSJim Jagielski 833*b1cdbd2cSJim Jagielski my $infoline = "\n"; 834*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 835*b1cdbd2cSJim Jagielski $infoline = "Copying files from directory $sourcedir to directory $destdir (without CVS)\n"; 836*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 837*b1cdbd2cSJim Jagielski 838*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 839*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 840*b1cdbd2cSJim Jagielski closedir(DIR); 841*b1cdbd2cSJim Jagielski 842*b1cdbd2cSJim Jagielski my $onefile; 843*b1cdbd2cSJim Jagielski 844*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 845*b1cdbd2cSJim Jagielski { 846*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq "..")) && (!($onefile eq "CVS"))) 847*b1cdbd2cSJim Jagielski { 848*b1cdbd2cSJim Jagielski my $source = $sourcedir . $installer::globals::separator . $onefile; 849*b1cdbd2cSJim Jagielski my $dest = $destdir . $installer::globals::separator . $onefile; 850*b1cdbd2cSJim Jagielski if ( -f $source ) # only files, no directories 851*b1cdbd2cSJim Jagielski { 852*b1cdbd2cSJim Jagielski copy_one_file($source, $dest); 853*b1cdbd2cSJim Jagielski } 854*b1cdbd2cSJim Jagielski if ( -d $source ) # recursive 855*b1cdbd2cSJim Jagielski { 856*b1cdbd2cSJim Jagielski copy_complete_directory_without_cvs($source, $dest); 857*b1cdbd2cSJim Jagielski } 858*b1cdbd2cSJim Jagielski } 859*b1cdbd2cSJim Jagielski } 860*b1cdbd2cSJim Jagielski} 861*b1cdbd2cSJim Jagielski 862*b1cdbd2cSJim Jagielski##################################################### 863*b1cdbd2cSJim Jagielski# Copying all files with a specified file extension 864*b1cdbd2cSJim Jagielski# from one directory to another directory. 865*b1cdbd2cSJim Jagielski##################################################### 866*b1cdbd2cSJim Jagielski 867*b1cdbd2cSJim Jagielskisub copy_directory_with_fileextension 868*b1cdbd2cSJim Jagielski{ 869*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir, $extension) = @_; 870*b1cdbd2cSJim Jagielski 871*b1cdbd2cSJim Jagielski my @sourcefiles = (); 872*b1cdbd2cSJim Jagielski 873*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 874*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 875*b1cdbd2cSJim Jagielski 876*b1cdbd2cSJim Jagielski $infoline = "\n"; 877*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 878*b1cdbd2cSJim Jagielski $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n"; 879*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 880*b1cdbd2cSJim Jagielski 881*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 882*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 883*b1cdbd2cSJim Jagielski closedir(DIR); 884*b1cdbd2cSJim Jagielski 885*b1cdbd2cSJim Jagielski my $onefile; 886*b1cdbd2cSJim Jagielski 887*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 888*b1cdbd2cSJim Jagielski { 889*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 890*b1cdbd2cSJim Jagielski { 891*b1cdbd2cSJim Jagielski if ( $onefile =~ /\.$extension\s*$/ ) # only copying specified files 892*b1cdbd2cSJim Jagielski { 893*b1cdbd2cSJim Jagielski my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 894*b1cdbd2cSJim Jagielski my $destfile = $destdir . $installer::globals::separator . $onefile; 895*b1cdbd2cSJim Jagielski if ( -f $sourcefile ) # only files, no directories 896*b1cdbd2cSJim Jagielski { 897*b1cdbd2cSJim Jagielski copy_one_file($sourcefile, $destfile); 898*b1cdbd2cSJim Jagielski } 899*b1cdbd2cSJim Jagielski } 900*b1cdbd2cSJim Jagielski } 901*b1cdbd2cSJim Jagielski } 902*b1cdbd2cSJim Jagielski} 903*b1cdbd2cSJim Jagielski 904*b1cdbd2cSJim Jagielski######################################################### 905*b1cdbd2cSJim Jagielski# Copying all files without a specified file extension 906*b1cdbd2cSJim Jagielski# from one directory to another directory. 907*b1cdbd2cSJim Jagielski######################################################### 908*b1cdbd2cSJim Jagielski 909*b1cdbd2cSJim Jagielskisub copy_directory_except_fileextension 910*b1cdbd2cSJim Jagielski{ 911*b1cdbd2cSJim Jagielski my ($sourcedir, $destdir, $extension) = @_; 912*b1cdbd2cSJim Jagielski 913*b1cdbd2cSJim Jagielski my @sourcefiles = (); 914*b1cdbd2cSJim Jagielski 915*b1cdbd2cSJim Jagielski $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 916*b1cdbd2cSJim Jagielski $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 917*b1cdbd2cSJim Jagielski 918*b1cdbd2cSJim Jagielski $infoline = "\n"; 919*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 920*b1cdbd2cSJim Jagielski $infoline = "Copying files without extension $extension from directory $sourcedir to directory $destdir\n"; 921*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 922*b1cdbd2cSJim Jagielski 923*b1cdbd2cSJim Jagielski opendir(DIR, $sourcedir); 924*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 925*b1cdbd2cSJim Jagielski closedir(DIR); 926*b1cdbd2cSJim Jagielski 927*b1cdbd2cSJim Jagielski my $onefile; 928*b1cdbd2cSJim Jagielski 929*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 930*b1cdbd2cSJim Jagielski { 931*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 932*b1cdbd2cSJim Jagielski { 933*b1cdbd2cSJim Jagielski if ( ! ( $onefile =~ /\.$extension\s*$/ )) # only copying not having the specified extension 934*b1cdbd2cSJim Jagielski { 935*b1cdbd2cSJim Jagielski my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 936*b1cdbd2cSJim Jagielski my $destfile = $destdir . $installer::globals::separator . $onefile; 937*b1cdbd2cSJim Jagielski if ( -f $sourcefile ) # only files, no directories 938*b1cdbd2cSJim Jagielski { 939*b1cdbd2cSJim Jagielski copy_one_file($sourcefile, $destfile); 940*b1cdbd2cSJim Jagielski } 941*b1cdbd2cSJim Jagielski } 942*b1cdbd2cSJim Jagielski } 943*b1cdbd2cSJim Jagielski } 944*b1cdbd2cSJim Jagielski} 945*b1cdbd2cSJim Jagielski 946*b1cdbd2cSJim Jagielski######################################################## 947*b1cdbd2cSJim Jagielski# Renaming all files with a specified file extension 948*b1cdbd2cSJim Jagielski# in a specified directory. 949*b1cdbd2cSJim Jagielski# Example: "Feature.idt.01" -> "Feature.idt" 950*b1cdbd2cSJim Jagielski######################################################## 951*b1cdbd2cSJim Jagielski 952*b1cdbd2cSJim Jagielskisub rename_files_with_fileextension 953*b1cdbd2cSJim Jagielski{ 954*b1cdbd2cSJim Jagielski my ($dir, $extension) = @_; 955*b1cdbd2cSJim Jagielski 956*b1cdbd2cSJim Jagielski my @sourcefiles = (); 957*b1cdbd2cSJim Jagielski 958*b1cdbd2cSJim Jagielski $dir =~ s/\Q$installer::globals::separator\E\s*$//; 959*b1cdbd2cSJim Jagielski 960*b1cdbd2cSJim Jagielski my $infoline = "\n"; 961*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 962*b1cdbd2cSJim Jagielski $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n"; 963*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 964*b1cdbd2cSJim Jagielski 965*b1cdbd2cSJim Jagielski opendir(DIR, $dir); 966*b1cdbd2cSJim Jagielski @sourcefiles = readdir(DIR); 967*b1cdbd2cSJim Jagielski closedir(DIR); 968*b1cdbd2cSJim Jagielski 969*b1cdbd2cSJim Jagielski my $onefile; 970*b1cdbd2cSJim Jagielski 971*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 972*b1cdbd2cSJim Jagielski { 973*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 974*b1cdbd2cSJim Jagielski { 975*b1cdbd2cSJim Jagielski if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) # only renaming specified files 976*b1cdbd2cSJim Jagielski { 977*b1cdbd2cSJim Jagielski my $destfile = $1; 978*b1cdbd2cSJim Jagielski my $sourcefile = $dir . $installer::globals::separator . $onefile; 979*b1cdbd2cSJim Jagielski $destfile = $dir . $installer::globals::separator . $destfile; 980*b1cdbd2cSJim Jagielski if ( -f $sourcefile ) # only files, no directories 981*b1cdbd2cSJim Jagielski { 982*b1cdbd2cSJim Jagielski rename_one_file($sourcefile, $destfile); 983*b1cdbd2cSJim Jagielski } 984*b1cdbd2cSJim Jagielski } 985*b1cdbd2cSJim Jagielski } 986*b1cdbd2cSJim Jagielski } 987*b1cdbd2cSJim Jagielski} 988*b1cdbd2cSJim Jagielski 989*b1cdbd2cSJim Jagielski######################################################## 990*b1cdbd2cSJim Jagielski# Finding all files with a specified file extension 991*b1cdbd2cSJim Jagielski# in a specified directory. 992*b1cdbd2cSJim Jagielski######################################################## 993*b1cdbd2cSJim Jagielski 994*b1cdbd2cSJim Jagielskisub find_file_with_file_extension 995*b1cdbd2cSJim Jagielski{ 996*b1cdbd2cSJim Jagielski my ($extension, $dir) = @_; 997*b1cdbd2cSJim Jagielski 998*b1cdbd2cSJim Jagielski my @allfiles = (); 999*b1cdbd2cSJim Jagielski 1000*b1cdbd2cSJim Jagielski $dir =~ s/\Q$installer::globals::separator\E\s*$//; 1001*b1cdbd2cSJim Jagielski 1002*b1cdbd2cSJim Jagielski my $infoline = "\n"; 1003*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1004*b1cdbd2cSJim Jagielski $infoline = "Searching files with extension \"$extension\" in the directory $dir\n"; 1005*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1006*b1cdbd2cSJim Jagielski 1007*b1cdbd2cSJim Jagielski opendir(DIR, $dir); 1008*b1cdbd2cSJim Jagielski @sourcefiles = sort readdir(DIR); 1009*b1cdbd2cSJim Jagielski closedir(DIR); 1010*b1cdbd2cSJim Jagielski 1011*b1cdbd2cSJim Jagielski my $onefile; 1012*b1cdbd2cSJim Jagielski 1013*b1cdbd2cSJim Jagielski foreach $onefile (@sourcefiles) 1014*b1cdbd2cSJim Jagielski { 1015*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 1016*b1cdbd2cSJim Jagielski { 1017*b1cdbd2cSJim Jagielski if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) 1018*b1cdbd2cSJim Jagielski { 1019*b1cdbd2cSJim Jagielski push(@allfiles, $onefile) 1020*b1cdbd2cSJim Jagielski } 1021*b1cdbd2cSJim Jagielski } 1022*b1cdbd2cSJim Jagielski } 1023*b1cdbd2cSJim Jagielski 1024*b1cdbd2cSJim Jagielski return \@allfiles; 1025*b1cdbd2cSJim Jagielski} 1026*b1cdbd2cSJim Jagielski 1027*b1cdbd2cSJim Jagielski############################################################## 1028*b1cdbd2cSJim Jagielski# Creating a unique directory, for example "01_inprogress_7" 1029*b1cdbd2cSJim Jagielski# in the install directory. 1030*b1cdbd2cSJim Jagielski############################################################## 1031*b1cdbd2cSJim Jagielski 1032*b1cdbd2cSJim Jagielskisub make_numbered_dir 1033*b1cdbd2cSJim Jagielski{ 1034*b1cdbd2cSJim Jagielski my ($newstring, $olddir) = @_; 1035*b1cdbd2cSJim Jagielski 1036*b1cdbd2cSJim Jagielski my $basedir = $olddir; 1037*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 1038*b1cdbd2cSJim Jagielski 1039*b1cdbd2cSJim Jagielski my $alldirs = get_all_directories($basedir); 1040*b1cdbd2cSJim Jagielski 1041*b1cdbd2cSJim Jagielski # searching for the highest number extension 1042*b1cdbd2cSJim Jagielski 1043*b1cdbd2cSJim Jagielski my $maxnumber = 0; 1044*b1cdbd2cSJim Jagielski 1045*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) 1046*b1cdbd2cSJim Jagielski { 1047*b1cdbd2cSJim Jagielski if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ ) 1048*b1cdbd2cSJim Jagielski { 1049*b1cdbd2cSJim Jagielski my $number = $1; 1050*b1cdbd2cSJim Jagielski if ( $number > $maxnumber ) { $maxnumber = $number; } 1051*b1cdbd2cSJim Jagielski } 1052*b1cdbd2cSJim Jagielski } 1053*b1cdbd2cSJim Jagielski 1054*b1cdbd2cSJim Jagielski my $newnumber = $maxnumber + 1; 1055*b1cdbd2cSJim Jagielski 1056*b1cdbd2cSJim Jagielski my $newdir = $olddir . "_" . $newstring . "_" . $newnumber; 1057*b1cdbd2cSJim Jagielski 1058*b1cdbd2cSJim Jagielski my $returndir = ""; 1059*b1cdbd2cSJim Jagielski 1060*b1cdbd2cSJim Jagielski if ( move($olddir, $newdir) ) 1061*b1cdbd2cSJim Jagielski { 1062*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1063*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Moved directory from %s to %s\n", $olddir, $newdir); 1064*b1cdbd2cSJim Jagielski $returndir = $newdir; 1065*b1cdbd2cSJim Jagielski } 1066*b1cdbd2cSJim Jagielski else 1067*b1cdbd2cSJim Jagielski { 1068*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1069*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("ATTENTION: Could not move directory from %s to %s, \"make_numbered_dir\"\n", 1070*b1cdbd2cSJim Jagielski $olddir, 1071*b1cdbd2cSJim Jagielski $newdir); 1072*b1cdbd2cSJim Jagielski $returndir = $olddir; 1073*b1cdbd2cSJim Jagielski } 1074*b1cdbd2cSJim Jagielski 1075*b1cdbd2cSJim Jagielski return $returndir; 1076*b1cdbd2cSJim Jagielski} 1077*b1cdbd2cSJim Jagielski 1078*b1cdbd2cSJim Jagielski############################################################## 1079*b1cdbd2cSJim Jagielski# Determining the highest number in the install directory. 1080*b1cdbd2cSJim Jagielski############################################################## 1081*b1cdbd2cSJim Jagielski 1082*b1cdbd2cSJim Jagielskisub determine_maximum_number 1083*b1cdbd2cSJim Jagielski{ 1084*b1cdbd2cSJim Jagielski my ($dir, $languagestringref) = @_; 1085*b1cdbd2cSJim Jagielski 1086*b1cdbd2cSJim Jagielski my $basedir = $dir; 1087*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 1088*b1cdbd2cSJim Jagielski 1089*b1cdbd2cSJim Jagielski my $alldirs = get_all_directories($basedir); 1090*b1cdbd2cSJim Jagielski 1091*b1cdbd2cSJim Jagielski my $maxnumber = 1; 1092*b1cdbd2cSJim Jagielski 1093*b1cdbd2cSJim Jagielski # In control.pm the installation directory is determined as: 1094*b1cdbd2cSJim Jagielski # $installer::globals::build . "_" . $installer::globals::lastminor . "_" . 1095*b1cdbd2cSJim Jagielski # "native_inprogress-number_" . $$languagesref . "\." . $installer::globals::buildid; 1096*b1cdbd2cSJim Jagielski 1097*b1cdbd2cSJim Jagielski # searching for the highest number extension after the first "-", which belongs to 1098*b1cdbd2cSJim Jagielski # $installer::globals::build, $installer::globals::lastminor and $installer::globals::buildid 1099*b1cdbd2cSJim Jagielski # In this step not looking for the language! 1100*b1cdbd2cSJim Jagielski 1101*b1cdbd2cSJim Jagielski my @correctbuildiddirs = (); 1102*b1cdbd2cSJim Jagielski 1103*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) 1104*b1cdbd2cSJim Jagielski { 1105*b1cdbd2cSJim Jagielski my $onedir = ${$alldirs}[$i]; 1106*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onedir); 1107*b1cdbd2cSJim Jagielski 1108*b1cdbd2cSJim Jagielski if ( $onedir =~ /^\s*\Q$installer::globals::build\E\_\Q$installer::globals::lastminor\E\_(.*?)\-(\d+)\_(.*?)\.\Q$installer::globals::buildid\E\s*$/ ) 1109*b1cdbd2cSJim Jagielski { 1110*b1cdbd2cSJim Jagielski my $number = $2; 1111*b1cdbd2cSJim Jagielski if ( $number > $maxnumber ) { $maxnumber = $number; } 1112*b1cdbd2cSJim Jagielski push(@correctbuildiddirs, $onedir); 1113*b1cdbd2cSJim Jagielski } 1114*b1cdbd2cSJim Jagielski } 1115*b1cdbd2cSJim Jagielski 1116*b1cdbd2cSJim Jagielski # From all directories with correct $installer::globals::build, $installer::globals::lastminor 1117*b1cdbd2cSJim Jagielski # and $installer::globals::buildid, those directories, which already have the maximum number 1118*b1cdbd2cSJim Jagielski # have to be selected 1119*b1cdbd2cSJim Jagielski 1120*b1cdbd2cSJim Jagielski my @maximumnumberdirs = (); 1121*b1cdbd2cSJim Jagielski 1122*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#correctbuildiddirs; $i++ ) 1123*b1cdbd2cSJim Jagielski { 1124*b1cdbd2cSJim Jagielski my $onedir = $correctbuildiddirs[$i]; 1125*b1cdbd2cSJim Jagielski 1126*b1cdbd2cSJim Jagielski if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) 1127*b1cdbd2cSJim Jagielski { 1128*b1cdbd2cSJim Jagielski my $number = $2; 1129*b1cdbd2cSJim Jagielski 1130*b1cdbd2cSJim Jagielski if ( $number == $maxnumber ) 1131*b1cdbd2cSJim Jagielski { 1132*b1cdbd2cSJim Jagielski push(@maximumnumberdirs, $onedir); 1133*b1cdbd2cSJim Jagielski } 1134*b1cdbd2cSJim Jagielski } 1135*b1cdbd2cSJim Jagielski } 1136*b1cdbd2cSJim Jagielski 1137*b1cdbd2cSJim Jagielski # @maximumnumberdirs contains only those directories with correct $installer::globals::build, 1138*b1cdbd2cSJim Jagielski # $installer::globals::lastminor and $installer::globals::buildid, which already have the maximum number. 1139*b1cdbd2cSJim Jagielski # If the current language is part of this directory, the number has to be increased. 1140*b1cdbd2cSJim Jagielski 1141*b1cdbd2cSJim Jagielski my $increase_counter = 0; 1142*b1cdbd2cSJim Jagielski 1143*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#maximumnumberdirs; $i++ ) 1144*b1cdbd2cSJim Jagielski { 1145*b1cdbd2cSJim Jagielski my $onedir = $maximumnumberdirs[$i]; 1146*b1cdbd2cSJim Jagielski 1147*b1cdbd2cSJim Jagielski if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) 1148*b1cdbd2cSJim Jagielski { 1149*b1cdbd2cSJim Jagielski my $number = $2; 1150*b1cdbd2cSJim Jagielski my $languagestring = $3; 1151*b1cdbd2cSJim Jagielski 1152*b1cdbd2cSJim Jagielski if ( $languagestring eq $$languagestringref ) 1153*b1cdbd2cSJim Jagielski { 1154*b1cdbd2cSJim Jagielski $increase_counter = 1; 1155*b1cdbd2cSJim Jagielski } 1156*b1cdbd2cSJim Jagielski } 1157*b1cdbd2cSJim Jagielski } 1158*b1cdbd2cSJim Jagielski 1159*b1cdbd2cSJim Jagielski if ( $increase_counter ) 1160*b1cdbd2cSJim Jagielski { 1161*b1cdbd2cSJim Jagielski $maxnumber = $maxnumber + 1; 1162*b1cdbd2cSJim Jagielski } 1163*b1cdbd2cSJim Jagielski 1164*b1cdbd2cSJim Jagielski return $maxnumber; 1165*b1cdbd2cSJim Jagielski} 1166*b1cdbd2cSJim Jagielski 1167*b1cdbd2cSJim Jagielski##################################################################################### 1168*b1cdbd2cSJim Jagielski# Renaming a directory by exchanging a string, for example from "01_inprogress_7" 1169*b1cdbd2cSJim Jagielski# to "01_witherror_7". 1170*b1cdbd2cSJim Jagielski##################################################################################### 1171*b1cdbd2cSJim Jagielski 1172*b1cdbd2cSJim Jagielskisub rename_string_in_directory 1173*b1cdbd2cSJim Jagielski{ 1174*b1cdbd2cSJim Jagielski my ($olddir, $oldstring, $newstring) = @_; 1175*b1cdbd2cSJim Jagielski 1176*b1cdbd2cSJim Jagielski my $newdir = $olddir; 1177*b1cdbd2cSJim Jagielski my $infoline = ""; 1178*b1cdbd2cSJim Jagielski 1179*b1cdbd2cSJim Jagielski $newdir =~ s/$oldstring/$newstring/g; 1180*b1cdbd2cSJim Jagielski 1181*b1cdbd2cSJim Jagielski if (( -d $newdir ) && ( $olddir ne $newdir )) { remove_complete_directory($newdir, 1); } 1182*b1cdbd2cSJim Jagielski 1183*b1cdbd2cSJim Jagielski if ( move($olddir, $newdir) ) 1184*b1cdbd2cSJim Jagielski { 1185*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1186*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Moved directory from $olddir to %s\n", $newdir); 1187*b1cdbd2cSJim Jagielski } 1188*b1cdbd2cSJim Jagielski else 1189*b1cdbd2cSJim Jagielski { 1190*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1191*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 1192*b1cdbd2cSJim Jagielski "ATTENTION: Could not move directory from %s to %s, \"rename_string_in_directory\"\n", 1193*b1cdbd2cSJim Jagielski $olddir, $newdir); 1194*b1cdbd2cSJim Jagielski } 1195*b1cdbd2cSJim Jagielski 1196*b1cdbd2cSJim Jagielski return $newdir; 1197*b1cdbd2cSJim Jagielski} 1198*b1cdbd2cSJim Jagielski 1199*b1cdbd2cSJim Jagielski###################################################### 1200*b1cdbd2cSJim Jagielski# Returning the complete directory name, 1201*b1cdbd2cSJim Jagielski# input is the first part of the directory name. 1202*b1cdbd2cSJim Jagielski###################################################### 1203*b1cdbd2cSJim Jagielski 1204*b1cdbd2cSJim Jagielskisub get_directoryname 1205*b1cdbd2cSJim Jagielski{ 1206*b1cdbd2cSJim Jagielski my ($searchdir, $startstring) = @_; 1207*b1cdbd2cSJim Jagielski 1208*b1cdbd2cSJim Jagielski my $dirname = ""; 1209*b1cdbd2cSJim Jagielski my $founddir = 0; 1210*b1cdbd2cSJim Jagielski my $direntry; 1211*b1cdbd2cSJim Jagielski 1212*b1cdbd2cSJim Jagielski opendir(DIR, $searchdir); 1213*b1cdbd2cSJim Jagielski 1214*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1215*b1cdbd2cSJim Jagielski { 1216*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1217*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1218*b1cdbd2cSJim Jagielski 1219*b1cdbd2cSJim Jagielski if (( -d $direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ )) 1220*b1cdbd2cSJim Jagielski { 1221*b1cdbd2cSJim Jagielski $dirname = $direntry; 1222*b1cdbd2cSJim Jagielski $founddir = 1; 1223*b1cdbd2cSJim Jagielski last; 1224*b1cdbd2cSJim Jagielski } 1225*b1cdbd2cSJim Jagielski } 1226*b1cdbd2cSJim Jagielski 1227*b1cdbd2cSJim Jagielski closedir(DIR); 1228*b1cdbd2cSJim Jagielski 1229*b1cdbd2cSJim Jagielski if ( ! $founddir ) { installer::exiter::exit_program("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); } 1230*b1cdbd2cSJim Jagielski 1231*b1cdbd2cSJim Jagielski return $dirname; 1232*b1cdbd2cSJim Jagielski} 1233*b1cdbd2cSJim Jagielski 1234*b1cdbd2cSJim Jagielski 1235*b1cdbd2cSJim Jagielski################################### 1236*b1cdbd2cSJim Jagielski# Renaming a directory 1237*b1cdbd2cSJim Jagielski################################### 1238*b1cdbd2cSJim Jagielski 1239*b1cdbd2cSJim Jagielskisub rename_directory 1240*b1cdbd2cSJim Jagielski{ 1241*b1cdbd2cSJim Jagielski my ($olddir, $newdir) = @_; 1242*b1cdbd2cSJim Jagielski 1243*b1cdbd2cSJim Jagielski my $infoline = ""; 1244*b1cdbd2cSJim Jagielski 1245*b1cdbd2cSJim Jagielski # noticed problems under Windows from time to time that directories can't be moved, seems a timing issue 1246*b1cdbd2cSJim Jagielski # workaround with sleep, should be investigated with a new packaging mechanism 1247*b1cdbd2cSJim Jagielski sleep(2); 1248*b1cdbd2cSJim Jagielski if ( move($olddir, $newdir) ) 1249*b1cdbd2cSJim Jagielski { 1250*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1251*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Moved directory from $olddir to %s\n", $newdir); 1252*b1cdbd2cSJim Jagielski } 1253*b1cdbd2cSJim Jagielski else 1254*b1cdbd2cSJim Jagielski { 1255*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Could not move directory from $olddir to $newdir", "rename_directory"); 1256*b1cdbd2cSJim Jagielski } 1257*b1cdbd2cSJim Jagielski 1258*b1cdbd2cSJim Jagielski return $newdir; 1259*b1cdbd2cSJim Jagielski} 1260*b1cdbd2cSJim Jagielski 1261*b1cdbd2cSJim Jagielski############################################################## 1262*b1cdbd2cSJim Jagielski# Creating a directory next to an existing directory 1263*b1cdbd2cSJim Jagielski############################################################## 1264*b1cdbd2cSJim Jagielski 1265*b1cdbd2cSJim Jagielskisub create_directory_next_to_directory 1266*b1cdbd2cSJim Jagielski{ 1267*b1cdbd2cSJim Jagielski my ($topdir, $dirname) = @_; 1268*b1cdbd2cSJim Jagielski 1269*b1cdbd2cSJim Jagielski my $basedir = $topdir; 1270*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 1271*b1cdbd2cSJim Jagielski 1272*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1273*b1cdbd2cSJim Jagielski 1274*b1cdbd2cSJim Jagielski my $newdir = $basedir . $installer::globals::separator . $dirname; 1275*b1cdbd2cSJim Jagielski 1276*b1cdbd2cSJim Jagielski create_directory($newdir); 1277*b1cdbd2cSJim Jagielski 1278*b1cdbd2cSJim Jagielski return $newdir; 1279*b1cdbd2cSJim Jagielski} 1280*b1cdbd2cSJim Jagielski 1281*b1cdbd2cSJim Jagielski############################################################## 1282*b1cdbd2cSJim Jagielski# Collecting all directories inside a directory 1283*b1cdbd2cSJim Jagielski############################################################## 1284*b1cdbd2cSJim Jagielski 1285*b1cdbd2cSJim Jagielskisub get_all_directories 1286*b1cdbd2cSJim Jagielski{ 1287*b1cdbd2cSJim Jagielski my ($basedir) = @_; 1288*b1cdbd2cSJim Jagielski 1289*b1cdbd2cSJim Jagielski my @alldirs = (); 1290*b1cdbd2cSJim Jagielski my $direntry; 1291*b1cdbd2cSJim Jagielski 1292*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1293*b1cdbd2cSJim Jagielski 1294*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1295*b1cdbd2cSJim Jagielski 1296*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1297*b1cdbd2cSJim Jagielski { 1298*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1299*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1300*b1cdbd2cSJim Jagielski 1301*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1302*b1cdbd2cSJim Jagielski 1303*b1cdbd2cSJim Jagielski if ( -d $completeentry ) { push(@alldirs, $completeentry); } 1304*b1cdbd2cSJim Jagielski } 1305*b1cdbd2cSJim Jagielski 1306*b1cdbd2cSJim Jagielski closedir(DIR); 1307*b1cdbd2cSJim Jagielski 1308*b1cdbd2cSJim Jagielski return \@alldirs; 1309*b1cdbd2cSJim Jagielski} 1310*b1cdbd2cSJim Jagielski 1311*b1cdbd2cSJim Jagielski############################################################## 1312*b1cdbd2cSJim Jagielski# Collecting all directories inside a directory 1313*b1cdbd2cSJim Jagielski# Returning without path 1314*b1cdbd2cSJim Jagielski############################################################## 1315*b1cdbd2cSJim Jagielski 1316*b1cdbd2cSJim Jagielskisub get_all_directories_without_path 1317*b1cdbd2cSJim Jagielski{ 1318*b1cdbd2cSJim Jagielski my ($basedir) = @_; 1319*b1cdbd2cSJim Jagielski 1320*b1cdbd2cSJim Jagielski my @alldirs = (); 1321*b1cdbd2cSJim Jagielski my $direntry; 1322*b1cdbd2cSJim Jagielski 1323*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1324*b1cdbd2cSJim Jagielski 1325*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1326*b1cdbd2cSJim Jagielski 1327*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1328*b1cdbd2cSJim Jagielski { 1329*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1330*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1331*b1cdbd2cSJim Jagielski 1332*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1333*b1cdbd2cSJim Jagielski 1334*b1cdbd2cSJim Jagielski if ( -d $completeentry ) { push(@alldirs, $direntry); } 1335*b1cdbd2cSJim Jagielski } 1336*b1cdbd2cSJim Jagielski 1337*b1cdbd2cSJim Jagielski closedir(DIR); 1338*b1cdbd2cSJim Jagielski 1339*b1cdbd2cSJim Jagielski return \@alldirs; 1340*b1cdbd2cSJim Jagielski} 1341*b1cdbd2cSJim Jagielski 1342*b1cdbd2cSJim Jagielski############################################################## 1343*b1cdbd2cSJim Jagielski# Collecting all files inside one directory 1344*b1cdbd2cSJim Jagielski############################################################## 1345*b1cdbd2cSJim Jagielski 1346*b1cdbd2cSJim Jagielskisub get_all_files_from_one_directory 1347*b1cdbd2cSJim Jagielski{ 1348*b1cdbd2cSJim Jagielski my ($basedir) = @_; 1349*b1cdbd2cSJim Jagielski 1350*b1cdbd2cSJim Jagielski my @allfiles = (); 1351*b1cdbd2cSJim Jagielski my $direntry; 1352*b1cdbd2cSJim Jagielski 1353*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1354*b1cdbd2cSJim Jagielski 1355*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1356*b1cdbd2cSJim Jagielski 1357*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1358*b1cdbd2cSJim Jagielski { 1359*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1360*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1361*b1cdbd2cSJim Jagielski 1362*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1363*b1cdbd2cSJim Jagielski 1364*b1cdbd2cSJim Jagielski if ( -f $completeentry ) { push(@allfiles, $completeentry); } 1365*b1cdbd2cSJim Jagielski } 1366*b1cdbd2cSJim Jagielski 1367*b1cdbd2cSJim Jagielski closedir(DIR); 1368*b1cdbd2cSJim Jagielski 1369*b1cdbd2cSJim Jagielski return \@allfiles; 1370*b1cdbd2cSJim Jagielski} 1371*b1cdbd2cSJim Jagielski 1372*b1cdbd2cSJim Jagielski############################################################## 1373*b1cdbd2cSJim Jagielski# Collecting all files inside one directory 1374*b1cdbd2cSJim Jagielski############################################################## 1375*b1cdbd2cSJim Jagielski 1376*b1cdbd2cSJim Jagielskisub get_all_files_from_one_directory_without_path 1377*b1cdbd2cSJim Jagielski{ 1378*b1cdbd2cSJim Jagielski my ($basedir) = @_; 1379*b1cdbd2cSJim Jagielski 1380*b1cdbd2cSJim Jagielski my @allfiles = (); 1381*b1cdbd2cSJim Jagielski my $direntry; 1382*b1cdbd2cSJim Jagielski 1383*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1384*b1cdbd2cSJim Jagielski 1385*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1386*b1cdbd2cSJim Jagielski 1387*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1388*b1cdbd2cSJim Jagielski { 1389*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1390*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1391*b1cdbd2cSJim Jagielski 1392*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1393*b1cdbd2cSJim Jagielski 1394*b1cdbd2cSJim Jagielski if ( -f $completeentry ) { push(@allfiles, $direntry); } 1395*b1cdbd2cSJim Jagielski } 1396*b1cdbd2cSJim Jagielski 1397*b1cdbd2cSJim Jagielski closedir(DIR); 1398*b1cdbd2cSJim Jagielski 1399*b1cdbd2cSJim Jagielski return \@allfiles; 1400*b1cdbd2cSJim Jagielski} 1401*b1cdbd2cSJim Jagielski 1402*b1cdbd2cSJim Jagielski############################################################## 1403*b1cdbd2cSJim Jagielski# Collecting all files and directories inside one directory 1404*b1cdbd2cSJim Jagielski############################################################## 1405*b1cdbd2cSJim Jagielski 1406*b1cdbd2cSJim Jagielskisub read_directory 1407*b1cdbd2cSJim Jagielski{ 1408*b1cdbd2cSJim Jagielski my ($basedir) = @_; 1409*b1cdbd2cSJim Jagielski 1410*b1cdbd2cSJim Jagielski my @allcontent = (); 1411*b1cdbd2cSJim Jagielski my $direntry; 1412*b1cdbd2cSJim Jagielski 1413*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1414*b1cdbd2cSJim Jagielski 1415*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1416*b1cdbd2cSJim Jagielski 1417*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1418*b1cdbd2cSJim Jagielski { 1419*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1420*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1421*b1cdbd2cSJim Jagielski 1422*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1423*b1cdbd2cSJim Jagielski 1424*b1cdbd2cSJim Jagielski if (( -f $completeentry ) || ( -d $completeentry )) { push(@allcontent, $completeentry); } 1425*b1cdbd2cSJim Jagielski } 1426*b1cdbd2cSJim Jagielski 1427*b1cdbd2cSJim Jagielski closedir(DIR); 1428*b1cdbd2cSJim Jagielski 1429*b1cdbd2cSJim Jagielski return \@allcontent; 1430*b1cdbd2cSJim Jagielski} 1431*b1cdbd2cSJim Jagielski 1432*b1cdbd2cSJim Jagielski############################################################## 1433*b1cdbd2cSJim Jagielski# Finding the new content in a directory 1434*b1cdbd2cSJim Jagielski############################################################## 1435*b1cdbd2cSJim Jagielski 1436*b1cdbd2cSJim Jagielskisub find_new_content_in_directory 1437*b1cdbd2cSJim Jagielski{ 1438*b1cdbd2cSJim Jagielski my ( $basedir, $oldcontent ) = @_; 1439*b1cdbd2cSJim Jagielski 1440*b1cdbd2cSJim Jagielski my @newcontent = (); 1441*b1cdbd2cSJim Jagielski my @allcontent = (); 1442*b1cdbd2cSJim Jagielski 1443*b1cdbd2cSJim Jagielski my $direntry; 1444*b1cdbd2cSJim Jagielski 1445*b1cdbd2cSJim Jagielski $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1446*b1cdbd2cSJim Jagielski 1447*b1cdbd2cSJim Jagielski opendir(DIR, $basedir); 1448*b1cdbd2cSJim Jagielski 1449*b1cdbd2cSJim Jagielski foreach $direntry (readdir (DIR)) 1450*b1cdbd2cSJim Jagielski { 1451*b1cdbd2cSJim Jagielski next if $direntry eq "."; 1452*b1cdbd2cSJim Jagielski next if $direntry eq ".."; 1453*b1cdbd2cSJim Jagielski 1454*b1cdbd2cSJim Jagielski my $completeentry = $basedir . $installer::globals::separator . $direntry; 1455*b1cdbd2cSJim Jagielski 1456*b1cdbd2cSJim Jagielski if (( -f $completeentry ) || ( -d $completeentry )) 1457*b1cdbd2cSJim Jagielski { 1458*b1cdbd2cSJim Jagielski push(@allcontent, $completeentry); 1459*b1cdbd2cSJim Jagielski if (! installer::existence::exists_in_array($completeentry, $oldcontent)) 1460*b1cdbd2cSJim Jagielski { 1461*b1cdbd2cSJim Jagielski push(@newcontent, $completeentry); 1462*b1cdbd2cSJim Jagielski } 1463*b1cdbd2cSJim Jagielski } 1464*b1cdbd2cSJim Jagielski } 1465*b1cdbd2cSJim Jagielski 1466*b1cdbd2cSJim Jagielski closedir(DIR); 1467*b1cdbd2cSJim Jagielski 1468*b1cdbd2cSJim Jagielski return (\@newcontent, \@allcontent); 1469*b1cdbd2cSJim Jagielski} 1470*b1cdbd2cSJim Jagielski 1471*b1cdbd2cSJim Jagielski############################################################## 1472*b1cdbd2cSJim Jagielski# Trying to create a directory, no error if this fails 1473*b1cdbd2cSJim Jagielski############################################################## 1474*b1cdbd2cSJim Jagielski 1475*b1cdbd2cSJim Jagielskisub try_to_create_directory 1476*b1cdbd2cSJim Jagielski{ 1477*b1cdbd2cSJim Jagielski my ($directory) = @_; 1478*b1cdbd2cSJim Jagielski 1479*b1cdbd2cSJim Jagielski my $returnvalue = 1; 1480*b1cdbd2cSJim Jagielski my $created_directory = 0; 1481*b1cdbd2cSJim Jagielski 1482*b1cdbd2cSJim Jagielski if (!(-d $directory)) 1483*b1cdbd2cSJim Jagielski { 1484*b1cdbd2cSJim Jagielski $returnvalue = mkdir($directory, 0775); 1485*b1cdbd2cSJim Jagielski 1486*b1cdbd2cSJim Jagielski if ($returnvalue) 1487*b1cdbd2cSJim Jagielski { 1488*b1cdbd2cSJim Jagielski $created_directory = 1; 1489*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1490*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Created directory: %s\n", $directory); 1491*b1cdbd2cSJim Jagielski 1492*b1cdbd2cSJim Jagielski my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1"; 1493*b1cdbd2cSJim Jagielski system($localcall); 1494*b1cdbd2cSJim Jagielski 1495*b1cdbd2cSJim Jagielski # chmod 0775 is not sufficient on mac to remove sticky tag 1496*b1cdbd2cSJim Jagielski $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1"; 1497*b1cdbd2cSJim Jagielski system($localcall); 1498*b1cdbd2cSJim Jagielski } 1499*b1cdbd2cSJim Jagielski else 1500*b1cdbd2cSJim Jagielski { 1501*b1cdbd2cSJim Jagielski $created_directory = 0; 1502*b1cdbd2cSJim Jagielski } 1503*b1cdbd2cSJim Jagielski } 1504*b1cdbd2cSJim Jagielski else 1505*b1cdbd2cSJim Jagielski { 1506*b1cdbd2cSJim Jagielski $created_directory = 1; 1507*b1cdbd2cSJim Jagielski } 1508*b1cdbd2cSJim Jagielski 1509*b1cdbd2cSJim Jagielski return $created_directory; 1510*b1cdbd2cSJim Jagielski} 1511*b1cdbd2cSJim Jagielski 1512*b1cdbd2cSJim Jagielski############################################################## 1513*b1cdbd2cSJim Jagielski# Creating a complete directory structure 1514*b1cdbd2cSJim Jagielski############################################################## 1515*b1cdbd2cSJim Jagielski 1516*b1cdbd2cSJim Jagielskisub create_directory_structure 1517*b1cdbd2cSJim Jagielski{ 1518*b1cdbd2cSJim Jagielski my ($directory) = @_; 1519*b1cdbd2cSJim Jagielski 1520*b1cdbd2cSJim Jagielski if ( ! try_to_create_directory($directory) ) 1521*b1cdbd2cSJim Jagielski { 1522*b1cdbd2cSJim Jagielski my $parentdir = $directory; 1523*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 1524*b1cdbd2cSJim Jagielski 1525*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("INFO: Did not create directory %s\n", $directory); 1526*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Now trying to create parent directory %s\n", $parentdir); 1527*b1cdbd2cSJim Jagielski 1528*b1cdbd2cSJim Jagielski create_directory_structure($parentdir); # recursive 1529*b1cdbd2cSJim Jagielski } 1530*b1cdbd2cSJim Jagielski 1531*b1cdbd2cSJim Jagielski create_directory($directory); # now it has to succeed 1532*b1cdbd2cSJim Jagielski} 1533*b1cdbd2cSJim Jagielski 1534*b1cdbd2cSJim Jagielski###################################################### 1535*b1cdbd2cSJim Jagielski# Removing a complete directory with subdirectories 1536*b1cdbd2cSJim Jagielski###################################################### 1537*b1cdbd2cSJim Jagielski 1538*b1cdbd2cSJim Jagielskisub remove_complete_directory 1539*b1cdbd2cSJim Jagielski{ 1540*b1cdbd2cSJim Jagielski my ($directory, $start) = @_; 1541*b1cdbd2cSJim Jagielski 1542*b1cdbd2cSJim Jagielski my @content = (); 1543*b1cdbd2cSJim Jagielski my $infoline = ""; 1544*b1cdbd2cSJim Jagielski 1545*b1cdbd2cSJim Jagielski $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1546*b1cdbd2cSJim Jagielski 1547*b1cdbd2cSJim Jagielski if ( -d $directory ) 1548*b1cdbd2cSJim Jagielski { 1549*b1cdbd2cSJim Jagielski if ( $start ) 1550*b1cdbd2cSJim Jagielski { 1551*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1552*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Removing directory %s\n", $directory); 1553*b1cdbd2cSJim Jagielski } 1554*b1cdbd2cSJim Jagielski 1555*b1cdbd2cSJim Jagielski opendir(DIR, $directory); 1556*b1cdbd2cSJim Jagielski @content = readdir(DIR); 1557*b1cdbd2cSJim Jagielski closedir(DIR); 1558*b1cdbd2cSJim Jagielski 1559*b1cdbd2cSJim Jagielski my $oneitem; 1560*b1cdbd2cSJim Jagielski 1561*b1cdbd2cSJim Jagielski foreach $oneitem (@content) 1562*b1cdbd2cSJim Jagielski { 1563*b1cdbd2cSJim Jagielski if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1564*b1cdbd2cSJim Jagielski { 1565*b1cdbd2cSJim Jagielski my $item = $directory . $installer::globals::separator . $oneitem; 1566*b1cdbd2cSJim Jagielski 1567*b1cdbd2cSJim Jagielski if ( -f $item || -l $item ) # deleting files or links 1568*b1cdbd2cSJim Jagielski { 1569*b1cdbd2cSJim Jagielski unlink($item); 1570*b1cdbd2cSJim Jagielski } 1571*b1cdbd2cSJim Jagielski 1572*b1cdbd2cSJim Jagielski if ( -d $item ) # recursive 1573*b1cdbd2cSJim Jagielski { 1574*b1cdbd2cSJim Jagielski remove_complete_directory($item, 0); 1575*b1cdbd2cSJim Jagielski } 1576*b1cdbd2cSJim Jagielski } 1577*b1cdbd2cSJim Jagielski } 1578*b1cdbd2cSJim Jagielski 1579*b1cdbd2cSJim Jagielski # try to remove empty directory 1580*b1cdbd2cSJim Jagielski 1581*b1cdbd2cSJim Jagielski if ( ! -d $directory) 1582*b1cdbd2cSJim Jagielski { 1583*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("trying to remove directory that doesn't exist: %s\n", $directory); 1584*b1cdbd2cSJim Jagielski } 1585*b1cdbd2cSJim Jagielski my $returnvalue = rmdir $directory; 1586*b1cdbd2cSJim Jagielski 1587*b1cdbd2cSJim Jagielski if ( ! $returnvalue ) 1588*b1cdbd2cSJim Jagielski { 1589*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Warning: Problem with removing empty dir %s\n", $directory); 1590*b1cdbd2cSJim Jagielski } 1591*b1cdbd2cSJim Jagielski 1592*b1cdbd2cSJim Jagielski # try a little bit harder (sometimes there is a performance problem) 1593*b1cdbd2cSJim Jagielski if ( -d $directory ) 1594*b1cdbd2cSJim Jagielski { 1595*b1cdbd2cSJim Jagielski for ( my $j = 1; $j <= 3; $j++ ) 1596*b1cdbd2cSJim Jagielski { 1597*b1cdbd2cSJim Jagielski if ( -d $directory ) 1598*b1cdbd2cSJim Jagielski { 1599*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1600*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Warning (Try %d): Problems with removing directory %s\n", 1601*b1cdbd2cSJim Jagielski $j, $directory); 1602*b1cdbd2cSJim Jagielski 1603*b1cdbd2cSJim Jagielski $returnvalue = rmdir $directory; 1604*b1cdbd2cSJim Jagielski 1605*b1cdbd2cSJim Jagielski if ( $returnvalue ) 1606*b1cdbd2cSJim Jagielski { 1607*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Successfully removed empty dir %s\n", $directory); 1608*b1cdbd2cSJim Jagielski } 1609*b1cdbd2cSJim Jagielski else 1610*b1cdbd2cSJim Jagielski { 1611*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Warning: rmdir %s failed.\n", $directory); 1612*b1cdbd2cSJim Jagielski } 1613*b1cdbd2cSJim Jagielski } 1614*b1cdbd2cSJim Jagielski } 1615*b1cdbd2cSJim Jagielski } 1616*b1cdbd2cSJim Jagielski } 1617*b1cdbd2cSJim Jagielski} 1618*b1cdbd2cSJim Jagielski 1619*b1cdbd2cSJim Jagielski###################################################### 1620*b1cdbd2cSJim Jagielski# Creating a unique directory with number extension 1621*b1cdbd2cSJim Jagielski###################################################### 1622*b1cdbd2cSJim Jagielski 1623*b1cdbd2cSJim Jagielskisub create_unique_directory 1624*b1cdbd2cSJim Jagielski{ 1625*b1cdbd2cSJim Jagielski my ($directory) = @_; 1626*b1cdbd2cSJim Jagielski 1627*b1cdbd2cSJim Jagielski $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1628*b1cdbd2cSJim Jagielski $directory = $directory . "_INCREASINGNUMBER"; 1629*b1cdbd2cSJim Jagielski 1630*b1cdbd2cSJim Jagielski my $counter = 1; 1631*b1cdbd2cSJim Jagielski my $created = 0; 1632*b1cdbd2cSJim Jagielski my $localdirectory = ""; 1633*b1cdbd2cSJim Jagielski 1634*b1cdbd2cSJim Jagielski do 1635*b1cdbd2cSJim Jagielski { 1636*b1cdbd2cSJim Jagielski $localdirectory = $directory; 1637*b1cdbd2cSJim Jagielski $localdirectory =~ s/INCREASINGNUMBER/$counter/; 1638*b1cdbd2cSJim Jagielski $counter++; 1639*b1cdbd2cSJim Jagielski 1640*b1cdbd2cSJim Jagielski if ( ! -d $localdirectory ) 1641*b1cdbd2cSJim Jagielski { 1642*b1cdbd2cSJim Jagielski create_directory($localdirectory); 1643*b1cdbd2cSJim Jagielski $created = 1; 1644*b1cdbd2cSJim Jagielski } 1645*b1cdbd2cSJim Jagielski } 1646*b1cdbd2cSJim Jagielski while ( ! $created ); 1647*b1cdbd2cSJim Jagielski 1648*b1cdbd2cSJim Jagielski return $localdirectory; 1649*b1cdbd2cSJim Jagielski} 1650*b1cdbd2cSJim Jagielski 1651*b1cdbd2cSJim Jagielski###################################################### 1652*b1cdbd2cSJim Jagielski# Creating a unique directory with pid extension 1653*b1cdbd2cSJim Jagielski###################################################### 1654*b1cdbd2cSJim Jagielski 1655*b1cdbd2cSJim Jagielskisub create_pid_directory 1656*b1cdbd2cSJim Jagielski{ 1657*b1cdbd2cSJim Jagielski my ($directory) = @_; 1658*b1cdbd2cSJim Jagielski 1659*b1cdbd2cSJim Jagielski $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1660*b1cdbd2cSJim Jagielski my $pid = $$; # process id 1661*b1cdbd2cSJim Jagielski my $time = time(); # time 1662*b1cdbd2cSJim Jagielski 1663*b1cdbd2cSJim Jagielski $directory = $directory . "_" . $pid . $time; 1664*b1cdbd2cSJim Jagielski 1665*b1cdbd2cSJim Jagielski if ( ! -d $directory ) { create_directory($directory); } 1666*b1cdbd2cSJim Jagielski else { installer::exiter::exit_program("ERROR: Directory $directory already exists!", "create_pid_directory"); } 1667*b1cdbd2cSJim Jagielski 1668*b1cdbd2cSJim Jagielski return $directory; 1669*b1cdbd2cSJim Jagielski} 1670*b1cdbd2cSJim Jagielski 1671*b1cdbd2cSJim Jagielski############################################################## 1672*b1cdbd2cSJim Jagielski# Reading all files from a directory and its subdirectories 1673*b1cdbd2cSJim Jagielski############################################################## 1674*b1cdbd2cSJim Jagielski 1675*b1cdbd2cSJim Jagielskisub read_complete_directory 1676*b1cdbd2cSJim Jagielski{ 1677*b1cdbd2cSJim Jagielski my ($directory, $pathstring, $filecollector) = @_; 1678*b1cdbd2cSJim Jagielski 1679*b1cdbd2cSJim Jagielski my @content = (); 1680*b1cdbd2cSJim Jagielski opendir(DIR, $directory); 1681*b1cdbd2cSJim Jagielski @content = readdir(DIR); 1682*b1cdbd2cSJim Jagielski closedir(DIR); 1683*b1cdbd2cSJim Jagielski 1684*b1cdbd2cSJim Jagielski my $onefile; 1685*b1cdbd2cSJim Jagielski 1686*b1cdbd2cSJim Jagielski foreach $onefile (@content) 1687*b1cdbd2cSJim Jagielski { 1688*b1cdbd2cSJim Jagielski if ((!($onefile eq ".")) && (!($onefile eq ".."))) 1689*b1cdbd2cSJim Jagielski { 1690*b1cdbd2cSJim Jagielski my $completefilename = $directory . $installer::globals::separator . $onefile; 1691*b1cdbd2cSJim Jagielski my $sep = ""; 1692*b1cdbd2cSJim Jagielski if ( $pathstring ne "" ) { $sep = $installer::globals::separator; } 1693*b1cdbd2cSJim Jagielski 1694*b1cdbd2cSJim Jagielski if ( ! -d $completefilename ) # only files, no directories 1695*b1cdbd2cSJim Jagielski { 1696*b1cdbd2cSJim Jagielski my $content = $pathstring . $sep . $onefile; 1697*b1cdbd2cSJim Jagielski push(@{$filecollector}, $content); 1698*b1cdbd2cSJim Jagielski } 1699*b1cdbd2cSJim Jagielski else # recursive for directories 1700*b1cdbd2cSJim Jagielski { 1701*b1cdbd2cSJim Jagielski my $newpathstring = $pathstring . $sep . $onefile; 1702*b1cdbd2cSJim Jagielski read_complete_directory($completefilename, $newpathstring, $filecollector); 1703*b1cdbd2cSJim Jagielski } 1704*b1cdbd2cSJim Jagielski } 1705*b1cdbd2cSJim Jagielski } 1706*b1cdbd2cSJim Jagielski} 1707*b1cdbd2cSJim Jagielski 1708*b1cdbd2cSJim Jagielski############################################################## 1709*b1cdbd2cSJim Jagielski# Reading all files from a directory and its subdirectories 1710*b1cdbd2cSJim Jagielski# Version 2 1711*b1cdbd2cSJim Jagielski############################################################## 1712*b1cdbd2cSJim Jagielski 1713*b1cdbd2cSJim Jagielskisub read_full_directory ($$$) 1714*b1cdbd2cSJim Jagielski{ 1715*b1cdbd2cSJim Jagielski my ( $currentdir, $pathstring, $collector ) = @_; 1716*b1cdbd2cSJim Jagielski my $item; 1717*b1cdbd2cSJim Jagielski my $fullname; 1718*b1cdbd2cSJim Jagielski local *DH; 1719*b1cdbd2cSJim Jagielski 1720*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("seaching files under '%s'\n", $currentdir); 1721*b1cdbd2cSJim Jagielski 1722*b1cdbd2cSJim Jagielski my @directory_queue = [$currentdir, $pathstring]; 1723*b1cdbd2cSJim Jagielski 1724*b1cdbd2cSJim Jagielski while (scalar @directory_queue > 0) 1725*b1cdbd2cSJim Jagielski { 1726*b1cdbd2cSJim Jagielski my ($path, $relative_path) = @{shift @directory_queue}; 1727*b1cdbd2cSJim Jagielski my $start_count = scalar @$collector; 1728*b1cdbd2cSJim Jagielski 1729*b1cdbd2cSJim Jagielski next unless opendir(DH, $path); 1730*b1cdbd2cSJim Jagielski 1731*b1cdbd2cSJim Jagielski while (defined ($item = readdir(DH))) 1732*b1cdbd2cSJim Jagielski { 1733*b1cdbd2cSJim Jagielski next if($item eq "." or $item eq ".."); 1734*b1cdbd2cSJim Jagielski $fullname = $path . $installer::globals::separator . $item; 1735*b1cdbd2cSJim Jagielski my $sep = ""; 1736*b1cdbd2cSJim Jagielski if ($relative_path ne "") 1737*b1cdbd2cSJim Jagielski { 1738*b1cdbd2cSJim Jagielski $sep = $installer::globals::separator; 1739*b1cdbd2cSJim Jagielski } 1740*b1cdbd2cSJim Jagielski 1741*b1cdbd2cSJim Jagielski if( -d $fullname) 1742*b1cdbd2cSJim Jagielski { 1743*b1cdbd2cSJim Jagielski push @directory_queue, [$fullname, $relative_path . $sep . $item]; 1744*b1cdbd2cSJim Jagielski } 1745*b1cdbd2cSJim Jagielski else 1746*b1cdbd2cSJim Jagielski { 1747*b1cdbd2cSJim Jagielski my $content = $relative_path . $sep . $item; 1748*b1cdbd2cSJim Jagielski push(@{$collector}, $content); 1749*b1cdbd2cSJim Jagielski } 1750*b1cdbd2cSJim Jagielski } 1751*b1cdbd2cSJim Jagielski closedir(DH); 1752*b1cdbd2cSJim Jagielski my $count = scalar @$collector - $start_count; 1753*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf(" found %d new files in '%s'\n", $count, $path); 1754*b1cdbd2cSJim Jagielski } 1755*b1cdbd2cSJim Jagielski} 1756*b1cdbd2cSJim Jagielski 1757*b1cdbd2cSJim Jagielski############################################################## 1758*b1cdbd2cSJim Jagielski# Removing all empty directories below a specified directory 1759*b1cdbd2cSJim Jagielski############################################################## 1760*b1cdbd2cSJim Jagielski 1761*b1cdbd2cSJim Jagielskisub remove_empty_dirs_in_folder 1762*b1cdbd2cSJim Jagielski{ 1763*b1cdbd2cSJim Jagielski my ( $dir ) = @_; 1764*b1cdbd2cSJim Jagielski 1765*b1cdbd2cSJim Jagielski my @content = (); 1766*b1cdbd2cSJim Jagielski my $infoline = ""; 1767*b1cdbd2cSJim Jagielski 1768*b1cdbd2cSJim Jagielski $dir =~ s/\Q$installer::globals::separator\E\s*$//; 1769*b1cdbd2cSJim Jagielski 1770*b1cdbd2cSJim Jagielski if ( -d $dir ) 1771*b1cdbd2cSJim Jagielski { 1772*b1cdbd2cSJim Jagielski opendir(DIR, $dir); 1773*b1cdbd2cSJim Jagielski @content = readdir(DIR); 1774*b1cdbd2cSJim Jagielski closedir(DIR); 1775*b1cdbd2cSJim Jagielski 1776*b1cdbd2cSJim Jagielski my $oneitem; 1777*b1cdbd2cSJim Jagielski 1778*b1cdbd2cSJim Jagielski foreach $oneitem (@content) 1779*b1cdbd2cSJim Jagielski { 1780*b1cdbd2cSJim Jagielski if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1781*b1cdbd2cSJim Jagielski { 1782*b1cdbd2cSJim Jagielski my $item = $dir . $installer::globals::separator . $oneitem; 1783*b1cdbd2cSJim Jagielski 1784*b1cdbd2cSJim Jagielski if ( -d $item ) # recursive 1785*b1cdbd2cSJim Jagielski { 1786*b1cdbd2cSJim Jagielski remove_empty_dirs_in_folder($item); 1787*b1cdbd2cSJim Jagielski } 1788*b1cdbd2cSJim Jagielski } 1789*b1cdbd2cSJim Jagielski } 1790*b1cdbd2cSJim Jagielski 1791*b1cdbd2cSJim Jagielski # try to remove empty directory 1792*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("remove_empty_dirs_in_folder %s\n", $dir); 1793*b1cdbd2cSJim Jagielski my $returnvalue = rmdir $dir; 1794*b1cdbd2cSJim Jagielski 1795*b1cdbd2cSJim Jagielski if ( $returnvalue ) 1796*b1cdbd2cSJim Jagielski { 1797*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Successfully removed empty dir %s\n", $dir); 1798*b1cdbd2cSJim Jagielski } 1799*b1cdbd2cSJim Jagielski 1800*b1cdbd2cSJim Jagielski } 1801*b1cdbd2cSJim Jagielski 1802*b1cdbd2cSJim Jagielski} 1803*b1cdbd2cSJim Jagielski 1804*b1cdbd2cSJim Jagielski1; 1805