| /* | |
| Copyright 2019 Alain Dargelas | |
| Licensed 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. | |
| */ | |
| /* | |
| * File: Report.cpp | |
| * Author: alain | |
| * | |
| * Created on April 10, 2017, 8:56 PM | |
| */ | |
| #include "../SourceCompile/SymbolTable.h" | |
| #include "ErrorContainer.h" | |
| #include "../CommandLine/CommandLineParser.hpp" | |
| #include "Report.h" | |
| #include <iostream> | |
| #include <fstream> | |
| #include <unistd.h> | |
| #include <iomanip> | |
| #include <regex> | |
| #include <mutex> | |
| using namespace SURELOG; | |
| Report::Report() {} | |
| Report::Report(const Report& orig) {} | |
| Report::~Report() {} | |
| class Result { | |
| public: | |
| std::string m_nbFatal; | |
| std::string m_nbError; | |
| std::string m_nbWarning; | |
| std::string m_nbNote; | |
| std::string m_nbInfo; | |
| }; | |
| bool parseReportFile(std::string logFile, Result& result) { | |
| bool ret = false; | |
| std::ifstream ifs(logFile.c_str()); | |
| if (!ifs.bad()) { | |
| std::string line; | |
| while (std::getline(ifs, line)) { | |
| if (ifs.bad()) break; | |
| if (line.find("[ FATAL] : ") != std::string::npos) { | |
| result.m_nbFatal = line.substr(12, line.size() - 11); | |
| } | |
| if (line.find("[ ERROR] : ") != std::string::npos) { | |
| result.m_nbError = line.substr(12, line.size() - 11); | |
| } | |
| if (line.find("[WARNING] : ") != std::string::npos) { | |
| result.m_nbWarning = line.substr(12, line.size() - 11); | |
| } | |
| if (line.find("[ NOTE] : ") != std::string::npos) { | |
| result.m_nbNote = line.substr(12, line.size() - 11); | |
| ret = true; | |
| } | |
| if (line.find("[ INFO] : ") != std::string::npos) { | |
| result.m_nbInfo = line.substr(12, line.size() - 11); | |
| ret = true; | |
| } | |
| } | |
| } | |
| ifs.close(); | |
| return ret; | |
| } | |
| std::pair<bool, bool> Report::makeDiffCompUnitReport(CommandLineParser* clp, | |
| SymbolTable* st) { | |
| // std::mutex m; | |
| // m.lock(); | |
| std::string odir = st->getSymbol(clp->getOutputDir()); | |
| std::string alldir = st->getSymbol(clp->getCompileAllDir()); | |
| std::string unitdir = st->getSymbol(clp->getCompileUnitDir()); | |
| std::string log = st->getSymbol(clp->getDefaultLogFileId()); | |
| std::string alllog = odir + alldir + log; | |
| std::string unitlog = odir + unitdir + log; | |
| bool readAll = false; | |
| bool readUnit = false; | |
| Result readAllResult; | |
| Result readUnitResult; | |
| while ((!readAll) || (!readUnit)) { | |
| usleep(1000); | |
| if (!readAll) { | |
| readAll = parseReportFile(alllog, readAllResult); | |
| } | |
| if (!readUnit) { | |
| readUnit = parseReportFile(unitlog, readUnitResult); | |
| } | |
| } | |
| clp->printBanner(); | |
| std::cout << "|-------|------------------|-------------------|" << std::endl; | |
| std::cout << "| | FILE UNIT COMP | ALL COMPILATION |" << std::endl; | |
| std::cout << "|-------|------------------|-------------------|" << std::endl; | |
| std::cout << "| FATAL | " << std::setw(9) << readUnitResult.m_nbFatal | |
| << " | " << std::setw(9) << readAllResult.m_nbFatal | |
| << " |" << std::endl; | |
| std::cout << "| ERROR | " << std::setw(9) << readUnitResult.m_nbError | |
| << " | " << std::setw(9) << readAllResult.m_nbError | |
| << " |" << std::endl; | |
| std::cout << "|WARNING| " << std::setw(9) << readUnitResult.m_nbWarning | |
| << " | " << std::setw(9) << readAllResult.m_nbWarning | |
| << " |" << std::endl; | |
| std::cout << "| INFO | " << std::setw(9) << readUnitResult.m_nbInfo | |
| << " | " << std::setw(9) << readAllResult.m_nbInfo | |
| << " |" << std::endl; | |
| std::cout << "| NOTE | " << std::setw(9) << readUnitResult.m_nbNote | |
| << " | " << std::setw(9) << readAllResult.m_nbNote | |
| << " |" << std::endl; | |
| std::cout << "|-------|------------------|-------------------|" << std::endl; | |
| std::cout << std::endl; | |
| std::cout << "FILE UNIT LOG: " << unitlog << std::endl; | |
| std::cout << "ALL FILES LOG: " << alllog << std::endl; | |
| std::string diffFile = odir + unitdir + "diff.log"; | |
| std::string diffCmd = "diff -r " + odir + unitdir + " " + odir + alldir + | |
| " --exclude cache --brief > " + diffFile; | |
| int retval = system(diffCmd.c_str()); | |
| std::ifstream ifs(diffFile.c_str()); | |
| if (!ifs.bad()) { | |
| std::cout << "\nDIFFS:" << std::endl; | |
| std::string line; | |
| while (std::getline(ifs, line)) { | |
| if (line.find("diff.log") != std::string::npos) { | |
| continue; | |
| } | |
| if (line.find(log.c_str()) != std::string::npos) { | |
| continue; | |
| } | |
| line = std::regex_replace(line, std::regex("Files "), ""); | |
| line = std::regex_replace(line, std::regex("differ"), ""); | |
| std::cout << line << std::endl; | |
| } | |
| } | |
| clp->printFooter(); | |
| int nbFatal = atoi(readUnitResult.m_nbFatal.c_str()) + | |
| atoi(readAllResult.m_nbFatal.c_str()); | |
| // m.unlock(); | |
| return std::make_pair(retval != -1, !nbFatal); | |
| } |