# HG changeset patch # User arnaudl@UK-ARNAUDL # Date 1251296099 -3600 # Node ID 63fdf0583f67ed9c77afe26f32c036d9a9833dc0 # Parent cde2244c8ea666bb551aeda8d6d15c9bdb2f3d29 Brag script 1st draft by Arnaudl and DarioS diff -r cde2244c8ea6 -r 63fdf0583f67 common/tools/summary/brag_script.pl --- a/common/tools/summary/brag_script.pl Wed Aug 19 11:53:12 2009 +0100 +++ b/common/tools/summary/brag_script.pl Wed Aug 26 15:14:59 2009 +0100 @@ -8,12 +8,15 @@ # Symbian Foundation Ltd - initial contribution. # # Contributors: -# +# Arnaud Lenoir +# Dario Sestito # Description: # Generate build summary with BRAG status use Getopt::Long; +use strict; +# Data used for the script my $buildid = ''; my $basedir = ''; my $help = 0; @@ -23,33 +26,615 @@ 'help!' => \$help )); +#--------------------------------------------------------------------------------------- +# Files locations + +# Command to build a package build +# F:\Dev\mercurial_local\bootstrap>perl build_package.pl --subproj=3k/mw/serviceapi + +#brag_script.pl location +#F:\Dev\mercurial_local\pkgbuild\common\tools\summary +# my package log files directory is: F:\fbf_job\serviceapi_3k.T014\output\logs +# my platform log files directory is: F:\Dev\fbf_job\platform_MCL.PDK-101\output\logs + +# F:\fbf_job\serviceapi_3k.T014\output\logs +# console_bootstrap_d+.txt empty file +# console_sfbuildall_d+.txt empty file +# serviceapi_3k.T014_ant_env.log + +# F:\fbf_project\serviceapi\sf-config +# console_sfbuildall_32428.txt +# console_sfprep_32428.txt +# console_sfsummary_32428.txt + +# F:\Dev\fbf_job\platform_MCL.PDK-101\output\logs +# platform_MCL.PDK-101_ant_env.log +# in _ant_env.log +# Do a search for env.ANT_CMD_LINE_ARGS to find out the type of build done as armv5, winscw, ... + +#--------------------------------------------------------------------------------------- + + +# If no parameters entered or help selected, display help $help = 1 if (!$buildid or !$basedir); if ($help) { print "Generate build summary with BRAG status\n"; print "Usage: perl brag_script.pl --buildid=ID --basedir=DIR\n"; + print "Typical command line from script location: \n"; exit(0); } +# End section related to help +# Determine build number $buildid =~ /^([^_]*)_([^.]*)\./; my $project = $1; my $codeline = $2; +# Define variable logdir my $logdir = "$basedir\\$buildid\\output\\logs"; +# General data information +print "\$builid = $buildid\n"; +print "\$basedir = $basedir\n"; +print "\$logdir = $logdir\n"; +print "\$project = $project\n"; +print "\$codeline = $codeline\n"; + +open(BUILDSUMMARYHTML, ">$logdir\\build_summary.html"); # !!!!! First time we are accessing the file build_summary.html, therefore create it or replace it, AFTR THAT WE NEED TO APPEND IT ONLY!!!!! + +print BUILDSUMMARYHTML "#********** build_summary.html **********#


"; + +close(BUILDSUMMARYHTML); # Close file build_summary.html + +# ***************************************************************************** +# Construction "GENERAL STATUS" page in build_summary.html +# ***************************************************************************** + +# Fill html file with buildir data +open(BUILDSUMMARYHTML, ">>$logdir\\build_summary.html"); # Open build_summary.html in APPEND MODE! + +print BUILDSUMMARYHTML "
#************************************************#

"; +print BUILDSUMMARYHTML "
#********** GENERAL STATUS starts here **********#

"; +print BUILDSUMMARYHTML "buildid_val=$buildid
"; +print BUILDSUMMARYHTML "basedir_val=$basedir
"; +print BUILDSUMMARYHTML "logdir_val=$logdir
"; +print BUILDSUMMARYHTML "project_val=$project
"; +print BUILDSUMMARYHTML "codeline_val=$codeline
"; + +# Calculate the number of files in the directory opendir(DIR, $logdir); my @dir_content = readdir(DIR); close(DIR); -#my @asSimilarDirs = grep(/^$sBaseName(\.|$)/, @asDirs); +my $nbfilesinlogdir = scalar(@dir_content); +print BUILDSUMMARYHTML "nbfilesinlogdir_val=$nbfilesinlogdir
"; + +# Define what we tried to build (target, winscw, armv5, TOOLS2, platform, package, ...) +# Information in the file buildid_ant_env.log that can be found in the log directory + +# F:\Dev\fbf_job\platform_MCL.PDK-101\output\logs +# platform_MCL.PDK-101_ant_env.log +# in _ant_env.log +# Do a search for env.ANT_CMD_LINE_ARGS to find out the type of build done as armv5, winscw, ... + +# Declare any variable that will need to be used globaly otherwise can't be used only between the curly brackets! +my $antenvlog = ""; + +#print "$logdir\\$buildid\_ant\_env\.log\n"; # Test to find out that _ and . need backslash up front to work +my $antenvlogfile = "$logdir\\$buildid\_ant\_env\.log"; +print "$antenvlogfile\n"; +open (ANTENVLOG, "<$antenvlogfile"); +{ + local $/=undef; # Technic used to get a file in one unique string accessible via a variable + $antenvlog = ; +} +close(ANTENVLOG); # Close file $buildid_ant_env.log + +# List of data to extract from the file $buildid_ant_env.log +#Fri Aug 14 17:04:54 BST 2009 on the second line of the file +#base_release.getenv_options=-I tools +#bom.log=\\\\v800008\\Builds01\\SF_builds\\platform\\builds\\MCL\\platform_MCL.PDK-101/logs/platform_MCL.PDK-101_bom.xml +#build.family=platform or package ->DONE!! +#build.id=platform_MCL.PDK-101 ->1st thing done in this script!! +#build.name=platform or serviceapi ->DONE!! +#build.number=PDK-101 ->DONE!! +#build.version=MCL.PDK-101 ->DONE!! +#core.build.version=MCL ->DONE!! +#diamonds.host=v800002.ad-sfpd.intra ->DONE!! +#env.ANT_CMD_LINE_ARGS=-Dhelium.dir "C\:\\Symbian\\Tools\\PDT_1.0\\helium" sf-build -Dbuild.drive m\: -Dsf.spec.job.codeline MCL -Dsf.spec.job.number PDK-101 -Dsf.project.location f\:\\\\Dev\\maintools\\build\\config\\foundation -Dsf.spec.job.rootdir f\:\\\\Dev\\fbf_job -Dsf.spec.sbs.config winscw_udeb.whatlog -Dsf.spec.test.sendpkg.enable false +#env.COMPUTERNAME=UK-ARNAUDL ->DONE!! +#env.USERNAME=arnaudl ->DONE!! +#publish.dir=\\\\v800008\\Builds01\\SF_builds\\platform\\builds\\MCL\\platform_MCL.PDK-101 ->DONE!! +#sf.spec.sbs.config=winscw ->DONE!! +#sbs.config=armv5 ->DONE!! +#sf.spec.baseline.enable=true ->DONE!! +#sf.spec.baseline.getenv_options=-I tools +#sf.spec.bccheck.baseline.s60.version=5.1 ->DONE!! +#sf.spec.bccheck.enable=false ->DONE!! +#sf.spec.build.target=all ->DONE!! +#sf.spec.build.testcode.enable=false ->DONE!! +#sf.spec.job.codeline=MCL ->Information already available under another name +#sf.spec.job.number=PDK-101 ->Information already available under another name +#sf.spec.sourcesync.enable=true ->DONE!! +#sf.spec.test.epocroot=D\:\\ATS3\\winscw_smoketest +#sf.spec.test.host.name=v800005 ->DONE!! +#sf.spec.toolsbaseline.getenv_options=-i emu +#user.country=GB ->Any use???? + + +# Data extraction +# Type of Line to read is: "env.COMPUTERNAME=UK-ARNAUDL" with a end of line \\n character + +# env.COMPUTERNAME=UK-ARNAUDL +if ($antenvlog =~ /env\.COMPUTERNAME=([^=]*)\n/) +{ + print "Computer name is: $1\n"; + print BUILDSUMMARYHTML "computername_val=$1
"; +} +else +{ + print "Computer name is unknown\n"; + print BUILDSUMMARYHTML "computername_val=?
"; +} + +#env.USERNAME=arnaudl +if ($antenvlog =~ /env\.USERNAME=([^=]*)\n/) +{ + print "User name is: $1\n"; + print BUILDSUMMARYHTML "username_val=$1
"; +} +else +{ + print "user name is unknown\n"; + print BUILDSUMMARYHTML "username_val=?
"; +} + +#build.family=platform or package +if ($antenvlog =~ /build\.family=([^=]*)\n/) +{ + print "Build family is: $1\n"; + print BUILDSUMMARYHTML "buildfamily_val=$1
"; +} +else +{ + print "Build family is unknow\n"; + print BUILDSUMMARYHTML "buildfamily_val=?
"; +} + +#build.name=platform or serviceapi +if ($antenvlog =~ /build\.name=([^=]*)\n/) +{ + print "Build name is: $1\n"; + print BUILDSUMMARYHTML "buildname_val=$1
"; +} +else +{ + print "Build name is unknow\n"; + print BUILDSUMMARYHTML "buildname_val=?
"; +} + +#diamonds.host=v800002.ad-sfpd.intra - Define the server used +if ($antenvlog =~ /diamonds\.host=([^=]*)\n/) +{ + print "Build server used is: $1\n"; + print BUILDSUMMARYHTML "buildserver_val=$1
"; +} +else +{ + print "Build server used is unknown\n"; + print BUILDSUMMARYHTML "buildserver_val=?
"; +} -my $nfiles = scalar(@dir_content); +#build.version=MCL.PDK-101 +if ($antenvlog =~ /build\.version=([^=]*)\n/) +{ + print "Build version is: $1\n"; + print BUILDSUMMARYHTML "buildversion_val=$1
"; +} +else +{ + print "Build version is unknown\n"; + print BUILDSUMMARYHTML "buildversion_val=?
"; +} + +#build.number=PDK-101 +if ($antenvlog =~ /build\.number=([^=]*)\n/) +{ + print "Build number is: $1\n"; + print BUILDSUMMARYHTML "buildnumber_val=$1
"; +} +else +{ + print "Build number is unknown\n"; + print BUILDSUMMARYHTML "buildnumber_val=?
"; +} + +#core.build.version=MCL +if ($antenvlog =~ /core\.build\.version=([^=]*)\n/) +{ + print "Core build version is: $1\n"; + print BUILDSUMMARYHTML "corebuildversion_val=$1
"; +} +else +{ + print "Core build version is unknown\n"; + print BUILDSUMMARYHTML "corebuildversion_val=?
"; +} + +#publish.dir=\\\\v800008\\Builds01\\SF_builds\\platform\\builds\\MCL\\platform_MCL.PDK-101 +if ($antenvlog =~ /publish\.dir=([^=]*)\n/) +{ + print "Publish directory is: $1\n"; + print BUILDSUMMARYHTML "publishdir_val=$1
"; +} +else +{ + print "Publish directory is unknown\n"; + print BUILDSUMMARYHTML "publishdir_val=?
"; +} + +#sf.spec.baseline.enable=true +if ($antenvlog =~ /sf\.spec\.baseline\.enable=([^=]*)\n/) +{ + print "Baseline retrieval enabled?:: $1\n"; + print BUILDSUMMARYHTML "baselineretrievalen_val=$1
"; +} +else +{ + print "Baseline retrieval status is unknown\n"; + print BUILDSUMMARYHTML "baselineretrievalen_val=?
"; +} + +#sf.spec.sourcesync.enable=true +if ($antenvlog =~ /sf\.spec\.sourcesync\.enable=([^=]*)\n/) +{ + print "Source code sync enabled?: $1\n"; + print BUILDSUMMARYHTML "sourcecodesyncen_val=$1
"; +} +else +{ + print "Source code sync status is unknown\n"; + print BUILDSUMMARYHTML "sourcecodesyncen_val=?
"; +} + +#sf.spec.build.testcode.enable=false +# Smoke tests????? SALT tests???? +if ($antenvlog =~ /sf\.spec\.build\.testcode\.enable=([^=]*)\n/) +{ + print "Tests execution enabled?: $1\n"; + print BUILDSUMMARYHTML "testexecutionen_val=$1
"; +} +else +{ + print "Tests execution status is unknown\n"; + print BUILDSUMMARYHTML "testexecutionen_val=?
"; +} + +#sf.spec.test.host.name=v800005 +if ($antenvlog =~ /sf\.spec\.test\.host\.name=([^=]*)\n/) +{ + print "Tests host server is: $1\n"; + print BUILDSUMMARYHTML "testhostserver_val=$1
"; +} +else +{ + print "Tests host server is unknown\n"; + print BUILDSUMMARYHTML "testhostserver_val=?
"; +} + +#sf.spec.bccheck.enable=false +if ($antenvlog =~ /sf\.spec\.bccheck\.enable=([^=]*)\n/) +{ + print "BCC check enabled?: $1\n"; + print BUILDSUMMARYHTML "bccchecken_val=$1
"; +} +else +{ + print "BCC check status is unknown\n"; + print BUILDSUMMARYHTML "bccchecken_val=?
"; +} + +#sf.spec.bccheck.baseline.s60.version=5.1 +if ($antenvlog =~ /sf\.spec\.bccheck\.baseline\.s60\.version=([^=]*)\n/) +{ + print "BCC check S60 baseline version used is: $1\n"; + print BUILDSUMMARYHTML "bccchecks60baselinever_val=$1
"; +} +else +{ + print "BCC check S60 baseline version used is unknown\n"; + print BUILDSUMMARYHTML "bccchecks60baselinever_val=?
"; +} -open(FILE, ">$logdir\\build_summary.html"); -print FILE "build summary
build id: $buildid
log files: $nfiles"; -close(FILE); +#sbs.config=armv5 possible values are armv5 (default) and winscw +if ($antenvlog =~ /sbs\.config=([^=]*)\n/) +{ + print "SBS config is: $1\n"; + print BUILDSUMMARYHTML "sbsconfig_val=$1
"; +} +else +{ + print "SBS config is unknown\n"; + print BUILDSUMMARYHTML "sbsconfig_val=?
"; +} + +#sf.spec.sbs.config=winscw +if ($antenvlog =~ /sf\.spec\.sbs\.config=([^=]*)\n/) +{ + print "Specific SBS config is: $1\n"; + print BUILDSUMMARYHTML "specsbsconfig_val=$1
"; +} +else +{ + print "Specific SBS config is unknown\n"; + print BUILDSUMMARYHTML "specsbsconfig_val=?
"; +} + +#sf.spec.build.target=all +if ($antenvlog =~ /sf\.spec\.build\.target=([^=]*)\n/) +{ + print "specific build target is: $1\n"; + print BUILDSUMMARYHTML "specificbuildtarget_val=$1
"; +} +else +{ + print "specific build target is: unknown\n"; + print BUILDSUMMARYHTML "specificbuildtarget_val=?
"; +} + +# Extract data to define the type build done +# Find out what is expected to be done and what has been actually done. +# name="WINS" abldTarget="wins" description="MSVC Compiler" +# name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler" +# name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler" +# name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler" +# name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler" +# name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler" +# name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools" +# name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only" +# name="TOOLS2" abldTarget="tools2" description="MinGW GCC Compiler for Tools" +# name="TOOLS2_REL" abldTarget="tools2 rel" description="MinGW GCC Compiler for Tools Release mode only" +# name="ARMV5" abldTarget="armv5" description="RVCT Compiler" +# name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler" +# name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler" + + +#------------- +# End data extraction from the file $buildid_ant_env.log +#------------- + +print BUILDSUMMARYHTML "
#********** GENERAL STATUS ends here **********#

