#################################################################################### # SpawnProcess() # Spawns a new instance of specified application in param1, with arguments in param2 # return Process Object on success, 0 on failure # a-jbilas, 06/01/99 - created #################################################################################### sub SpawnProcess { local($sTheApp, $sTheArgs) = @_; local($pTheApp) = 0; if ($sTheApp !~ /(\/|\\)/) { my($sTheAppWithPath) = FindOnPath($sTheApp); if ($sTheAppWithPath) { $sTheApp = $sTheAppWithPath; } } if (!-e $sTheApp) { PrintToLogErr("Cannot spawn process, '$sTheApp' does not exist\n"); } else { PrintToLog(" - Spawning new instance of '$sTheApp $sTheArgs'\n"); if (!Win32::Process::Create($pTheApp, $sTheApp, RemovePath($sTheApp)." ".$sTheArgs, 0, NORMAL_PRIORITY_CLASS, ".")) { PrintToLogErr("SpawnProcess() Error: ".Win32::FormatMessage(Win32::GetLastError())); $pTheApp = 0; } } return($pTheApp); } #################################################################################### # GetFiles() # When passed a directory, it will return a list of all absolute path filenames contained # within. Returns an empty list upon failure (either to open dir or find subdirs) # if no dir passed as argument, will assume current directory and do relative path filenames # adding a non-null second argument will recurse subdirectories (to recurse current # directory subdirectories, pass either "" (relative paths) or cwd() (absolute paths) # as first argument). subdirs .. and . are ignored # a-jbilas, 07/08/99 - created # a-jbilas, 07/16/99 - added recurse option #################################################################################### sub GetFiles { my(@lFiles) = (); my($sRelDir) = (($_[0] eq "") ? "" : $_[0]."\\"); opendir(SRCDIR, (($_[0] eq "") ? cwd() : $_[0])); foreach $file (readdir(SRCDIR)) { if (!-d $sRelDir.$file) { push(@lFiles, $sRelDir.$file); } elsif ((-d $sRelDir.$file) && ($_[1] ne "") && ($file !~ /^\.\.?$/)) { push(@lFiles, GetFiles($sRelDir.$file, 1)); } } closedir(SRCDIR); if ($DEBUG && (@lFiles == ()) && ($_[1] eq "")) { PrintToLogErr("GetFiles() Warning: no files found in ".(($_[0] eq "") ? cwd() : $_[0])."\n"); } return(@lFiles); } #################################################################################### # GetSubdirs() # When passed a directory, it will return a list of all absolute path subdirs contained # within. Returns an empty list upon failure (either to open dir or find subdirs) # if no dir passed as argument, will assume current directory and do relative paths # adding a non-null second argument will recurse subdirectories (to recurse current # directory subdirectories, pass either "" for relative paths or cwd() for absolute paths # as first argument). subdirs .. and . are ignored # a-jbilas, 07/08/99 - created # a-jbilas, 07/16/99 - added recurse option #################################################################################### sub GetSubdirs { my(@lDirs) = (); my($sRelDir) = (($_[0] eq "") ? "" : $_[0]."\\"); opendir(SRCDIR, (($_[0] eq "") ? cwd() : $_[0])); foreach $dir (readdir(SRCDIR)) { if ((-d $sRelDir.$dir) && ($dir !~ /^\.\.?$/)) { push(@lDirs, $sRelDir.$dir); if ($_[1] ne "") { push(@lDirs, GetSubdirs($sRelDir.$dir, 1)); } } } closedir(SRCDIR); if ($DEBUG && (@lDirs == ()) && ($_[1] eq "")) { PrintToLogErr("GetSubdirs() Warning: no subdirs found in ".(($_[0] eq "") ? cwd() : $_[0])."\n"); } return(@lDirs); } #################################################################################### # GrabCookie() # Grabs the cookie -- when passed r (read) or w (write) string as parameter, if cookie # grab fails, will wait 10 minutes before trying another grab. If cookie could not be # grabbed after 30 attempts (5 hours), function returns 0, it otherwise returns 1 # a-jbilas, 07/14/99 - created #################################################################################### sub GrabCookie { my($rc) = 1; my($nMaxAttempts) = 30; my($bCookieGrabbed) = 0; if (($_[0] ne "r") && ($_[0] ne "w")) { carp("Usage: GrabCookie(r/w) "); $rc = 0; } else { PrintToLog("Attempting to obtain a ".$_[0]." lock on cookie\n"); for ($nAttempt = 1 ; (!$bCookieGrabbed && ($nAttempt <= $nMaxAttempts)) ; ++$nAttempt) { if (Execute('cookie -v'.$_[0].'c "Locked for the '.$PROCESSOR_ARCHITECTURE.' build"')) { PrintToLog("Cookie successfully grabbed\n"); $bCookieGrabbed = 1; } elsif ($nAttempt != 30) { PrintToLog("Cookie grab failed, waiting 10 minutes for cookie to be freed "); for ($time = 1 ; $time <= 10 ; ++$time) #sleep ten minutes { print("."); sleep(60); } PrintToLog("\n"); } } } if (!$bCookieGrabbed) { PrintToLogErr("GrabCookie() Error: Cookie could not be obtained\n"); $rc = 0; } return($rc); } #### DougP 7/19/99 #### return full path of a program found on the path. sub FindOnPath { my ($strProgram) = @_; foreach $dir (split (';', $ENV{"PATH"})) { my $strFullPath = $dir."\\".$strProgram; if (-e $strFullPath) { return $strFullPath; } } print "couldn't find path for $strProgram\n"; return 0; } #################################################################################### # NLP3CleanAll() # traverse all of nlp3 project and delnode directories with names match arguments # passed to function (if no args, use function defaults) # returns number of files deleted # a-jbilas, 07/21/99 - created #################################################################################### sub NLP3CleanAll { local(@lCleanDirs) = @_; if (@lCleanDirs == ()) { # this is the default @lCleanDirs = ("DEBUG", "RELEASE", "PROFILE", "ENGLISH", "ENGLISH_S", "JAPANESE", "SPANISH", "FRENCH", "GERMAN", "ENGLISH-INIT", "ENGLISH-C"); } my($nTotalFiles) = 0; if (PushD($SAPIROOT)) { foreach $dir (GetSubdirs()) { $dir = lc($dir); $nTotalFiles += DelOld(cwd()."\\".$dir, *lCleanDirs); } PopD(); # $SAPIROOT } return($nTotalFiles); } #################################################################################### # PrintToMsg() # Outputs 1st string parameter to $strBuildMsg with optional additional string # parameters output as subsets to 1st string (all properly formatted) # a-jbilas, 07/22/99 - created #################################################################################### sub PrintToMsg { local(@lOutput) = @_; if ($lOutput[0] =~ /fail/i) { PrintToLogErr($lOutput[0]); } else { PrintToLog($lOutput[0]); } $lOutput[0] =~ s/(failed|succeeded|succeeds)/$1<\/bold>/gi; $strBuildMsg .= "
".$lOutput[0]."\n"; shift(@lOutput); if ($lOutput) { $strBuildMsg .= "
\n"; foreach $msg (@lOutput) { PrintToLog($msg); $msg =~ s/\n/
\n/g; $strBuildMsg .= "
".$msg; } $strBuildMsg .= "<\/dl><\/em>\n"; } } #################################################################################### # GlobalReplaceInFile() # Performs a global string replacement in file specified # a-jbilas, 07/26/99 - created #################################################################################### sub GlobalReplaceInFile($$$) { # NOTE: entire file buffered in memory, not for use w/ extremely large files my($sFileName, $sSrc, $sTgt) = @_; my($buf) = ""; my($acc) = ""; my($bFound) = 0; my($fhIn) = OpenFile($sFileName, "read"); if (!$fhIn) { return(0); } else { while (!$fhIn->eof()) { $buf = $fhIn->getline(); if (!$bFound && ($buf =~ /$sSrc/)) { $bFound = 1; } $buf =~ s/$sSrc/$sTgt/g; $acc .= $buf; } CloseFile($fhIn); if ($bFound) { unlink($fhIn); my($fhOut) = OpenFile($sFileName, "write"); $fhOut->print($acc); CloseFile($fhOut); return(1); } } } sub Isx86() { return(lc($PROCESSOR_ARCHITECTURE) eq "x86"); } sub IsAlpha() { return(lc($PROCESSOR_ARCHITECTURE) eq "alpha"); } # two routines to track disk space # return the space left on a directory (in Mb) # DougP 7/6/99 sub SpaceLeft { my ($strDir) = @_; open (FPIN, "dir /-C $strDir |"); my $iSpace = -1; while () { if (/(\d+) bytes free/) { $iSpace = $1; } } close (FPIN); $iSpace /= (1 << 20); # convert to Mb return int $iSpace; } # return an html message if disk space available is below the set limit (in Mb) # warning if below 5 times set limit # DougP 7/6/99 sub SpaceLeftAlarm { my ($strDir, $iAlarmLevel) = @_; my $iSpaceLeft = SpaceLeft $strDir; print "Space left on $strDir is ${iSpaceLeft}M\n"; if ($iSpaceLeft < $iAlarmLevel) { return "Space left on $strDir is ${iSpaceLeft}M
\n"; } if ($iSpaceLeft < 5*$iAlarmLevel) { return "Space left on $strDir is ${iSpaceLeft}M
\n"; } return ""; } #################################################################################### # PrintL() # multi-option print, options listed with constants at top of library # Input: output string as first var, options as second var # (if null, PL_NORMAL assumed) # a-jbilas, 08/08/99 - created #################################################################################### sub PrintL { my($sMsg, $sModifiers) = @_; my($sHead) = ""; my($sFoot) = ""; # skip rest of function if just printing to console and log if (($sModifiers eq "") || ($sModifiers == PL_NORMAL)) { print(STDOUT $sMsg); if ($fhBuildLog) { my($tmp) = $sMsg; $tmp =~ s/\n/
\n/g; $fhBuildLog->print($tmp); } return(); } # color modifiers if ($sModifiers & PL_RED) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } elsif ($sModifiers & PL_BLUE) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } elsif ($sModifiers & PL_GREEN) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } elsif ($sModifiers & PL_PURPLE) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } elsif ($sModifiers & PL_ORANGE) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } # font modifiers if ($sModifiers & PL_LARGE) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } if ($sModifiers & PL_BOLD) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } if ($sModifiers & PL_ITALIC) { $sHead = ''.$sHead; $sFoot = $sFoot.''; } if (defined $strBuildMsg) { if ($sModifiers & PL_BOOKMARK) { $strBuildMsg .= Bookmark($sHead.$sMsg.$sFoot); } elsif ($sModifiers & PL_MSG) { $strBuildMsg .= $sHead.$sMsg.$sFoot."\n"; } } if ($fhBuildLog && !($sModifiers & PL_NOLOG)) { my($tmp) = $sMsg; $tmp =~ s/\n/
\n/g; $fhBuildLog->print($sHead.$tmp.$sFoot); } if (!($sModifiers & PL_NOSTD)) { if ($sModifiers & PL_NOTAG) { $sMsg =~ s/<[^>]*>//g; } if ($sModifiers & PL_STDERR) { print(STDERR $sMsg); } else { print(STDOUT $sMsg); } } if ($sModifiers & PL_FLUSH) { if (defined $fhBuildLog && !($sModifiers & PL_NOLOG)) { $fhBuildLog->flush(); } if (!($sModifiers & PL_NOSTD)) { if ($sModifiers & PL_STDERR) { # TODO: how to flush STDERR? } else { # TODO: how to flush STDOUT? } } } } sub PrintMsgBlock { my($lineNum) = 0; my($maxReached) = 0; PrintL("
", PL_MSG | PL_NOSTD | PL_NOLOG); foreach $line (@_) { if ((!defined $nMaxErrLines) || (!$maxReached && ($lineNum < $nMaxErrLines))) { PrintL("
".$line."\n", PL_ITALIC | PL_MSG | PL_NOSTD | PL_NOLOG); } elsif (!$maxReached) { PrintL("
Too many errors to display, click link to view continuation\n", PL_ITALIC | PL_MSG | PL_NOSTD | PL_NOLOG | PL_RED | PL_BOLD | PL_NOTAG); } } PrintL("
", PL_MSG | PL_NOSTD | PL_NOLOG); } sub IsDirectory($) { local($rc) = 0; if (Win32::File::GetAttributes($_[0], $rc)) { return($rc & DIRECTORY); } else { return(0); } } sub IsReadOnly($) { local($rc) = 0; if (Win32::File::GetAttributes($_[0], $rc)) { return($rc & READONLY); } else { return(0); } } sub SetReadOnly($$) { local($attr) = 0; if (Win32::File::GetAttributes($_[0], $attr)) { if ($_[1] && !($attr & READONLY)) { $attr = $attr | READONLY; return(Win32::File::SetAttributes($_[0], $attr)); } elsif (!$_[1] && ($attr & READONLY)) { $attr = $attr - READONLY; return(Win32::File::SetAttributes($_[0], $attr)); } else { return(1); } } else { return(0); } } sub GetDayRange { my($nNow) = time(); my($x, $nDay, $nMon, $nYear); ($x, $x, $x, $nDay, $nMon, $nYear, $x, $x, $x) = localtime($nNow); my ($retVal) = ($nMon + 1).'/'.$nDay.'/'.$nYear; if (!$_[0]) { return($retVal); } ($x, $x, $x, $nDay, $nMon, $nYear, $x, $x, $x) = localtime($nNow - $_[0] * 24 * 60 * 60); return(($nMon + 1).'/'.$nDay.'/'.$nYear); } sub GetSLMLog { my($strArg) = ""; my($dir) = ""; my($time) = ""; my(%log) = ""; foreach $i (@_) { if ($i eq "today") { my($sec, $min, $hour, $mday, $mon, $year) = localtime(time); $strArg .= " -t ".($mon + 1)."/$mday/$year"; } elsif ($i eq "user") { $strArg .= " -u $ENV{COMPUTERNAME}"; } else { $strArg .= " $i"; } } open(FPIN, 'log "-rfvi&" '.$strArg.' |'); while () { if (/^time/ || /^log : warning: /) { # skip header and warnings } elsif (/Log for (.*):/) { $dir = $1.$2; #print "Directory is ".$dir."\n"; } elsif (/^(\d\d)-(\d\d)-(\d\d)\@(\d\d):(\d\d):(\d\d)\b(.*)$/) { $time = "$3/$1/$2 $4:$5:$6 "; my($day, $who, $what, $file, $ver1, $comment) = split ' ', $7, 6; if ($who =~ /^spgbldALPHA2(.+)/) { # fix up the running together of this long name and the operation $comment = $ver1.' '.$comment; $file = $what; $what = $1; $who = "spgbldALPHA2"; } if ($file =~ /.+\\([\w.]+)/) { $file = "$dir\\$1"; } if ($comment =~ /I\d+ +(.*)/) { $comment = $1; } if ($what ne "release") { $log{"$time $who $what $file"} = " - $comment\n"; } } #else #{ # print "X on $_"; #} } close(FPIN); my($retVal) = ""; foreach $k (reverse sort keys %log) { $retVal .= $k.$log{$k}; } return($retVal); } sub FormatLogAsHTML($) { if ($_[0] eq "") { return('No History Available'); } my($result) = "\n". "\n"; foreach $line (split(/\n/, $_[0])) { my($date, $time, $who, $what, $file, $comment) = split(' ', $line, 6); if ($comment =~ /^- (.*)/) { $comment = $1; } $result .= "\n"; } close (FPIN); return($result."
Recent History
whenwhowhatfilecomment
$date $time$who$what$file$comment
\n"); } sub CleanUpSAPI() { if (PushD($SAPIROOT)) { local(@lSubdirs) = GetSubdirs(); foreach $i (@lSubdirs) { if (lc($i) ne 'bin' && lc($i) ne 'lib') { DelAll($i, 1, 1); #recurse, ignore SLM Ini } } } PopD(); #$SAPIROOT } $__SAPILIBPM = 1; 1;