// // $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(""); 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("
"); outFile.Write("" + itemInfo.name + ""); outFile.WriteLine(" (" + linkSummary.toLowerCase() + ") (top)
"); } function saveBuildInfoBlock(outFile, blockName, blockData, needPre) { // header outFile.Write(""); outFile.Write(blockName); outFile.WriteLine(""); // data outFile.WriteLine(""); outFile.WriteLine(" "); outFile.WriteLine(""); outFile.WriteLine("
"); if (needPre == true) outFile.WriteLine("
");
        
    outFile.WriteLine(blockData);
    
    if (needPre == true)
        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(""); fSum.WriteLine("
"); fSum.WriteLine("" + hdrLibrary + " : "); fSum.WriteLine("" + hdrTestDriver + " : "); fSum.WriteLine("" + hdrExamples + " : "); fSum.WriteLine("" + hdrTests + ""); fSum.WriteLine("
"); fSum.WriteLine("
"); return fSum; } function saveSummaryHeaderLib(fSum, libInfo, hdrLibrary) { fSum.WriteLine("" + hdrLibrary + ""); fSum.WriteLine(""); // save header row fSum.WriteLine(""); fSum.WriteLine( ""); fSum.WriteLine( ""); fSum.WriteLine( ""); fSum.WriteLine(""); // save library header if (libInfo.errorsCnt == "0") fSum.WriteLine(""); else fSum.WriteLine(""); fSum.WriteLine( ""); fSum.Write(""); fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine("
LibraryState\ Warnings
" + "" + libInfo.name + ""); if (libInfo.errorsCnt == "0") fSum.Write("OK"); else fSum.Write("Failed"); fSum.WriteLine("" + libInfo.warningsCnt + "
"); fSum.WriteLine("
"); } function saveSummaryHeaderTestDriver(fSum, rwtestInfo, hdrDriver) { fSum.WriteLine("" + hdrDriver + ""); fSum.WriteLine(""); // save header row fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine( ""); fSum.WriteLine( ""); fSum.WriteLine(""); // save test driver header if (rwtestInfo.errorsCnt == "0") fSum.WriteLine(""); else fSum.WriteLine(""); fSum.WriteLine( ""); fSum.Write( ""); fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine("
\ Test DriverState\ Warnings
" + "" + rwtestInfo.name + ""); if (rwtestInfo.errorsCnt == "0") fSum.Write("OK"); else fSum.Write("Failed"); fSum.WriteLine("" + rwtestInfo.warningsCnt + "
"); fSum.WriteLine("
"); } function saveSummaryHeaderMulti(fSum, exsDir, buildType, hdrExamples) { fSum.WriteLine("" + hdrExamples + ""); fSum.WriteLine(""); // save header row fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine(""); fSum.WriteLine(""); 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("
ExampleState\ ComparisionWarnings
"); 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(); }