"; + +close(BUILDSUMMARYHTML); # Close file build_summary.html + +# ***************************************************************************** +# Construction "SUMMARISE" page in build_summary.html +# ***************************************************************************** + +# Build info - Describe the completion of the diffrent steps in the build process + +# Fill html file with buildir data +open(BUILDSUMMARYHTML, ">>$logdir\\build_summary.html"); # Open build_summary.html in APPEND MODE! + +# Indicates beginning of the SUMMARISE section in the file +print BUILDSUMMARYHTML "
#*******************************************#

"; +print BUILDSUMMARYHTML "
#********** SUMMARISE starts here **********#

"; + +#{ # Used for local $/=undef +#local $/=undef; # indicates that the file will be put in one variable as one string +# +## Find the string "BUILD SUCCESSFUL" in the file console_bootstrap_\d+\.txt +## 1st open file +#open (CONSOLEBOOTSTRAP, "<$logdir\\console_bootstrap_\d+\.txt"); +# +#my $searchconsolebootstrap= ; # Copy the full file in one string because of /$=undef +# +#if ($searchconsolebootstrap =~ /BUILD SUCCESSFUL/){ +# print "Found string BUILD SUCCESSFUL\n"; +# print BUILDSUMMARYHTML "BuildSuccessful_val=Yes
"; +# } +# else { +# print "Can't Find string BUILD SUCCESSFUL\n"; +# print BUILDSUMMARYHTML "BuildSuccessful_val=No
"; +# } +# +#close (CONSOLEBOOTSTRAP); # Close file console_bootstrap_\d+\.txt +## End - Find the string "BUILD SUCCESSFUL" in the file console_bootstrap_\d+\.txt +# +## Check all the intermediate steps of the build process +## 1st open file console_sfbuildall_\d+\.txt +#open (CONSOLESFBUILDALL, "<$logdir\\console_sfbuildall_\d+\.txt"); +# +#my $searchconsolesfbuildall= ; # Copy the full file in one string because of /$=undef +# +#if ($searchconsolesfbuildall =~ /x/){ +# print "Found string x\n"; +# print BUILDSUMMARYHTML "x=Yes
"; +# } +# else { +# print "Can't Find string x\n"; +# print BUILDSUMMARYHTML "x=No
"; +# } +# +#close (CONSOLESFBUILDALL); # Close file console_sfbuildall_\d+\.txt +#} # End use for local $/=undef + +# Declare any variable that will need to be used globaly otherwise can't be used only between the curly brackets! +my $targettimeslog = ""; + +{ # Used for local $/=undef +local $/=undef; # indicates that the file will be put in one variable as one string + +# The file targetTimesLog.csv contains all the information relative to the build process including time needed for each steps (generated by helium script) +# This file is available whatever the build we want to do (platform or package) +my $targettimeslogfile = "$logdir\\targetTimesLog\.csv"; +print "$targettimeslogfile\n"; +open (TARGETTIMESLOG, "<$targettimeslogfile"); +{ + local $/=undef; # Technic used to get a file in one unique string accessible via a variable + $targettimeslog = ; +} +close (TARGETTIMESLOG); # Close file targetTimesLog.csv +} # End use for local $/=undef + +# Extract useful data from the file targettimeslog.csv +# step, time in second to do the operation +# For sure +#"^preparation-getenv:$" - the baseline retrieval starts +#preparation-getenv,1417 +if ($targettimeslog =~ /(preparation-getenv[^,]*),(\d+[^,]*)\n/) +{ + print "Baseline retrieval started: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "baselineretrievalstarted_val=yes
baselineretrievalstarted_duration=$2
"; +} +else +{ + print "Baseline retrieval started: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "baselineretrievalstarted_val=no
baselineretrievalstarted_duration=?
"; +} + +#"^\s+[exec] .+: done fetching environment$" - the baseline retrieval ends +#???? + +#"^sf-prebuild-0:$" - the source code sync starts +#sf-prebuild-0,363 +if ($targettimeslog =~ /(sf-prebuild[^,]*),(\d+[^,]*)\n/) +{ + print "Source code sync started: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "sourcecodestarted_val=yes
sourcecodestarted_duration=$2
"; +} +else +{ + print "Source code sync started: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "sourcecodestarted_val=no
sourcecodestarted_duration=?
"; +} + +#"^sf-unpack-rnd:$" - source code sync ends +#sf-unpack-rnd,20 +if ($targettimeslog =~ /(sf-unpack[^,]*),(\d+[^,]*)\n/) +{ + print "Source code sync ended: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "sourcecodeended_val=yes
sourcecodeended_duration=$2
"; +} +else +{ + print "Source code sync ended: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "sourcecodeended_val=no
sourcecodeended_duration=?
"; +} + +#"^sf-compile:$" - compilation starts +#sf-compile,3 +if ($targettimeslog =~ /(sf-compile[^,]*),(\d+[^,]*)\n/) +{ + print "Compilation startd: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "commpilationstarted_val=yes
commpilationstarted_duration=$2
"; +} +else +{ + print "Compilation startd: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "commpilationstarted_val=no
commpilationstarted_duration=?
"; +} + +#"^sf-postbuild:$" - compilation ends +#sf-postbuild,0 +if ($targettimeslog =~ /(sf-postbuild[^,]*),(\d+[^,]*)\n/) +{ + print "Compilation ended: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "compilationended_val=yes
compilationended_duration=$2
"; +} +else +{ + print "Compilation ended: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "compilationended_val=no
compilationended_duration=?
"; +} + +#"^sf-run-analysis:$" - analysis starts +#sf-run-analysis-raptor,1 +if ($targettimeslog =~ /(sf-run-analysis-raptor[^,]*),(\d+[^,]*)\n/) +{ + print "Analysis started: OK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "analysisstarted_val=yes
analysisstarted_duration=$2
"; +} +else +{ + print "Analysis started: NOK \$1= $1, \$2= $2\n"; + print BUILDSUMMARYHTML "analysisstarted_val=no
analysisstarted_duration=?
"; +} + +# Maybe???????? + +#"^sf-zip-logs:$" - analysis ends +#sf-zip-content,8 +#????? + + +#"^publish:$" - publication starts +#???? + +#"\[copy\] Copying \d+ files to \\\\v800008\\Builds01\\SF_builds\\" - publication ends +#???? + +#BRAG +#sf-summary,5 +#????? + +# End - Check all the intermediate steps of the build process + + +# Indicates end of the SUMMARISE section in the file +print BUILDSUMMARYHTML "
#********** SUMMARISE ends here **********#

