xml2: Added experimental --xml2 result format. Ticket: #2106
This commit is contained in:
parent
b4be71aa4e
commit
12c8eeff2c
|
@ -142,6 +142,12 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
|
||||||
else if (strcmp(argv[i], "--xml") == 0)
|
else if (strcmp(argv[i], "--xml") == 0)
|
||||||
_settings->_xml = true;
|
_settings->_xml = true;
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
// Experimental: Write results in xml2 format
|
||||||
|
else if (strcmp(argv[i], "--xml2") == 0)
|
||||||
|
_settings->_xml2 = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Only print something when there are errors
|
// Only print something when there are errors
|
||||||
else if (strcmp(argv[i], "-q") == 0 || strcmp(argv[i], "--quiet") == 0)
|
else if (strcmp(argv[i], "-q") == 0 || strcmp(argv[i], "--quiet") == 0)
|
||||||
_settings->_errorsOnly = true;
|
_settings->_errorsOnly = true;
|
||||||
|
|
|
@ -95,7 +95,11 @@ int CppCheckExecutor::check(int argc, const char* const argv[])
|
||||||
_settings = cppCheck.settings();
|
_settings = cppCheck.settings();
|
||||||
if (_settings._xml)
|
if (_settings._xml)
|
||||||
{
|
{
|
||||||
reportErr(ErrorLogger::ErrorMessage::getXMLHeader());
|
reportErr(ErrorLogger::ErrorMessage::getXMLHeader(""));
|
||||||
|
}
|
||||||
|
else if (_settings._xml2)
|
||||||
|
{
|
||||||
|
reportErr(ErrorLogger::ErrorMessage::getXMLHeader(" version=\"2\""));
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int returnValue = 0;
|
unsigned int returnValue = 0;
|
||||||
|
@ -117,7 +121,7 @@ int CppCheckExecutor::check(int argc, const char* const argv[])
|
||||||
returnValue = executor.check();
|
returnValue = executor.check();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_settings._xml)
|
if (_settings._xml || _settings._xml2)
|
||||||
{
|
{
|
||||||
reportErr(ErrorLogger::ErrorMessage::getXMLFooter());
|
reportErr(ErrorLogger::ErrorMessage::getXMLFooter());
|
||||||
}
|
}
|
||||||
|
@ -182,9 +186,9 @@ void CppCheckExecutor::reportStatus(unsigned int index, unsigned int max)
|
||||||
|
|
||||||
void CppCheckExecutor::reportErr(const ErrorLogger::ErrorMessage &msg)
|
void CppCheckExecutor::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||||
{
|
{
|
||||||
if (_settings._xml)
|
if (_settings._xml || _settings._xml2)
|
||||||
{
|
{
|
||||||
reportErr(msg.toXML(_settings._verbose));
|
reportErr(msg.toXML(_settings._verbose, _settings._xml2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -110,7 +110,7 @@ public:
|
||||||
*/
|
*/
|
||||||
static void reportError(const ErrorLogger::ErrorMessage &errmsg)
|
static void reportError(const ErrorLogger::ErrorMessage &errmsg)
|
||||||
{
|
{
|
||||||
std::cout << errmsg.toXML(true) << std::endl;
|
std::cout << errmsg.toXML(true, false) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -363,7 +363,7 @@ void CppCheck::reportStatus(unsigned int /*index*/, unsigned int /*max*/)
|
||||||
void CppCheck::getErrorMessages()
|
void CppCheck::getErrorMessages()
|
||||||
{
|
{
|
||||||
// call all "getErrorMessages" in all registered Check classes
|
// call all "getErrorMessages" in all registered Check classes
|
||||||
std::cout << ErrorLogger::ErrorMessage::getXMLHeader();
|
std::cout << ErrorLogger::ErrorMessage::getXMLHeader("");
|
||||||
for (std::list<Check *>::iterator it = Check::instances().begin(); it != Check::instances().end(); ++it)
|
for (std::list<Check *>::iterator it = Check::instances().begin(); it != Check::instances().end(); ++it)
|
||||||
{
|
{
|
||||||
(*it)->getErrorMessages();
|
(*it)->getErrorMessages();
|
||||||
|
|
|
@ -129,10 +129,10 @@ bool ErrorLogger::ErrorMessage::deserialize(const std::string &data)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::getXMLHeader()
|
std::string ErrorLogger::ErrorMessage::getXMLHeader(const std::string &ver)
|
||||||
{
|
{
|
||||||
return "<?xml version=\"1.0\"?>\n"
|
return "<?xml version=\"1.0\"?>\n"
|
||||||
"<results>";
|
"<results" + ver + ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::getXMLFooter()
|
std::string ErrorLogger::ErrorMessage::getXMLFooter()
|
||||||
|
@ -161,9 +161,12 @@ static std::string stringToXml(std::string s)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::toXML(bool verbose) const
|
std::string ErrorLogger::ErrorMessage::toXML(bool verbose, bool xml2) const
|
||||||
{
|
{
|
||||||
std::ostringstream xml;
|
std::ostringstream xml;
|
||||||
|
|
||||||
|
if (!xml2)
|
||||||
|
{
|
||||||
xml << "<error";
|
xml << "<error";
|
||||||
if (!_callStack.empty())
|
if (!_callStack.empty())
|
||||||
{
|
{
|
||||||
|
@ -174,6 +177,27 @@ std::string ErrorLogger::ErrorMessage::toXML(bool verbose) const
|
||||||
xml << " severity=\"" << (_severity == Severity::error ? "error" : "style") << "\"";
|
xml << " severity=\"" << (_severity == Severity::error ? "error" : "style") << "\"";
|
||||||
xml << " msg=\"" << stringToXml(verbose ? _verboseMessage : _shortMessage) << "\"";
|
xml << " msg=\"" << stringToXml(verbose ? _verboseMessage : _shortMessage) << "\"";
|
||||||
xml << "/>";
|
xml << "/>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xml << " <error";
|
||||||
|
xml << " id=\"" << _id << "\"";
|
||||||
|
xml << " severity=\"" << Severity::toString(_severity) << "\"";
|
||||||
|
xml << " msg=\"" << stringToXml(_shortMessage) << "\"";
|
||||||
|
xml << " verbose=\"" << stringToXml(_verboseMessage) << "\"";
|
||||||
|
xml << ">" << std::endl;
|
||||||
|
|
||||||
|
for (std::list<FileLocation>::const_reverse_iterator it = _callStack.rbegin(); it != _callStack.rend(); ++it)
|
||||||
|
{
|
||||||
|
xml << " <location";
|
||||||
|
xml << " file=\"" << stringToXml((*it).getfile()) << "\"";
|
||||||
|
xml << " line=\"" << (*it).line << "\"";
|
||||||
|
xml << "/>" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
xml << " </error>";
|
||||||
|
}
|
||||||
|
|
||||||
return xml.str();
|
return xml.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,10 +124,11 @@ public:
|
||||||
/**
|
/**
|
||||||
* Format the error message in XML format
|
* Format the error message in XML format
|
||||||
* @param verbose use verbose message
|
* @param verbose use verbose message
|
||||||
|
* @param xml2 use xml2 format
|
||||||
*/
|
*/
|
||||||
std::string toXML(bool verbose) const;
|
std::string toXML(bool verbose, bool xml2) const;
|
||||||
|
|
||||||
static std::string getXMLHeader();
|
static std::string getXMLHeader(const std::string &ver);
|
||||||
static std::string getXMLFooter();
|
static std::string getXMLFooter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2403,11 +2403,11 @@ void Preprocessor::getErrorMessages(std::ostream &ostr)
|
||||||
Severity::style,
|
Severity::style,
|
||||||
"Include file: \"\" not found.",
|
"Include file: \"\" not found.",
|
||||||
"missingInclude");
|
"missingInclude");
|
||||||
ostr << errmsg.toXML(false) << std::endl;
|
ostr << errmsg.toXML(false, false) << std::endl;
|
||||||
|
|
||||||
const ErrorLogger::ErrorMessage errmsg2(locationList,
|
const ErrorLogger::ErrorMessage errmsg2(locationList,
|
||||||
Severity::error,
|
Severity::error,
|
||||||
"#error ...",
|
"#error ...",
|
||||||
"preprocessorErrorDirective");
|
"preprocessorErrorDirective");
|
||||||
ostr << errmsg2.toXML(false) << std::endl;
|
ostr << errmsg2.toXML(false, false) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ Settings::Settings()
|
||||||
_verbose = false;
|
_verbose = false;
|
||||||
_force = false;
|
_force = false;
|
||||||
_xml = false;
|
_xml = false;
|
||||||
|
_xml2 = false;
|
||||||
_jobs = 1;
|
_jobs = 1;
|
||||||
_exitCode = 0;
|
_exitCode = 0;
|
||||||
_showtime = 0; // TODO: use enum
|
_showtime = 0; // TODO: use enum
|
||||||
|
|
|
@ -87,6 +87,9 @@ public:
|
||||||
/** @brief write xml results (--xml) */
|
/** @brief write xml results (--xml) */
|
||||||
bool _xml;
|
bool _xml;
|
||||||
|
|
||||||
|
/** @brief write xml2 results (--xml2) */
|
||||||
|
bool _xml2;
|
||||||
|
|
||||||
/** @brief How many processes/threads should do checking at the same
|
/** @brief How many processes/threads should do checking at the same
|
||||||
time. Default is 1. (-j N) */
|
time. Default is 1. (-j N) */
|
||||||
unsigned int _jobs;
|
unsigned int _jobs;
|
||||||
|
|
|
@ -389,7 +389,7 @@ private:
|
||||||
// Test the errorlogger..
|
// Test the errorlogger..
|
||||||
ErrorLogger::ErrorMessage errorMessage;
|
ErrorLogger::ErrorMessage errorMessage;
|
||||||
errorMessage.setmsg("ab<cd>ef");
|
errorMessage.setmsg("ab<cd>ef");
|
||||||
ASSERT_EQUALS("<error id=\"\" severity=\"style\" msg=\"ab<cd>ef\"/>", errorMessage.toXML(false));
|
ASSERT_EQUALS("<error id=\"\" severity=\"style\" msg=\"ab<cd>ef\"/>", errorMessage.toXML(false,false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ private:
|
||||||
loc.setfile("ab/cd/../ef.h");
|
loc.setfile("ab/cd/../ef.h");
|
||||||
errorMessage._callStack.push_back(loc);
|
errorMessage._callStack.push_back(loc);
|
||||||
const std::string fname(Path::toNativeSeparators("ab/ef.h"));
|
const std::string fname(Path::toNativeSeparators("ab/ef.h"));
|
||||||
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"0\" id=\"\" severity=\"style\" msg=\"\"/>", errorMessage.toXML(false));
|
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"0\" id=\"\" severity=\"style\" msg=\"\"/>", errorMessage.toXML(false,false));
|
||||||
ASSERT_EQUALS("[" + fname + ":0]: ", errorMessage.toString(false));
|
ASSERT_EQUALS("[" + fname + ":0]: ", errorMessage.toString(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,7 +415,7 @@ private:
|
||||||
errorMessage._severity = Severity::fromString("error");
|
errorMessage._severity = Severity::fromString("error");
|
||||||
errorMessage.setmsg("long testMessage");
|
errorMessage.setmsg("long testMessage");
|
||||||
const std::string fname(Path::toNativeSeparators("some/{file}file.cpp"));
|
const std::string fname(Path::toNativeSeparators("some/{file}file.cpp"));
|
||||||
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"10\" id=\"testId\" severity=\"error\" msg=\"long testMessage\"/>", errorMessage.toXML(false));
|
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"10\" id=\"testId\" severity=\"error\" msg=\"long testMessage\"/>", errorMessage.toXML(false,false));
|
||||||
ASSERT_EQUALS("[" + fname + ":10]: (error) long testMessage", errorMessage.toString(false));
|
ASSERT_EQUALS("[" + fname + ":10]: (error) long testMessage", errorMessage.toString(false));
|
||||||
ASSERT_EQUALS("testId-" + fname + ",error.10?{long testMessage}", errorMessage.toString(false, "{id}-{file},{severity}.{line}?{{message}}"));
|
ASSERT_EQUALS("testId-" + fname + ",error.10?{long testMessage}", errorMessage.toString(false, "{id}-{file},{severity}.{line}?{{message}}"));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue