//
// $Id: summary.js 550991 2007-06-26 23:58:07Z sebor $
//
//////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed
// with this work for additional information regarding copyright
// ownership. The ASF licenses this file to you under the Apache
// License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
//
//////////////////////////////////////////////////////////////////////
// BuildLog.htm file constants
var cmdLineTag = "Command Lines";
var outputTag = "Output Window";
var summaryTag = "Results";
var errorsTag = "error(s)";
var warningsTag = "warning(s)";
var compilingTag = "Compiling...";
var linkingTag = "Linking...";
var hdrLibrary = "Library Summary";
var hdrTestDriver = "Test Driver Summary";
var hdrExamples = "Example Summary";
var hdrTests = "Test Summary";
////////////////////////////////////////////////////////////////////
// read BuildLog.htm
function readBuildLog(exeDir, itemInfo, useUnicode)
{
if (! fso.FolderExists(exeDir))
return;
var blogDir = exeDir + "\\" + itemInfo.name;
if (! fso.FolderExists(blogDir))
return;
var blogFilePath = blogDir + "\\" + buildlogFile;
if (! fso.FileExists(blogFilePath))
return;
var uniMode = (true == useUnicode) ? -1 : 0;
var blogFile;
try
{
blogFile = fso.OpenTextFile(blogFilePath, 1, false, uniMode);
}
catch (e)
{
WScript.Echo("Cannot open file: " + blogFilePath);
return;
}
var blogData = blogFile.AtEndOfStream ? "" : blogFile.ReadAll();
var posTmp = getCommandLinesInfo(itemInfo, blogData, 0);
posTmp = getCompilationInfo(itemInfo, blogData, posTmp);
posTmp = getBuildSummaryInfo(itemInfo, blogData, posTmp);
}
// BuildLog.htm parsing methods
function getCommandLinesInfo(itemInfo, blogData, posStart)
{
//lookup for the command lines block
var posCmdLines = blogData.indexOf(cmdLineTag, posStart);
if (-1 == posCmdLines)
return posStart;
// extract table in the command lines block
itemInfo.buildCmdLog = extractTableData(blogData, posCmdLines);
return posStart + itemInfo.buildCmdLog.length;
}
function getCompilationInfo(itemInfo, blogData, posStart)
{
//lookup for the output block
var posCmplInfo = blogData.indexOf(outputTag, posStart);
if (-1 == posCmplInfo)
return posStart;
// extract table in the output block
itemInfo.buildOutLog = extractTableData(blogData, posCmplInfo);
return posStart + itemInfo.buildOutLog.length;
}
function getBuildSummaryInfo(itemInfo, blogData, posStart)
{
//lookup for the results block
var posResInfo = blogData.indexOf(summaryTag, posStart);
if (-1 == posResInfo)
return posStart;
// extract table in the results block
var summaryData = extractTableData(blogData, posResInfo);
// skip first line in the summary as not needed at all
var posPrjName = summaryData.indexOf(buildlogFile);
var posPrjTmp = posPrjName;
posPrjName = summaryData.indexOf(String.fromCharCode(10), posPrjTmp);
if (-1 == posPrjName)
{
posPrjName = summaryData.indexOf("\r\n", posPrjTmp);
if (-1 == posPrjName)
return posStart + summaryData.length;
}
var prjSummary = summaryData.substr(posPrjName);
// we not needed in tags, so remove them
var tagIdx = prjSummary.indexOf("<");
itemInfo.buildOutLog += "\r\n" + prjSummary.substr(0, tagIdx);
// parse project summary and get number of errors and warnings
var rgSum = prjSummary.split(" ");
itemInfo.errorsCnt = rgSum[2];
itemInfo.warningsCnt = rgSum[4];
// check what kind of errors we have
if (itemInfo.errorsCnt != "0")
{
var posLinking = itemInfo.buildOutLog.indexOf(linkingTag);
if (posLinking != -1)
itemInfo.linkerErrors = true;
}
return posStart + summaryData.length;
}
function extractTextBlockData(blogData, posTextBlock)
{
var nextTableBlock = blogData.indexOf("
0)
{
textData =
blogData.substr(posTextBlock, nextTableBlock - posTextBlock);
}
else
{
textData = blogData.substr(posTextBlock);
}
var posPreTag = textData.indexOf("";
return textData;
}
function extractTableData(blogData, posStart)
{
var posMainTable = blogData.indexOf("", posStart);
if (-1 != posFirstCloseTable && posMainTable - posFirstCloseTable > 20)
return extractTextBlockData(blogData, posFirstCloseTable + 8);
// lookup for the main table close tag
var posCloseTag = posMainTable;
var posOpenTag = posMainTable;
while (true)
{
posCloseTag = blogData.indexOf("
", posCloseTag + 5);
if (-1 == posCloseTag) // no close tag?
break;
posOpenTag = blogData.indexOf(" 0)
tableData = blogData.substr(posMainTable, tableDataLen);
else
tableData = blogData.substr(posMainTable);
// visual studio doesn't provide last table row close tags
// add them here
var indexClose = tableData.lastIndexOf("
");
tableData = tableData.substr(0, indexClose) + "
";
return tableData;
}
////////////////////////////////////////////////////////////////////
// get differences method
function getDifferencesInfo(itemInfo)
{
var diffs = getWinDiffDifferences(itemInfo.runOutput,
itemInfo.runReqOutput, "ILFRGX");
// replace first line
var endLine = String.fromCharCode(13) + String.fromCharCode(10);
var pos = diffs.indexOf(endLine);
if (-1 == pos)
{
itemInfo.runDiff = diffs;
return;
}
itemInfo.runDiff = "Differences between real output and required: ";
itemInfo.runDiff += diffs.substr(pos);
//WScript.Echo(itemInfo.runDiff);
}
///////////////////////////////////////////////////////////////////////
// save methods
function saveBuildSummary(itemInfo, fileSummary)
{
var failed = (itemInfo.exitCode != 0 || itemInfo.errorsCnt != "0")
? true : false;
if (failed == true)
fileSummary.WriteLine("");
else
fileSummary.WriteLine("
");
var someCol = "| ";
var lastCol =
" | ";
fileSummary.Write(someCol);
fileSummary.Write("");
fileSummary.WriteLine(itemInfo.name + " | ");
if (itemInfo.errorsCnt != "0")
{
fileSummary.WriteLine(someCol + "Build Failed" + "");
}
else
{
if (failed == true)
{
fileSummary.WriteLine(someCol + "Exited with code " +
itemInfo.exitCode + "");
}
else
{
fileSummary.WriteLine(someCol + "Succeeded" + "");
}
}
if (failed == false)
{
if (itemInfo.runDiff != "")
fileSummary.WriteLine(someCol + "Difference" + "");
else
fileSummary.WriteLine(someCol + "Equal" + "");
}
else
{
fileSummary.WriteLine(someCol + " " + "");
}
fileSummary.WriteLine(lastCol + itemInfo.warningsCnt + "");
fileSummary.WriteLine("
");
}
function saveBuildInfo(itemInfo, infoDir, infoExt)
{
var outfileName = infoDir + "\\" + itemInfo.name + "." + infoExt;
var outFile = fso.CreateTextFile(outfileName);
saveBuildInfoTable(outFile, itemInfo, hdrExamples, false);
outFile.Close();
}
function saveBuildInfoTable(outFile, itemInfo, linkSummary, bLib)
{
outFile.WriteLine("");
outFile.Write("| ");
outFile.Write("" +
itemInfo.name + "");
outFile.WriteLine(" (" +
linkSummary.toLowerCase() +
") (top) |
");
saveBuildInfoBlock(outFile, "Build Command Lines",
itemInfo.buildCmdLog, false);
saveBuildInfoBlock(outFile, "Build Output",
itemInfo.buildOutLog, false);
if (false == bLib)
{
if (itemInfo.runOutput == "" && itemInfo.exitCode != 0)
itemInfo.runOutput = "Exited with code " + itemInfo.exitCode;
saveBuildInfoBlock(outFile, "Executable Output",
encodeHTML(itemInfo.runOutput), true);
}
if (itemInfo.runDiff != "")
{
saveBuildInfoBlock(outFile, "Differences",
encodeHTML(itemInfo.runDiff), true);
}
outFile.WriteLine("
");
}
function saveBuildInfoBlock(outFile, blockName, blockData, needPre)
{
// header
outFile.Write("| ");
outFile.Write(blockName);
outFile.WriteLine(" |
");
// data
outFile.WriteLine("");
outFile.WriteLine(" ");
outFile.WriteLine(" ");
if (needPre == true)
outFile.WriteLine("");
outFile.WriteLine(blockData);
if (needPre == true)
outFile.WriteLine("");
outFile.WriteLine(" | ");
outFile.WriteLine(" ");
outFile.WriteLine(" |
");
}
//////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////
function makeLinkFromString(linkString)
{
var srcS = " ";
var destS = "-";
var reRep = new RegExp(srcS, "mg");
var res = linkString.replace(reRep, destS);
res = res.toLowerCase();
return res;
}
function getSummaryLogPath(buildDir, buildSummaryPrefix, buildType)
{
var outDir = buildDir;
return outDir + "\\" + buildSummaryPrefix + buildType + ".html";
}
function makeSummaryLog(buildDir, buildSummaryPrefix, buildType)
{
var outDir = buildDir;
if (! fso.FolderExists(outDir))
fso.CreateFolder(outDir);
var oFolder = fso.GetFolder(outDir);
var sumFileName = buildSummaryPrefix + buildType + ".html";
var fSum = oFolder.CreateTextFile(sumFileName);
fSum.WriteLine("");
fSum.WriteLine(" \
");
fSum.WriteLine("" + buildType + "
");
fSum.WriteLine("");
fSum.WriteLine("
");
return fSum;
}
function saveSummaryHeaderLib(fSum, libInfo, hdrLibrary)
{
fSum.WriteLine("" + hdrLibrary + "");
fSum.WriteLine("");
// save header row
fSum.WriteLine("");
fSum.WriteLine(
"| Library | ");
fSum.WriteLine(
"State | ");
fSum.WriteLine(
"\
Warnings | ");
fSum.WriteLine("
");
// save library header
if (libInfo.errorsCnt == "0")
fSum.WriteLine("");
else
fSum.WriteLine("
");
fSum.WriteLine(
"| "
+ "" + libInfo.name + " | ");
fSum.Write("");
if (libInfo.errorsCnt == "0")
fSum.Write("OK");
else
fSum.Write("Failed");
fSum.WriteLine(" | ");
fSum.WriteLine("" +
libInfo.warningsCnt + " | ");
fSum.WriteLine("
");
fSum.WriteLine("
");
fSum.WriteLine("
");
}
function saveSummaryHeaderTestDriver(fSum, rwtestInfo, hdrDriver)
{
fSum.WriteLine("" + hdrDriver + "");
fSum.WriteLine("");
// save header row
fSum.WriteLine("");
fSum.WriteLine("| \
Test Driver | ");
fSum.WriteLine(
"State | ");
fSum.WriteLine(
"\
Warnings | ");
fSum.WriteLine("
");
// save test driver header
if (rwtestInfo.errorsCnt == "0")
fSum.WriteLine("");
else
fSum.WriteLine("
");
fSum.WriteLine(
"| " +
"" +
rwtestInfo.name + " | ");
fSum.Write(
"");
if (rwtestInfo.errorsCnt == "0")
fSum.Write("OK");
else
fSum.Write("Failed");
fSum.WriteLine(" | ");
fSum.WriteLine("" +
rwtestInfo.warningsCnt + " | ");
fSum.WriteLine("
");
fSum.WriteLine("
");
fSum.WriteLine("
");
}
function saveSummaryHeaderMulti(fSum, exsDir, buildType, hdrExamples)
{
fSum.WriteLine("" + hdrExamples + "");
fSum.WriteLine("");
// save header row
fSum.WriteLine("");
fSum.WriteLine("| Example | ");
fSum.WriteLine("State | ");
fSum.WriteLine("\
Comparision | ");
fSum.WriteLine("Warnings | ");
fSum.WriteLine("
");
// load information from local summary file
// and save it to general summary
var lsumFileName = exsDir + "\\" + summaryFileName;
if (fso.FileExists(lsumFileName))
{
var fileLSum = fso.OpenTextFile(lsumFileName);
if (!fileLSum.AtEndOfStream)
{
var lsumData = fileLSum.ReadAll();
fSum.Write(lsumData);
}
fileLSum.Close();
}
fSum.WriteLine("
");
fSum.WriteLine("
");
}
function saveBuildSummarySingle(fSum, libInfo, hdrLibrary)
{
saveBuildInfoTable(fSum, libInfo, hdrLibrary, true);
fSum.WriteLine("
");
}
function saveBuildSummaryMulti(fSum, htmDir)
{
if (!fso.FolderExists(htmDir))
return;
var htmFolder = fso.GetFolder(htmDir);
var enumHtmSubFolders = new Enumerator(htmFolder.SubFolders);
for (; !enumHtmSubFolders.atEnd(); enumHtmSubFolders.moveNext())
{
var htmFName = enumHtmSubFolders.item().Name;
saveBuildSummariesFromFolder(fSum,
enumHtmSubFolders.item().Path, htmFolderName);
saveBuildSummaryMulti(fSum, htmDir + "\\" + htmFName);
}
}
function saveBuildSummariesFromFolder(fSum, testFolder, htmFName)
{
var htmFldName = testFolder + "\\" + htmFName;
if (!fso.FolderExists(htmFldName))
return;
var htmFld = fso.GetFolder(htmFldName);
var rx = new RegExp("^.+\\.(?:htm)$", "i");
var enumHtmFiles = new Enumerator(htmFld.Files);
for (; !enumHtmFiles.atEnd(); enumHtmFiles.moveNext())
{
var htmFileName = enumHtmFiles.item().Name;
if (! rx.test(htmFileName))
continue;
var htmFile = fso.OpenTextFile(htmFldName + "\\" + htmFileName);
var htmData = htmFile.ReadAll();
fSum.Write(htmData);
fSum.WriteLine("
");
}
}
function closeSummaryLog(fSum)
{
fSum.WriteLine("");
fSum.Close();
}
////////////////////////////////////////////////////////////////////////////
function checkForFailures(testDir, bType, logHtm, sumHtm, htmTempDir,
seeHtm, useUnicode)
{
if (!fso.FolderExists(testDir))
return;
var testFolder = fso.GetFolder(testDir);
var seeHtmHere = seeHtm;
if (false == seeHtmHere && testFolder.Name == bType)
seeHtmHere = true;
var enumHtmSubFolders = new Enumerator(testFolder.SubFolders);
for (; !enumHtmSubFolders.atEnd(); enumHtmSubFolders.moveNext())
{
var htmFName = enumHtmSubFolders.item().Name;
checkForFailures(testDir + "\\" + htmFName, bType,
logHtm, sumHtm, htmTempDir, seeHtmHere, useUnicode);
}
if (false == seeHtmHere)
return;
var rx = new RegExp("^.+\\.(?:htm)$", "i");
var enumHtmFiles = new Enumerator(testFolder.Files);
for (; !enumHtmFiles.atEnd(); enumHtmFiles.moveNext())
{
var htmFileName = enumHtmFiles.item().Name;
if (! rx.test(htmFileName))
continue;
if (htmFileName != logHtm)
continue;
var testInfo = new ItemBuildInfo(testFolder.Name);
var uniMode = (true == useUnicode) ? -1 : 0;
var blogFile =
fso.OpenTextFile(testFolder.Path + "\\" + htmFileName,
1, false, uniMode);
var blogData = blogFile.AtEndOfStream ? "" : blogFile.ReadAll();
var posTmp = getCommandLinesInfo(testInfo, blogData, 0);
posTmp = getCompilationInfo(testInfo, blogData, posTmp);
posTmp = getBuildSummaryInfo(testInfo, blogData, posTmp);
if (testInfo.errorsCnt != "0")
saveBuildFailure(testFolder.Path, testInfo, sumHtm, htmTempDir);
}
}
function saveBuildFailure(testDir, testInfo, sumHtm, htmTempDir)
{
var htmTempPath = getParentFolder(testDir) + "\\" + htmTempDir;
if (! fso.FolderExists(htmTempPath))
fso.CreateFolder(htmTempPath);
saveBuildInfo(testInfo, htmTempPath, "htm");
var sumTempFile;
if (fso.FileExists(sumHtm))
{
sumTempFile = fso.OpenTextFile(sumHtm, 8);
}
else
{
WScript.Echo("Path " + sumHtm + " not found");
return;
}
saveBuildSummary(testInfo, sumTempFile);
sumTempFile.Close();
}