"; + +close(BUILDSUMMARYHTML); # Close build_summary.html + + +# End - Build info - Describe the completion of the diffrent steps in the build process + + +# ***************************************************************************** +# Construction "DATA BREAKDOWN" page in build_summary.html +# ***************************************************************************** + +# Hyperlink to log files +open(BUILDSUMMARYHTML, ">>$logdir\\build_summary.html"); # Open build_summary.html in APPEND MODE! + +# Indicates beginning of DATA BREAKDOWN section in the file +print BUILDSUMMARYHTML "
#************************************************#

"; +print BUILDSUMMARYHTML "
#********** DATA BREAKDOWN starts here **********#

"; + + +# Get tree for the directory where the log files are (bishare probably the best place???) +# Should be already exported there, but maybe in a zip file) +# Extract each file with directory, then create a hyperlink to that file to make sure that user can click on the link and open the file! + + +#ex: platform_MCL.PDK-101_summary.log.xml +#######print FILE "buildid_summary.log.xml=$buildid_summary.log.xml
"; + +# example of html hyperlink +#
Scan for S60 distribution policy files (1162)
+#SBS: Error (4)
+#Total (1)
+#WINSCW ( EMULATOR ) + +# All log files hyperlink have been created, close build_summary.html + + +# Indicates end of DATA BREAKDOWN section in the file +print BUILDSUMMARYHTML "
#********** DATA BREAKDOWN ends here **********#

"; +print BUILDSUMMARYHTML "
#********** summary_build.html ends here ******#

"; + +close(BUILDSUMMARYHTML); # Close file build_summary.html + + + +# ***************************************************************************** +# Final step, copy build_summary.html to \\bishare drive +# ***************************************************************************** + +# Copy html file to bishare my $copy_cmd = "copy $logdir\\build_summary.html \\\\bishare\\sf_builds\\$project\\builds\\$codeline\\$buildid"; print "Exec: $copy_cmd\n"; system($copy_cmd);