|
|
if (!$__IITENVPM ) { use iit::env; } if (!$__IITBUILDCOMPONENTPM ) { use iit::buildcomponent; } if (!$__IITSSREPLPM ) { use iit::ssrepl; }
sub BuildServer { local($sServerName, @lBuildServerComponents) = @_; my($rc) = BC_NOTHINGDONE;
PrintL("\nStarting ".$sServerName." ... \n\n", PL_HEADER); my($sBuildResultsFile) = $PROJROOT."\\logs\\".$sServerName."msg.html"; unlink($sBuildResultsFile); PrintToFile($sBuildResultsFile, "<html><title>".$sServerName." Results</title><body bgproperties=\"FIXED\"". "background=\"http://iit/images/IITback2.gif\">"); foreach $component (@lBuildServerComponents) { my($sComponentName, $sParams) = split(/\s*=>\s*/, $component, 2); PrintL("\nStarting ".$sComponentName." build ... \n\n", PL_SUBHEADER); $strBuildMsg = ""; #TODO: remove
my($bcComponent) = SetLocalGlobalsAndBegin($sComponentName, split(/\s+/, $sParams)); Append($sBuildResultsFile, $PROJROOT."\\logs\\".$sComponentName."msg.html"); $rc |= $bcComponent; if (!($bcComponent & BC_NOTHINGDONE) && ($rc & BC_NOTHINGDONE)) { $rc -= BC_NOTHINGDONE; } }
my($sResults) = "<b><font size=5 face=\"arial\">".$sBuildName." Results: <BR>" .BuildCodeToHTML($rc)."<BR><\/font><\/b>".GetAllTextFromFile($sBuildResultsFile); unlink($sBuildResultsFile); PrintToFile($sBuildResultsFile, $sResults); PrintToFile($sBuildResultsFile, "<BR><BR>\n".FormatLogAsHTML(GetSLMLog('-t '.GetDayRange(2))));
$sResults = GetAllTextFromFile($sBuildResultsFile);
my($sRecipients) = "";
if ($USERNAME eq "nlgbuild") # fix! { $sRecipients = join(" ", @lOfficialMailRecipients); } else { $sRecipients = join(" ", @lMailRecipients); }
SendHtmlMail($sRecipients, $sServerName." Results: ".HTMLToStr(BuildCodeToHTML($rc)), $sResults); return($rc); }
####################################################################################
# BeginBuild()
# performs many common tasks when beginning a build (opens the logs, handles many of the # passed argument options, sets up the variables, etc.) # call after SetLocalGlobalsAndBegin() and before EndBuild()
# a-jbilas, 03/20/99 - created
####################################################################################
sub BeginBuild { my($rc) = 1;
$strBuildMsg .= "<! ".$sShortBuildName." ".$nScriptStartTime." SUMMARY ENTRY POINT >\n";
# our way of doing set local (reset at EndBuild()) $sOldPath = $PATH; $sOldInclude = $INCLUDE; $sOldLib = $LIB;
if (!$bGlobalsSet) { PrintL("Globals not set\n", PL_BIGWARNING); }
my($startDir) = @_; shift(@_);
@lAllowedArgs = Union(*lAllowedArgs, *lAllowedBuilds); @lAllowedArgs = Union(*lAllowedArgs, *lAllowedModifiers); @lAllowedArgs = Union(*lAllowedArgs, *lAllowedComponents); @lAllowedArgs = Union(*lAllowedArgs, *lAllowedLanguages); BuildAcceleratorLists(); @lArgs = ParseArgs(@_);
####### change dir to build root PushD($startDir); ####### delete old build message and build log PrintL("Deleting old build logs ...\n\n");
EchoedUnlink($sMailfile, $sVarsLog, $sTyposLog, $sSyncLog, $sUpdateLog, $sBuildLog);
$fhBuildLog = OpenFile($sBuildLog, "write"); if (!$fhBuildLog) { PrintL("Could not open ".$sBuildLog.", logging for this session will be disabled\n\n", PL_BIGERROR); } else { $fhBuildLog->print(GetAllTextFromFile($sDHTMLIncFile)."\n\n<html>\n"); if (!$bDHTMLActive) { if ($strBuildMsg !~ /<! DHTML ACTIVATION SCRIPT >/) { PrintL("<! DHTML ACTIVATION SCRIPT >".GetAllTextFromFile($sDHTMLIncFile) ."<! END DHTML ACTIVATION SCRIPT >", PL_MSGONLY); } $bDHTMLActive = 1; } } ####### make list of build types needed @lBuilds = Intersect(*lAllowedBuilds, *lArgs); if (IsMemberOf("ALL", @lArgs)) { @lBuilds = @lAllowedBuilds; } if (IsMemberOf("SHIP", @lArgs)) { $bShipBuild = 1; if (@lBuilds == ()) { @lBuilds = @lAllowedBuilds; } }
####### set modifier flags if (IsMemberOf("VERBOSE", @lArgs)) { $DEBUG = 1; #TODO: change all refs to this flag to $bVerbose $bVerbose = 1; } if (IsMemberOf("BVT", @lArgs)) { $bBVT = 1; } if (IsMemberOf("NOCOPY", @lArgs)) { $bNoCopy = 1; }
if (IsMemberOf("MAIL", @lArgs)) { $bSendMail = 1; } if (IsMemberOf("HALT", @lArgs)) { $bDieOnError = 1; } if (@lBuilds == () && @lAllowedBuilds != ()) { PrintL("No buildtype selected, defaulting to ".$lAllowedBuilds[0]."\n\n", PL_NOLOG); @lBuilds = ($lAllowedBuilds[0], @lBuilds); }
@lModifiers = Intersect(*lAllowedModifiers, *lArgs);
if (IsMemberOf("ALLCOMP", @lModifiers)) { @lComponents = @lAllowedComponents; } else { @lComponents = Intersect(*lAllowedComponents, *lArgs); if (@lComponents == () && @lAllowedComponents != ()) { PrintL("No components chosen, defaulting to ".$lAllowedComponents[0]."\n\n", PL_NOLOG); push(@lComponents, $lAllowedComponents[0]); #defaults to first component in @lAllowedComponents } }
####### set build number (and official build) if (((lc($USERNAME) eq $sOfficialBuildAccount) || IsMemberOf("OFFICIAL", @lArgs)) && !IsMemberOf("TEST", @lArgs)) { if (defined($ENV{"BUILDNUM"}) && $ENV{"BUILDNUM"} > 0) { $sBuildNumber = $ENV{"BUILDNUM"}; } else { $sBuildNumber = GetBuildNumber($nBuildStartYear); $ENV{"BUILDNUM"} = $sBuildNumber; } @lMailRecipients = Union(*lOfficialMailRecipients, *lMailRecipients); $bOfficialBuild = 1; # 0000 is assumed to be unique build identifier $sDropDir =~ s/0000/$sBuildNumber/; #set the drop dir location for official build $sLogDropDir =~ s/0000/$sBuildNumber/; #set the drop dir location for official build $sRemoteBuildLog =~ s/0000/$sBuildNumber/; #set the log name for official build if (!$bNoCopy && !IsMemberOf("NONEWLOG", @lArgs)) { UpdateLogTOC($sRemoteTOC, $sBuildLog); } if (!IsMemberOf(@lArgs, "QUIET") && IsMemberOf(@lAllowedArgs, "QUIET")) { push(@lArgs, "QUIET"); } } else { $sBuildNumber = "0000"; $bOfficialBuild = 0; $sDropDir =~ s/$sRootDropDir/$sTestRootDropDir/; $sLogDropDir = $sLogDir; $sRemoteBuildLog = $sBuildLog; $sRootDropDir = $sTestRootDropDir; }
$ENV{"BUILDNUM"} = $sBuildNumber; #legacy script (ssrepl depends on this) TODO: remove OutputHeader($nLoggingMode);
####### resync
if (IsMemberOf("RESYNC", @lArgs)) { PrintL("Resyncing SLM Files ...\n\n", PL_LARGE | PL_BOLD); if ($bOfficialBuild) { GrabCookie('r'); } if (@lSyncDirs != ()) { foreach $dir (@lSyncDirs) { my($bRecurse) = 0; if ($dir =~ /^RECURSE:/) { $dir =~ s/^RECURSE://; $bRecurse = 1; }
PushD($dir); PrintL(" - Syncing ".$dir."\n", PL_BLUE | PL_BOLD); PrintToFile($sSyncLog, ("*" x 30)."\nSyncing ".$dir."\n\n"); ExecuteAndOutputToFile($cmdSync." -f".($bRecurse ? "r" : ""), $sSyncLog); PopD(); } } else { ExecuteAndOutputToFile($cmdSync." -rf", $sSyncLog); } PrintL("\n"); if ($bOfficialBuild) { FreeCookie(); } }
####### rebuild
if (IsMemberOf("REBUILD", @lArgs)) { if (@lCleanDirs != ()) { PrintL("Cleaning Up ...\n\n", PL_SUBHEADER); foreach $dir (@lCleanDirs) { DelAll($dir, 'RECURSE'); } PrintL("\n"); } else { # TODO: default behavior } }
if ($bVerbose) { DumpVars(); } # at this point we should be ready for build (or to delete files if rebuild, then build) # don't forget to EndBuild() or the starting directory will not returned to and ENV vars will not be restored
if (defined &BeginBuildCustom) { return(BeginBuildCustom() && $rc); } else { return($rc); } }
####################################################################################
# EndBuild()
# ends the building block (report status, cleanup activities, restore old system settings, etc.) # only useful when paired with BeginBuild()
# a-jbilas, 04/10/99 - created
####################################################################################
sub EndBuild #call upon build completion { if (defined &EndBuildCustom) { EndBuildCustom(); }
OutputFooter($nLoggingMode); CloseFile($fhBuildLog);
if ($nLoggingMode == 2) { InsertSummaryIntoLog($sBuildLog); }
$fhMailFile = OpenFile($sMailfile, "write"); if ($fhMailFile) { my($tmpBuildMsg) = $strBuildMsg; my($replStr) = "<BR><BR><b><font size=5>".$sBuildName." ".BuildCodeToHTML($bcStatus)."<\/b>". " - <a href=\"".TranslateToHTTP($sRemoteBuildLog)."\">Log<\/a><\/font><BR><BR>"; $strBuildMsg =~ s/<\! $sShortBuildName $nScriptStartTime SUMMARY ENTRY POINT >/$replStr/; $fhMailFile->print($strBuildMsg); CloseFile($fhMailFile); $strBuildMsg = $tmpBuildMsg; }
if ($bOfficialBuild && !$bNoCopy && ($sRemoteBuildLog ne "")) { if (!CopyLogs()) { PrintL("Warning: ".$sShortBuildName." log failed to copy\n", PL_MSGONLY); } }
if ($bSendMail) { my($sRecipients) = ""; foreach $member (@lMailRecipients) { if ($sRecipients eq "") { $sRecipients = $member; } else { $sRecipients .= " ".$member; } } if ($sRecipients ne "") { my($htmlresult) = '<font color="'.($bNothingDone ? 'gray">Nothing Done' : ($bBuildFailed ? 'red">Failed' : 'green">Successful')). ($bCopyFailed ? '</font> <font color=orange>(with copy failures)' : '').'</font>'; my($result) = $htmlresult; $result =~ s/<[^>]*>//g;
PrintL("\nComposing and Sending Build Mail ...\n\n");
# desperate attempt to fix incomplete e-mail bug my ($sMsgBody) = '<b><font size=5>'.$sBuildName.' '.$htmlresult.'  </font><font size=3>('; $sMsgBody .= FmtDeltaTime(time() - $nScriptStartTime).')</font><font size=5> - <a href="'; $sMsgBody .= TranslateToHTTP($sLogDropDir."\\".$sRemoteBuildLog).'">Log File</a></font></font><BR><BR></b>'; $sMsgBody .= "\n".$strBuildMsg.'<BR><BR><BR><BR>'; $sMsgBody .= FormatLogAsHTML(GetSLMLog('-t '.GetDayRange(1)));
SendHtmlMail($sRecipients, $sBuildName." Results: ".$result, $sMsgBody); } }
# if ($bColor) # { # system("color"); #restore old color # }
PrintL("\nExiting ...\n");
PopD(); $ENV{PATH} = $sOldPath; #restore old path $ENV{INCLUDE} = $sOldInclude; #restore old inc $ENV{LIB} = $sOldLib; $bGlobalsSet = 0;
if (!$bOfficialBuild && !IsMemberOf("QUIET", @lArgs) && !IsMemberOf("NONEWLOG", @lArgs)) { print(STDOUT "\n - Launching build log (use 'QUIET' option next time to skip)\n"); Execute($sBuildLog); print(STDOUT "\n"); } }
####################################################################################
# OutputHeader()
# outputs start build status info to log and screen # if caller is the rootbuild, status info will appear larger with more information
# a-jbilas, 04/20/99 - created
####################################################################################
sub OutputHeader { # NOTE: dhtml does not get activated in mode 0 or 1 if ($_[0] == 0) { } elsif ($_[0] == 1) { PrintL($sShortBuildName." started at ".GetLocalTime()."\n\n", PL_BOLD); } else { PrintL("<title>".$sBuildName.'</title><body '. ($bDHTMLActive ? 'onload="init()" ' : '').'bgproperties="FIXED" '. 'background="http://iit/images/IITback2.gif">'."\n", PL_NOSTD); PrintL("\n", PL_NOLOG); PrintL($sBuildName, PL_HEADER | PL_PURPLE); foreach $arg (@lArgs) { if ($arg !~ /__IGNORE/i) { my($desc) = GetKeyCaseInsensitive($arg, %hOptionDescription); $desc =~ s/^ *//; PrintLTip(" [".$arg."]", $desc, PL_GREEN | PL_BOLD); } } print($fhBuildLog "<\/font>"); PrintL("\n");
if ($bOfficialBuild) { PrintL("Build #".$sBuildNumber." *Official Build*", PL_HEADER | PL_GREEN); } else { PrintL("*Unofficial Build*", PL_HEADER); }
if (($USERNAME ne "") && ($COMPUTERNAME ne "")) { PrintL(" (user ", PL_HEADER | PL_GRAY); PrintL($USERNAME, PL_HEADER); PrintL(" on ", PL_HEADER | PL_GRAY); PrintL("\\\\".$COMPUTERNAME, PL_HEADER); PrintL(")", PL_HEADER | PL_GRAY); } PrintL("\n");
local($x, $sOSVer) = `ver`; #first line is blank
PrintL($PROCESSOR_ARCHITECTURE, PL_HEADER); PrintL(" running ", PL_HEADER | PL_GRAY); PrintL($sOSVer, PL_HEADER); PrintL("Start Time: ", PL_HEADER | PL_GRAY); PrintL(GetLocalTime()."\n\n", PL_HEADER);
PrintL("\n<! ".$sShortBuildName." ".$nScriptStartTime." SUMMARY ENTRY POINT >\n", PL_NOSTD | PL_FLUSH); } }
####################################################################################
# OutputFooter()
# outputs completed build status info to log and screen # if caller is the rootbuild, status info will appear larger with more information
# a-jbilas, 04/20/99 - created # a-jbilas, 06/29/99 - added 'nothing done' case
####################################################################################
sub OutputFooter { if ($_[0] == 0) { return(); } elsif ($_[0] == 1) { PrintL($sShortBuildName." ended at ".GetLocalTime()." with status: ".BuildCodeToHTML($bcStatus)."\n\n", PL_BOLD); } else { PrintL("\n".$sBuildName, PL_HEADER); foreach $arg (@lArgs) { PrintL(" [".$arg."]", PL_GREEN | PL_BOLD); } PrintL("\nEnded at ".GetLocalTime()." with status:\n", PL_HEADER); PrintL(BuildCodeToHTML($bcStatus)."\n", PL_HEADER | PL_FLUSH | PL_NOTAG);
PrintL("<\/body><\/html>", PL_NOSTD); } }
####################################################################################
# GetUsage()
# return a string with usage information based upon values in @lAllowedArgs
# a-jbilas, 04/10/99 - created # a-jbilas, 06/03/99 - moved descriptions into a hashing table for easier updates # a-jbilas, 06/09/99 - added accelerator support # a-jbilas, 08/16/99 - separated args into subsections
####################################################################################
sub GetUsage() { my($sUsage) = "\n"; local(@lKeys) = (); local(@lDesc) = (); foreach $elem (keys(%hOptionDescription)) { push(@lKeys, $elem); push(@lDesc, $hOptionDescription{$elem}); }
$sUsage .= "usage:\n"; $sUsage .= RemovePath($PROGRAM_NAME)." [args ...]\n\n"; if (@lDefaultArgs != ()) { $sUsage .= "DEFAULTS: ";
foreach $item (@lDefaultArgs) { $sUsage .= $item." "; } $sUsage .= "\n"; }
if (@lAllowedBuilds != ()) { $sUsage .= "\nBuild Arguments:\n"; foreach $arg (@lAllowedBuilds) { my($bFound) = 0; for ($index = 0 ; !$bFound && $index < scalar(@lKeys) ; ++$index) { if (uc($lKeys[$index]) eq uc($arg)) { $sUsage .= " ".$lKeys[$index]." ".$lDesc[$index]."\n"; $bFound = 1; } } } }
if (@lAllowedLanguages != ()) { $sUsage .= "\nLanguage Arguments:\n"; foreach $arg (@lAllowedLanguages) { my($bFound) = 0; for ($index = 0 ; !$bFound && $index < scalar(@lKeys) ; ++$index) { if (uc($lKeys[$index]) eq uc($arg)) { $sUsage .= " ".$lKeys[$index]." ".$lDesc[$index]."\n"; $bFound = 1; } } } } if (@lAllowedComponents != ()) { $sUsage .= "\nComponent Arguments:\n"; foreach $arg (@lAllowedComponents) { my($bFound) = 0; for ($index = 0 ; !$bFound && $index < scalar(@lKeys) ; ++$index) { if (uc($lKeys[$index]) eq uc($arg)) { $sUsage .= " ".$lKeys[$index]." ".$lDesc[$index]."\n"; $bFound = 1; } } } } if (@lAllowedModifiers != ()) { $sUsage .= "\nModifier Arguments:\n"; foreach $arg (@lAllowedModifiers) { my($bFound) = 0; for ($index = 0 ; !$bFound && $index < scalar(@lKeys) ; ++$index) { if (uc($lKeys[$index]) eq uc($arg)) { $sUsage .= " ".$lKeys[$index]." ".$lDesc[$index]."\n"; $bFound = 1; } } } } return($sUsage."\nTo save time, type only the capital letters of each ". "param on the left\n\n"); }
####################################################################################
# MatchShipBuilds()
# utility for build-specific buildtypes: # pass the buildtypes allowed in the specific build # function will return the command line specified buildtypes allowed for this build (intersection)
# a-jbilas, 04/20/99 - created # a-jbilas, 05/11/99 - will intersect args with @lBuilds only if $bShipBuild flagged, otherwise return @lBuilds
####################################################################################
sub MatchShipBuilds { local(@ret) = ();
if ($bShipBuild) { foreach $buildtype (@lBuilds) { if (IsMemberOf($buildtype, @_)) { push(@ret, $buildtype); } } return(@ret); } else { return(@lBuilds); } }
####################################################################################
# CheckTypos()
# runs the typo.pl script on the current directory and outputs it to $sTyposLog # if non-zero, the log is logged to the main log and output to the screen
# a-jbilas, 04/10/99 - created # a-jbilas, 09/20/99 - update filter to new typos.pl
####################################################################################
sub CheckTypos() { local($rc) = 1; if (IsMemberOf("TYPO", @lArgs)) { unlink($sTyposLog); PrintL("\nRunning typo check ... \n\n", PL_SUBHEADER); ExecuteAndOutputToFile("perl ".$sBinBatDir."\\typo.pl -optionfile:".$sBinBatDir."\\typo.cfg c", $sTyposLog); my($sErrs) = ""; my($fhTyposLog) = OpenFile($sTyposLog, "read"); while($fhTyposLog && !$fhTyposLog->eof()) { my($text) = $fhTyposLog->getline(); if ($text !~ /^\/\//) { $sErrs .= $text; } } CloseFile($fhTyposLog);
if ($sErrs ne "") { PrintL("Warning: Typo Errors", PL_BIGWARNING); PrintL("\n***********************************\n".$sErrs); PrintMsgBlock($sErrs); $rc = 0; } else { PrintL("No Typo Errors Found\n", PL_GREEN | PL_BOLD); } }
return($rc); }
####################################################################################
# GetCustomShipHash()
# Builds and returns a hash of the components (keys) and matching buildtypes found # in filename passed in argument (otherwise defaults to build.ini in cwd()) # returns 0 if file does not exist
# a-jbilas, 06/14/99 - created
####################################################################################
sub GetCustomShipHash { carp("Usage: GetCustomShipHash([configName]) ") unless((@_ == 0) || (@_ == 1));
my($sConfigFile) = @_; my(%hShipTypes) = (); if ($sConfigFile eq "") { $sConfigFile = cwd()."\\build.ini"; }
if (!-e $sConfigFile) { return(0); }
$fhConfigFile = OpenFile($sConfigFile, "read"); while (<$fhConfigFile>) { if (/^\#/) { # (skip comments) } elsif (/=/) { s/\s//g; chomp($_); s/^(.*)=(.*)$/$1 $2/; PrintL("Special condition found in $1: $2\n", PL_VERBOSE); $hShipTypes{lc($1)} = uc($2); } }
return(%hShipTypes); }
sub BuildDie { PrintL($_[0], PL_BIGERROR); EndBuild(); exit(1); }
$__IITBUILDPM = 1; 1;
|